Mit Xcode 6 können wir eigene Dynamics erstellen Cocoa Frameworks
.
Wegen:
Der Simulator verwendet weiterhin die
32-bit
Bibliothek-
Ab dem 1. Juni 2015 müssen App-Updates, die an den App Store gesendet werden, 64-Bit-Unterstützung enthalten und mit dem iOS 8 SDK ( developer.apple.com ) erstellt werden.
Wir müssen eine Fettbibliothek erstellen, um Projekte auf Geräten und Simulatoren ausführen zu können. dh unterstützt sowohl 32 als auch 64 Bit in Frameworks.
Aber ich habe keine Handbücher gefunden, wie man das universelle Fat Framework für die zukünftige Integration mit anderen Projekten exportiert (und diese Bibliothek mit jemandem teilt).
Hier sind meine Schritte zum Reproduzieren:
Stellen Sie
ONLY_ACTIVE_ARCH=NO
in derBuild Settings
Fügen Sie Unterstützung
armv7 armv7s arm64 i386 x86_64
zuArchitectures
(sicher)
- Erstellen Sie das Framework und öffnen Sie es im Finder:
- Fügen Sie dieses Framework einem anderen Projekt hinzu
Tatsächliche Ergebnis:
Aber am Ende habe ich immer noch Probleme, ein Projekt mit diesem Framework auf Geräten und Simulatoren gleichzeitig auszuführen.
Wenn ich das Framework aus dem
Debug-iphoneos
Ordner nehme , funktioniert es auf Geräten und wird auf Simulatoren als Fehler angezeigt:ld: symbol(s) not found for architecture i386
xcrun lipo -info CoreActionSheetPicker
Architekturen in der Fat-Datei: CoreActionSheetPicker sind: armv7 armv7s arm64
Wenn ich Framework aus
Debug-iphonesimulator
Ordner nehme , funktioniert es auf Simulatoren. und ich habe Fehler auf dem Gerät:ld: symbol(s) not found for architecture arm64
xcrun lipo -info CoreActionSheetPicker
Architekturen in der Fat-Datei: CoreActionSheetPicker sind: i386 x86_64
Wie erstelle ich ein dynamisches Framework, das auf Geräten und Simulatoren funktioniert?
Diese Antwort bezog sich auf Xcode 6 iOS. Erstellen eines Cocoa Touch Framework - Architekturprobleme, aber keine Duplikate.
Aktualisieren:
Ich habe einen "Dirty Hack" für diesen Fall gefunden. Siehe meine Antwort unten . Wenn jemand einen bequemeren Weg kennt - bitte lassen Sie es mich wissen!
quelle
Antworten:
Die Aktualität dieser Antwort lautet: Juli 2015. Es ist sehr wahrscheinlich, dass sich die Dinge ändern werden.
TLDR;
Derzeit verfügt Xcode nicht über Tools für den automatischen Export des universellen Fat Frameworks, sodass Entwickler auf die manuelle Verwendung des
lipo
Tools zurückgreifen müssen . Laut diesem Radar muss vor der Übermittlung an den AppStore-Entwickler, der der Verbraucher des Frameworks ist, auchlipo
Simulator-Slices von einem Framework entfernt werden.Eine längere Antwort folgt
Ich habe ähnliche Nachforschungen zu diesem Thema angestellt (der Link am Ende der Antwort).
Ich hatte keine offizielle Dokumentation über Verteilung der so meine Forschung gefunden auf die Exploration von Apple Developer Forums basiert, Karthago und Realm Projekte und meine eigenen Experimente mit
xcodebuild
,lipo
,codesign
Werkzeuge.Hier ist ein langes Zitat (mit ein bisschen Markup von mir) aus dem Apple Developer Forums-Thread. Exportieren einer App mit eingebettetem Framework :
Dies beschreibt den Prozess ziemlich genau so, wie es @skywinder in seiner Antwort getan hat.
So verwendet Karthago Lipo und Realm Lipo .
WICHTIGES DETAIL
Es gibt Radar: Xcode 6.1.1 & 6.2: iOS-Frameworks, die Simulator-Slices enthalten, können nicht an den App Store gesendet werden. Eine lange Diskussion darüber in Realm Nr. 1163 und Karthago Nr. 188 endete mit einer speziellen Problemumgehung:
Vor der Übermittlung an AppStore müssen iOS-Framework-Binärdateien von den Simulator-Slices entfernt werden
Karthago hat einen speziellen Code: CopyFrameworks und die entsprechende Dokumentation:
Realm hat ein spezielles Skript: strip-frameworks.sh und eine entsprechende Dokumentation:
Es gibt auch einen guten Artikel: Entfernen unerwünschter Architekturen aus dynamischen Bibliotheken in Xcode .
Ich selbst habe Realm's verwendet,
strip-frameworks.sh
die ohne Änderungen perfekt für mich funktionierten, obwohl natürlich jeder frei ist, eine von Grund auf neu zu schreiben.Der Link zu meinem Thema, den ich zum Lesen empfehle, da er einen weiteren Aspekt dieser Frage enthält: Codesignatur - Erstellen von iOS / OSX-Frameworks: Ist es erforderlich, sie vor der Verteilung an andere Entwickler zu codieren?
quelle
Dies ist keine so klare Lösung, aber es gibt nur einen Weg, den ich finde:
Stellen Sie
ONLY_ACTIVE_ARCH=NO
in derBuild Settings
Öffnen Sie den Konsolenordner
Products
für Ihr Framework (Sie können ihn öffnen, indem Sie den Framework-Ordner öffnen undcd ..
von dort aus).Products
Ordner aus. Es erstellt Fat Framework in diesem Ordner. (oder machen Sie es manuell, wie unten in 3. 4. erklärt )Oder:
Kombinieren Sie diese beiden Frameworks mithilfe von Lipo mit diesem Skript (ersetzen Sie sie
YourFrameworkName
durch Ihren Framework-Namen).Ersetzen Sie eines der vorhandenen Frameworks durch ein neues binäres Framework:
./YourFrameworkName.framework
- ist gebrauchsfertige Fat Binary! Sie können es in Ihr Projekt importieren!Für Projekte, die nicht in Arbeitsbereichen enthalten sind:
Sie können auch versuchen, dieses Wesentliche wie hier beschrieben zu verwenden . Es scheint jedoch nicht für Projekte in Arbeitsbereichen zu funktionieren.
quelle
Debug-
Ordner mit verwendet wirdlipo -create
? Könnte dieses Framework für dieRelease
Konfiguration verwendet werden und warum? Vielen Dank.Die Antwort von @Stainlav war sehr hilfreich, aber ich habe stattdessen zwei Versionen des Frameworks kompiliert (eine für das Gerät und eine für den Simulator) und dann Folgendes hinzugefügt, um das
Run Script Phase
für die laufende Architektur erforderliche vorkompilierte Framework automatisch zu kopierenAuf diese Weise kann ich
lipo
weder ein fettes Framework erstellen, noch die Realmsstrip-frameworks.sh
, um die unnötigen Slices zu entfernen, wenn ich sie an den App Store sende.quelle
${SRCROOT}/Frameworks/Active
Ordner. Sie werden zur Kompilierungszeit durch die richtigen vorkompilierten Frameworks für die aktive Architektur ersetzt.lipo
Ansatz des Kombinierens und Zerreißens .Grundsätzlich habe ich dafür eine sehr gute Lösung gefunden. Sie müssen nur diese einfachen Schritte befolgen.
und das ist es. Hier führen wir die Simulator- und Geräteversion der MyFramework-Binärdatei in MyFramework.framework zusammen. Wir erhalten ein universelles Framework, das für alle Architekturen einschließlich Simulator und Gerät erstellt wird.
quelle
Ich möchte nur diese großartige Antwort von @odm aktualisieren. Seit Xcode 10
CURRENT_ARCH
spiegelt die Variable die Build-Architektur nicht mehr wider. Also habe ich das Skript geändert, um stattdessen die Plattform zu überprüfen:Ich habe auch eine Zeile hinzugefügt, um das Zielverzeichnis vor dem Kopieren zu löschen, da ich festgestellt habe, dass zusätzliche Dateien in Unterverzeichnissen sonst nicht überschrieben würden.
quelle
Meine Antwort deckt die folgenden Punkte ab:
Erstellen Sie ein Framework, das sowohl für den Simulator als auch für das Gerät funktioniert
Wie exportiere ich "fettes" Cocoa Touch Framework (sowohl für Simulator als auch für Gerät)?
Undefinierte Symbole für die Architektur x86_64
ld: Symbol (e) für Architektur x86_64 nicht gefunden
Schritte 1: Erstellen Sie zuerst Ihre Frameworks mit dem Simulator-Ziel
Schritte 2: Nach erfolgreichem Simulator-Erstellungsprozess erstellen Sie jetzt für Ihr Framework mit Gerätezielauswahl oder generischer iOS-Geräteauswahl
Schritt 3: Wählen Sie nun Ihr Framework-Ziel aus und wählen Sie dazu unter "Build Phases" "Add Run Script" aus und kopieren Sie den folgenden Skriptcode.
Schritt 4: Jetzt endlich wieder erstellen und Ihr Framework ist sowohl für die Simulator- als auch für die Gerätekompatibilität bereit. Hurra!!!!
[Hinweis: Wir müssen beide kompatiblen Frameworks vor dem letzten Schritt 4 bereit haben (Simulator- und Gerätearchitektur kompatibel, wenn nicht, befolgen Sie bitte die obigen Schritte 1 und 2 korrekt).
Siehe das Referenzbild:
Fügen Sie den folgenden Code in den Shell-Bereich ein:
quelle