web-dev-qa-db-de.com

iOS Static vs Dynamic Frameworks Erläuterungen

Ich muss zugeben, dass ich mit der Veröffentlichung von iOS 8 ein bisschen 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 vertreiben.) Folgendes weiß ich bereits:

  • iOS 8 führte "eingebettete Frameworks" für iOS ein, aber soweit ich weiß, 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 ein gängiger Weg ist, um 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 dynamischen Verknüpfungen unterstützt. Aber iOS 8 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 .framework-Bundle? Wenn ja, warum sind "eingebettete Frameworks" in iOS 8 so wichtig, wie viele Ressourcen im Internet vermuten lassen? 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 Core Data oder Images) in meine .framework-Datei aufnehmen muss? Muss ich dafür eine separate .bundle-Datei erstellen?
106
csotiriou

Vor iOS8 hatte Xcode nur die Möglichkeit, statische Bibliotheken für iOS zu erstellen. Das gemeinsame 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 lib 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. Da es sich nur um statische Bibliotheken handelt, können die Header-Dateien bequem gebündelt werden.

Was Ihre Fragen zu den Ressourcen angeht, müssten wir sie in ".bundle" bündeln. Für den Versand bin ich nicht sicher, ob wir sie in den Ordner ".framework" einschließen können. In der Vergangenheit habe ich meine Bibliotheken als ".framework" versendet ein statisches Framework und Bundle ...

Die obige Option funktioniert jedoch nicht für Sie, wenn Sie Swift verwenden. Xcode unterstützt nicht das Erstellen statischer Bibliotheken, die Swift code enthalten.

Sie müssen sich für dynamische Frameworks entscheiden, wenn die Verwendung von Swift=================================================================== In der Theorie funktionieren dynamische Frameworks in iOS7. -).

Hoffe das hilft

66
Subbu

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 das Mach-O type unter Build-Einstellungen des Framework-Ziels. Diese Technik ist auch auf hybride Frameworks anwendbar (Frameworks mit Swift und Objective-C-Code).

15
Avijeet Dutta

Swift funktioniert nicht in der statischen Bibliothek. Wenn Sie dynamisches Framework verwenden müssen, müssen Sie iOS min auf 8.0 setzen weil AppStore reject iOS 7 mit dynamischem Framework

6
AliasCocoa

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, was es ist, eine Warnung. Siehe dies Antwort .

  • Sie können andere Ressourcen wie CoreData einbeziehen, müssen sie jedoch manuell im Code erstellen. Hier ist ein Tutorial , das zeigt, wie ein Kerndatenmodell erstellt wird.

  • Sie müssen 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.

5
Beau Nouvelle

Frameworks sind static oder dynamic Bibliotheken , die zu einem Bundle mit einigen zusätzlichen Assets, einer Meta-Beschreibung für die Versionierung und mehr gepackt sind.

Sie können das Format der Bibliothek ändern, das Auswirkungen auf Linker hat, indem Sie Framework target -> Build Settings -> Mach-O Typeändern.[Über] zu Static Library oder Dynamic Library. Standardmäßig hat Xcode den Wert Dynamic Library.

Abhängig von dieser Einstellung werden verschiedene Arten von Binärdateien generiert [statisch oder dynamisch prüfen]

Nachdem Sie einen Consumer erfolgreich konfiguriert haben [Link vs Embed]

Static Linker: ld Wird zur Kompilierzeit den gesamten Code aus static library In die ausführbare Objektdatei aufnehmen.

Dynamic Linker: dyld Versucht zur Lade-/Laufzeit, das eingebettete Framework mit @rpath Zu finden [Über] und verknüpfe es

0
yoAlex5