![]() |
PListPatcher für die iOS-Entwicklung
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn man für seine mit Firemonkey für iOS entwickelten Apps zusätzliche Einstellungen benötigt, musste man bisher die durch die IDE erstellte plist anpassen und im Bereitstellungmanager als separaten Eintrag hinzufügen. Und dies natürlich jedes Mal wiederholen, wenn man im Projekt Einstellungen geändert hat, die sich ebenfalls in der plist niederschlagen sollen (Icons, Versionsnummer usw.).
Um das zu vereinfachen, habe ich diesen PlistPatcher erstellt. Sehr primitiv aber funktioniert. Er muß in den Post-Build-Einstellungen in der IDE eingebunden werden, z.b.:
Code:
Hat man eine vom Standard abweichende Build-Ausgabe muß das natürlich angepasst werden.
PlistPatcher.exe ".\$(Platform)\$(Config)\$(ProjectName).info.plist" "$(ProjectDir)\include.plist"
Dabei darauf achten, dass die Build-Konfigurationen für iOS-Gerät und Simulator bearbeitet werden - es sei denn dort wären Unterschiede gewünscht. Der Aufruf erfolgt mit dem Namen der von der IDE erstellten plist-Datei sowie einer weiteren, die nur die hinzuzufügenden Fragmente enthält. Optional kann man noch einen driten Parameter für die Ausgabedatei angeben. Fehlt der, wird in die Eingabedatei zurückgeschrieben. Beispiel eines Fragments um beim iOS-Ladevorgang bereits die Statuszeile auszuschalten:
Code:
Hier der Code zum Tool. Viel Spaß!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>UIStatusBarHidden</key> <true/> </dict> </plist>
Delphi-Quellcode:
program PlistPatcher;
{$APPTYPE CONSOLE} {$WEAKLINKRTTI ON} uses Sysutils, Winapi.Windows, PlistFuncs in 'PlistFuncs.pas'; {$R *.res} begin if ParamCount < 2 then begin writeln('Usage : PlistPatcher <PlistFile|PlistOutput> <PlistFragment> [<PlistOutput>]'); ExitCode := ERROR_INVALID_PARAMETER; end else try ExitCode := MergePlist(Paramstr(1), Paramstr(2), Paramstr(3)); except on e : exception do begin write(e.Message); ExitCode := 1; if e is EOSError then begin ExitCode := EOSError(e).ErrorCode; writeln(' (' +ExitCode.ToString + ')'); end; end; end; end.
Delphi-Quellcode:
unit PlistFuncs;
interface function MergePlist(const AFile, AFragment : string; AOutFile : string = '') : integer; implementation uses Sysutils, IOUtils, Winapi.Windows; // Fügt in die Eingabedatei den Inhalt der Fragmentdatei ein. function MergePlist(const AFile, AFragment : string; AOutFile : string = '') : integer; const DictStart = '<dict>'; DictEnd = '</dict>'; var LFile, LFragment : string; LInsertPos : integer; LStartPos : integer; LEndPos : integer; begin Result := ERROR_INVALID_PARAMETER; // Diese beiden lösen ggf. Exceptions aus, macht nix LFile := TFile.ReadAllText(AFile); LFragment := TFile.ReadAllText(AFragment); // Position an der eingefügt wird LInsertPos := Pos(DictEnd, LFile); // Startposition des einzufügenden Blocks LStartPos := Pos(DictStart, LFragment); // Endposition des einzufügenden Blocks LEndPos := Pos(DictEnd, LFragment); // Nur durchführen wenn auch etwas eingefügt werden kann if (LInsertPos > 0) and (LStartPos > 0) and (LEndPos > 0) and (LEndPos > LStartPos) then begin // In die ursprüngliche plist den Inhalt der zweiten plist einfügen LFile := Copy(LFile, 1, LInsertPos-1) + Copy(LFragment, LStartPos + length(DictStart) + 1, LEndPos-LStartPos-length(DictEnd))+ Copy(LFile, LInsertPos, Length(LFile) - LInsertPos); // Wenn keine Ausgabedatei angegeben wurde, in Eingabedatei zurückschreiben if AOutFile = '' then AOutFile := AFile; TFile.WriteAllText(AOutFile, LFile); Result := NO_ERROR; end; end; end. |
AW: PListPatcher für die iOS-Entwicklung
Es gibt eine alternative um einen Schlüssel/Wert in die Info.plist hinzuzufügen, dieser ist ziemlich versteckt hier beschrieben
![]() Hier mal die Schnellfassung Menu -> Projekt -> Optionen… Dann befindet man sich in den Projektoptionen und wählt die Seite „Versionsinformationen“ auf -> mit der rechten Maustaste klickt man in die Schlüssel/Werte –Liste, was wiederum ein Popupmenu, mit den Einträge Schlüssel hinzufügen/entfernen öffnet. Diese Option ermöglicht aber nicht das hin zufügen von Array/Feldwerte, das müsste man dann doch wieder hinten rum lösen. Ich konnte zwar den Schlüssel „UIStatusBarHidden“ mit dem „true“ hinzufügen und er befindet sich auch in der info.plist doch hat er keinen Effekt, zumindest nicht unter XE8 und iPad mit iOS 8.1.2 . |
AW: PListPatcher für die iOS-Entwicklung
Das liegt ganz einfach daran, dass der Eintrag wie folgt in die PLIST wandert
XML-Code:
und so müsste er sein, damit es auch die erwünschte Auswirkung hat:
<key>UIStatusBarHidden</key>
<string>true</string> <key>UIViewControllerBasedStatusBarAppearance</key> <string>false</string>
XML-Code:
<key>UIStatusBarHidden</key>
<true/> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> |
AW: PListPatcher für die iOS-Entwicklung
Deshalb habe ich das Tool ja gemacht, weil die IDE den falschen XML-Typen verwendet.
|
AW: PListPatcher für die iOS-Entwicklung
Zitat:
Um die StatusBar auszublenden muss man einfach den
Delphi-Quellcode:
der Form auf
BorderStyle
Delphi-Quellcode:
setzen.
TFmxFormBorderStyle.None
Allerdings gibt es auf dem iOS-Simulator beim Umschalten gerne auch mal eine Zugriffsverletzung oder die App stürzt einfach ins Nirwana ... |
AW: PListPatcher für die iOS-Entwicklung
@Union und @Sir Rufo
Ich hab es hinbekommen das iOS Launch Image ohne iOS-Statusbar-Einblendung, ich musste aber den PlistPatcher leicht modifizieren, damit er mit XE8 unter Windows 7 funktioniert. Die iOS Statusbar zur Laufzeit aus und wieder einzublenden funktioniert unter XE7 mit Sephen Ball’s Beispiel ![]() |
AW: PListPatcher für die iOS-Entwicklung
Also unter XE8 stelle ich in der MainForm einfach den
Delphi-Quellcode:
auf
BorderStyle
Delphi-Quellcode:
und die StatusBar ist weg.
None
Nix PList-Patch, noch sonst irgendwas -> einfach eine einfache Einstellung, fertig. Und wenn man sich die Mühe macht, den Code zu dem FullScreenService anzuschauen, was finden wir da? - Genau, da wird einfach der Border-Style gesetzt :roll: |
AW: PListPatcher für die iOS-Entwicklung
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab meine Anpassungen (quick and dirty) zusammen mit Thread Beispiel versehen, außerdem noch ein kleines Howto.txt dazugepackt alles in eine zip-Datei gesteckt. Den Exe-name musste ich ändert, damit die Windows UAC nicht dazwischen funkt.
|
AW: PListPatcher für die iOS-Entwicklung
Schön gemacht, das mit dem RPos fängt jetzt auch Fälle mit verschachtelten <dict>. :thumb:
|
AW: PListPatcher für die iOS-Entwicklung
Zitat:
Den iOS Full-Screen-Bug hab ich auch mal gemeldet - ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz