AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte PListPatcher für die iOS-Entwicklung
Thema durchsuchen
Ansicht
Themen-Optionen

PListPatcher für die iOS-Entwicklung

Ein Thema von Union · begonnen am 11. Mär 2014 · letzter Beitrag vom 13. Mai 2015
 
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#1

PListPatcher für die iOS-Entwicklung

  Alt 11. Mär 2014, 17:22
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:
PlistPatcher.exe ".\$(Platform)\$(Config)\$(ProjectName).info.plist" "$(ProjectDir)\include.plist"
Hat man eine vom Standard abweichende Build-Ausgabe muß das natürlich angepasst werden.

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:
<?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>
Hier der Code zum Tool. Viel Spaß!
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.
Angehängte Dateien
Dateityp: zip PlistPatcher.zip (170,4 KB, 14x aufgerufen)
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union (12. Mai 2015 um 14:00 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 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