Erläuterungen zu iOS Static vs Dynamic Frameworks

115

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?
csotiriou
quelle
1
"iOS 7 unterstützt keine .framework-Bibliotheken, da es keine dynamische Verknüpfung unterstützt." Diese Aussage ist nicht korrekt.
Midhun MP
1
Aha. Kannst du mir den richtigen Satz sagen? Ist es falsch, weil iOS 7 dynamische Verknüpfungen unterstützt oder weil iOS 7 .framework-Bibliotheken unterstützt? Oder beides?
Csotiriou
1
Remeber AVFoundation und CoreGraphics sind alle .framework. Wahrscheinlich hilft Ihnen dies, die Antworten auf alle Ihre Fragen zu finden: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP
Ich habe den Satz korrigiert. Ich habe den Link bereits gelesen, bevor ich meine Fragen gestellt habe. Dieser Link erklärt nichts zu meinen Fragen. Es startet von einer statischen Bibliothek und verpackt sie MANUELL in eine .framework-Datei. Ich spreche von einem Cocoa Touch Framework-Ziel in Xcode 6 und dem Ändern des Typs in eine statische Bibliothek. Es wird keine
Codesignatur
1
Sie können CocoaPods verwenden, um ein proprietäres Framework (z. B. Parse) zu verteilen
Ric Santos

Antworten:

69

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

Subbu
quelle
16

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 typeEinstellungen für das Framework des Ziels ändern . Diese Technik ist auch auf Hybrid Frameworks (Frameworks mit Swift- und Objective-C-Code) anwendbar.

Avijeet Dutta
quelle
Toller Tipp. Ich weiß nicht, warum diese Antwort nicht bewertet wurde, da sie mir geholfen hat. \ Target'Build Settings \ Mach-O-Type und wählen Sie Static Framework.
Rusty Magnet
3
Abi-Kompatibilität ist nicht verfügbar in schnellen 4
csotiriou
7

staticoder dynamicim Namen zeigt normalerweise auf einen Linking[Über] Typ

Frameworks können staticoder dynamic[Statisch oder Dynamisch prüfen] sein

Sie können das Format der Bibliothek ändern, das sich auf a auswirkt, Linkerindem Sie Framework target -> Build Settings -> Mach-O Type[Info] in Static Libraryoder ändern Dynamic Library. Standardmäßig hat Xcode einen Dynamic LibraryWert.

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 der static libraryin 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]

yoAlex5
quelle
6

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

AliasCocoa
quelle
Sie können eine statische Bibliothek in ein schnelles Projekt
importieren
5

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.

Beau Nouvelle
quelle