Benutzerdefiniertes Cordova-Plugin: Framework zu "Embedded Binaries" hinzufügen

7

Wie kann ich in einem benutzerdefinierten Cordova-Plugin eine spezifische .framework-Datei in plugin.xml so konfigurieren, dass sie zum Abschnitt "Embedded Binaries" in Xcode hinzugefügt wird? Wenn das momentan nicht direkt in plugin.xml möglich ist, bin ich offen für alternative Vorschläge.

    
Alon Amir 15.04.2016, 14:56
quelle

4 Antworten

25

Ich habe eine Problemumgehung implementiert, bis sie von Cordovas plugin.xml unterstützt wird, hoffentlich in der Zukunft, sobald eine embed Eigenschaft in solchen Einträgen denselben Effekt hat: <framework embed="true" src="..." /> , Vorläufig hilft diese Eigenschaft nicht, daher die folgende Problemumgehung.

Die folgende Lösung funktionierte mit Cordova Version 5.3.3.

Stellen Sie zuerst sicher, dass Sie den Framework-Eintrag zu plugin.xml hinzufügen:

%Vor%

embed="true" funktioniert momentan nicht, aber füge es trotzdem hinzu.

Wir erstellen einen Hook, deklarieren Sie das in Ihrer plugin.xml:

%Vor%

Als nächstes gibt es ein bestimmtes Node-Modul, das wir in unserem Hook-Code benötigen. Dieses Modul ist node-xcode .

Installieren Sie node-xcode (Version 0.8.7 oder höher):

%Vor%

Schließlich der Code für den Haken selbst -

addEmbedded.js-Datei:

%Vor%

Was dieser Haken tatsächlich macht:

  1. Erstellt eine "Build Phase", die nach Ihrer Plug-in-ID benannt ist und die auf "Copy Files" konfiguriert ist. Das Ziel dieser Kopie ist "Frameworks".
  2. Sucht und fügt Ihre .framework-Dateien zur obigen Build-Phase hinzu und fügt sie ein.
  3. Setzt eine Xcode-Build-Eigenschaft mit dem Namen LD_RUNPATH_SEARCH_PATHS , um nach eingebetteten Frameworks in "@executable_path/Frameworks" zu suchen (Dies ist der Fall, wenn das eingebettete Framework nach der "Copy Files" - & gt; "Frameworks" -Bauphase kopiert wird
  4. Konfiguriert den ATTRIBUTES-Schlüssel, indem Sie "CodeSignOnCopy" und "RemoveHeadersOnCopy" für Ihre .framework-Dateien festlegen.
  5. Entfernt Ihre .framework-Dateien aus dem FrameworksBuildPhase und fügt sie dem FrameworksBuildPhase als neue separate PBXBuildFiles (Same PBXFileReference) wieder hinzu. Dies muss geschehen, damit "CodeSignOnCopy" irgendetwas bedeutet, ohne es zu entfernen Öffnen Sie das Projekt mit Xcode, Sie werden kein Häkchen in der Erstellungsphase finden, die besagt, dass es signiert wird.

Aktualisiert 1: Hook Code, Änderungen:

  1. Der Hook findet Ihre .framework-Dateien automatisch, Sie müssen den Hook nicht bearbeiten.
  2. Eine wichtige Änderung wurde hinzugefügt, indem Sie ATTRIBUTES "CodeSignOnCopy" und "RemoveHeadersOnCopy" für Ihre .framework-Dateien festlegen.
  3. Der Hook wurde verbessert, damit er in einem solchen Fall funktioniert, in dem mehrere Plugins diesen Hook verwenden.

Update 2

  1. Da meine Pull-Anforderung akzeptiert wurde, ist es nicht länger erforderlich, meine eigene Verzweigung zu installieren.
  2. Verbesserter Hook-Code.

Update 3 (19/09/2016)

Geändert Hook-Skript nach Max Whaler Vorschlag, wie ich das gleiche Problem über Xcode 8 erfahren.

Letzter Hinweis

Sobald Sie Ihre App in den AppStore hochgeladen haben, versuchen Sie das folgende Cordova-Plugin (nur Hook, kein systemeigener Code), wenn die Validierung aufgrund nicht unterstützter Architekturen fehlschlägt (i386, etc ...): zcordova-plugin-architrim

    
Alon Amir 19.04.2016, 15:59
quelle
5

Um mein Plugin mit einem Projekt auf XCode 8.0 und cordova-ios 4.2 zu erstellen, musste ich den Hook in der Phase after_build ausführen. Stellen Sie außerdem sicher, dass die Knotenumgebung die letzte Version von xcode-node (^ 0.8.9) verwendet oder Sie Fehler in der Phase der Kopierdateien erhalten.

<framework src="lib/myCustom.framework" custom="true" embed="true" /> <hook type="after_build" src="hooks/add_embedded.js" />

Die Datei plugin.xml benötigt custom="true" für Cordova, um die Framework-Datei zu kopieren, was zu Konflikten mit den Änderungen führte, die an der .pbxproj-Datei vorgenommen wurden, wenn dieser Hook nach_platform add oder sogar nach_prepare ausgeführt wurde.

    
Ryan R Sundberg 26.10.2016 06:52
quelle
3

embed="true" wird ab cordova-ios 4.4.0 und cordova 7.0.0, das heute veröffentlicht wurde, unterstützt. Ссылка Ссылка

    
grantpatterson 04.05.2017 00:17
quelle
1

@Alon Amir, danke fürs Teilen, es funktioniert wunderbar! Meine App lief zwar einwandfrei im Debug, aber nicht im Release-Modus. Ich fand heraus, dass der LD_RUNPATH_SEARCH_PATHS nur als Debug-Modus als proj.getBuildProperty hinzugefügt wurde, ohne dass ein Build-Parameter das erste Ergebnis nimmt. Ich habe Ihren Code ein wenig modifiziert, so dass er sowohl im Debug- als auch im Release-Modus funktioniert:

%Vor%     
Max Wahler 20.05.2016 15:56
quelle

Tags und Links