Ich muss zugeben, dass ich mit der Veröffentlichung von iOS 8 etwas verwirrt bin über dynamische und statische Frameworks in iOS.
Ich suche nach einer Möglichkeit, eine von mir erstellte Bibliothek zu verteilen, und ich muss iOS 7 und höher unterstützen. (Hinweis: Dies ist ein proprietäres Framework. Ich kann keine Kakaofrüchte verwenden und die Quelle auch nicht verteilen.) Folgendes weiß ich bereits:
- iOS 8 führte "eingebettete Frameworks" für iOS ein, aber meines Wissens funktionieren sie nicht für iOS 7, sondern nur für iOS 8 und höher.
- Ich habe die Möglichkeit, meine Bibliothek als statische Bibliothek (.a-Datei) zu verteilen und auch die Header zu verteilen. Ich weiß, dass dies eine übliche Art ist, mit der Situation umzugehen, aber ich würde gerne etwas Einfacheres finden (und wenn möglich auch einige Ressourcen damit bündeln).
- Ich habe auch festgestellt, dass iOS 7 keine dynamischen .framework-Bibliotheken (nur statisch) unterstützt, da es keine dynamische Verknüpfung unterstützt. Aber iOS 8 tut dies ebenso wie statische Verknüpfungen.
Und hier sind meine Fragen zu diesen Informationen:
- Ich habe gesehen, dass ich ein .framework-Ziel erstellen und statisch machen kann, indem ich den Mach-O-Typ in "statische Bibliothek" ändere. Wäre das ausreichend, um iOS 7 ohne Probleme zu unterstützen und meine Bibliothek auch als zu verteilen Wenn ja, warum sind "eingebettete Frameworks" in iOS 8 so wichtig, da viele Ressourcen im Internet dies vorschlagen? Vermisse ich etwas?
- Ist es notwendig, das .framework wie bei jeder anderen von mir erstellten Anwendung zu codieren?
- Was ist, wenn ich andere Ressourcen (wie Kerndaten oder Bilder) in meine .framework-Datei aufnehmen muss? Muss ich dafür eine separate .bundle-Datei erstellen?
Antworten:
Vor iOS8 erlaubte Xcode nur die Erstellung statischer Bibliotheken für iOS. Das häufigste Problem dabei war, dass wir die Binärdatei und die Header getrennt versenden mussten.
Später kamen einige Entwickler auf die Idee, "statische Frameworks" zu erstellen. [Das .framework ist nur ein Ordner mit symbolischen Links zur Bibliothek und den Headern]. Ein solches Beispiel ist https://github.com/jverkoey/iOS-Framework
Diese Option funktioniert für iOS 7 oder 8 oder früher. Weil es sich nur um statische Bibliotheken handelt, mit denen die Header-Dateien bequem gebündelt werden können.
Was Ihre Fragen zu den Ressourcen betrifft, müssten wir sie in '.bundle' bündeln. Für den Versand bin ich mir nicht sicher, ob wir sie in den .framework-Ordner aufnehmen können. In der Vergangenheit habe ich meine Bibliotheken als versendet ein statisches Framework und Bündel ...
Die obige Option funktioniert jedoch nicht für Sie, wenn Sie Swift verwenden. Xcode unterstützt nicht das Erstellen statischer Bibliotheken, die schnellen Code enthalten.
Sie müssen sich für dynamische Frameworks entscheiden, wenn eine schnelle Verwendung erfolgt. Theoretisch funktionieren dynamische Frameworks in iOS7. Ich denke jedoch, dass iTunes Connect ablehnen wird, wenn die App auf iOS7 abzielt und dynamische Frameworks verwendet :-).
Hoffe das hilft
quelle
Ab Xcode 9 können Sie auch statische Frameworks für Swift erstellen. Dies ist aufgrund der ABI-Quellkompatibilität möglich. Sie müssen lediglich die
Mach-O type
Einstellungen für das Framework des Ziels ändern . Diese Technik ist auch auf Hybrid Frameworks (Frameworks mit Swift- und Objective-C-Code) anwendbar.quelle
static
oderdynamic
im Namen zeigt normalerweise auf einenLinking
[Über] TypFrameworks können
static
oderdynamic
[Statisch oder Dynamisch prüfen] seinSie können das Format der Bibliothek ändern, das sich auf a auswirkt,
Linker
indem SieFramework target -> Build Settings -> Mach-O Type
[Info] inStatic Library
oder ändernDynamic Library
. Standardmäßig hat Xcode einenDynamic Library
Wert.Abhängig von dieser Einstellung werden verschiedene Arten von Binärdateien generiert
Nachdem Sie einen Consumer erfolgreich konfiguriert haben [Link vs Embed]
Static Linker
ld : Zum Zeitpunkt der Kompilierung wird der gesamte Code aus derstatic library
in die ausführbare Objektdatei aufgenommen.Dynamic Linker
dyld : Beim Laden / Ausführen wird versucht, das eingebettete Framework mithilfe von@rpath
[Info] zu finden und zu verknüpfen[Wortschatz]
quelle
Swift funktioniert nicht in der statischen Bibliothek. Wenn Sie ein dynamisches Framework verwenden müssen, müssen Sie min iOS auf 8.0 setzen, da AppStore ios 7 mit dynamischem Framework ablehnt
quelle
Ich habe nicht alle Antworten, aber ich werde versuchen, einige Ihrer Fragen hier zu beantworten.
Sie erhalten eine Warnung für die Verwendung dieser Frameworks in iOS 7, aber das ist alles, eine Warnung. Siehe diese Antwort .
Sie können andere Ressourcen wie CoreData einschließen, müssen diese jedoch manuell im Code erstellen. Hier ist ein Tutorial, das zeigt, wie ein Kerndatenmodell erstellt wird.
Sie müssen sign dynamische Bibliotheken für iOS codieren.
Sie müssen sicherstellen, dass Ihr Framework sowohl Simulator- als auch Gerätearchitekturen unterstützt, wenn Sie es verteilen möchten.
quelle