Bibliothek? Statisch? Dynamisch? Oder Framework? Projekt in einem anderen Projekt

151

Ich habe eine vorhandene iOS-App und möchte einen großen Teil des Codes hinzufügen, den ich als weiteres Projekt entwickelt habe, um das Testen zu vereinfachen. Der neue Block befasst sich im Wesentlichen mit dem Speichern eines Bildes in verschiedenen Freigabediensten usw. Da dieser Freigabecode viele Tests und zukünftige Aktualisierungen erfordert, habe ich mich gefragt, wie ich diesen Codeblock am besten in meine vorhandene App integrieren kann.

Ich weiß nicht, ob es sich um eine statische Bibliothek, eine dynamische Bibliothek oder ein Framework handeln soll, und ehrlich gesagt bin ich mir nicht sicher, was der Unterschied ist oder wie ich vorgehen und es in Xcode einrichten soll.

Ich weiß nur, dass ich eine separate Test- und Aktualisierungs-App für den Freigabecode behalten muss / möchte und die Haupt-App diese verwenden soll.

Pizzafilme
quelle
Sie können ein Umbrella-Framework erstellen, das so etwas wie "Framework in Framework" stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi
Mögliches Duplikat von Wie erstelle ich ein Umbrella-Framework in iOS SDK?
Mohd Iftekhar Qurashi

Antworten:

202

Zunächst einige allgemeine Definitionen (spezifisch für iOS):

Statische Bibliothek - eine Codeeinheit, die zur Kompilierungszeit verknüpft ist und sich nicht ändert.

Allerdings sind Bibliotheken iOS statisch nicht enthalten images / Vermögen (nur Code) erlaubt. Sie können diese Herausforderung jedoch umgehen, indem Sie ein Medienpaket verwenden .

Eine bessere, formellere Definition finden Sie auf Wikipedia hier .

Dynamische Bibliothek - eine Einheit von Code und / oder Assets, die zur Laufzeit verknüpft sind und sich ändern können.

Es ist jedoch nur Apple gestattet, dynamische Bibliotheken für iOS zu erstellen. Sie dürfen diese nicht erstellen, da dadurch Ihre App abgelehnt wird. (Siehe diesen anderen SO-Beitrag zur Bestätigung und Begründung dazu).

Software Framework - ein kompilierter Satz von Code, der eine Aufgabe erfüllt. Daher können Sie tatsächlich ein statisches Framework oder ein dynamisches Framework haben , bei denen es sich normalerweise nur um die kompilierten Versionen der oben genannten handelt.

Weitere Informationen finden Sie im Wiki on Software Framework .

Daher besteht Ihre einzige Option unter iOS darin, eine statische Bibliothek oder ein statisches Framework zu verwenden (der Hauptunterschied besteht darin, dass ein statisches Framework .aam häufigsten als kompilierte Datei verteilt wird , während eine statische Bibliothek einfach als Teilprojekt enthalten sein kann - wie Sie sehen können der gesamte Code - der zuerst kompiliert wird und dessen resultierende .aDatei vom Projekt als Abhängigkeit verwendet wird).

Jetzt, da wir uns über diese Begriffe im Klaren sind, ist es nicht allzu schwierig, eine statische Bibliothek einzurichten und ein Medienpaket für iOS zu unterstützen, und es gibt viele Tutorials dazu. Ich persönlich würde dieses empfehlen:

https://github.com/jverkoey/iOS-Framework

Dies ist eine ziemlich einfache Anleitung und hat nicht den Nachteil, mit "gefälschten statischen Bibliotheken" umzugehen ... lesen Sie sie für weitere Informationen ...

Sobald Sie Ihre statische Bibliothek erstellt haben, können Sie sie ganz einfach als Submodul in Git einbinden, um sie für verschiedene Projekte zu verwenden.

Viel Glück.

BEARBEITEN

In Bezug auf ein Teilprojekt innerhalb eines Projekts müssen Sie meines Wissens im Wesentlichen eine Kompilierungskette einrichten, in der das Teilprojekt zuerst kompiliert wird, um eine statische Framework- .aDatei zu erstellen, die als Abhängigkeit verwendet wird durch das Projekt.

Hier ist ein weiteres nützliches Tutorial, das darüber spricht:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

BEARBEITEN 2

Ab iOS 8 erlaubt Apple Entwicklern nun, dynamische Frameworks zu erstellen! (Hinweis: Ihre App muss ein Mindestziel von iOS 8 haben, um ein dynamisches Framework einzuschließen. Backporting ist nicht zulässig.)

Dies wurde als neue Projektvorlage hinzugefügt. In Xcode 6.1 finden Sie dies unter:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
JRG-Entwickler
quelle
Bisher scheint das Teilprojekt das zu sein, was ich will, und dieser Artikel war perfekt. Ich habe einen merkwürdigen Nebeneffekt bemerkt: Das Teilprojekt, das ich in mein Hauptprojekt gezogen habe, enthält auch meinen Testcode (Viewcontroller und Nib, Appdelegate usw.), und ich habe sichergestellt, dass nur die Klassen, die ich in der verwenden möchte Hauptprojekt sind aktiviert, um in der statischen Bibliothek verwendet zu werden. Aber aus irgendeinem Grund wurden beim Anfügen von Anhängen an die NIB-Datei meines Hauptprojekts auch Outlets und Aktionen aus meinem Teilprojekt angezeigt. Dies könnte definitiv zu Verwirrung führen. Irgendwelche Tipps, um diese loszuwerden? Vielen Dank!
Pizzafilme
Kann ein dynamisches Projekt per Drag & Drop in ein statisches Projekt gezogen werden, wodurch es zu einem statischen Projekt wird? Ich bin wirklich verwirrt, eine Klarstellung wäre wirklich toll! Vielen Dank im Voraus :-)
Ravindranath Akila
1
@ JRG-Developer Das Backporting eines dynamischen Frameworks ist zulässig, wenn Sie einige Regeln befolgen: developer.apple.com/library/prerelease/ios/documentation/…
klefevre
Ist es möglich, ein niedrigeres Mindestziel festzulegen und die Bibliothek optional zu machen?
Kukudas
1. Können Sie einige bekannte Beispiele für statische Bibliotheken, dynamische Bibliotheken und Frameworks hinzufügen? 2. Können Sie Beispiele nennen, wo Sie dies tun müssten? 3. Neugierig, was ist der Unterschied zwischen einem Pod und einer statischen Bibliothek?
Honig
28

Mach-O-Dateiformat (Mach-Objekt - .o)

In der iOS-Welt wird jede Quelldatei in Objektdateien konvertiert - ABI [About] Mach-O-Datei [About], die in ein endgültiges ausführbares Bundle (z. B. Anwendung, Framework ...), Datei (z. B. Bibliothek ...) gepackt wird. und sein Verhalten wird bestimmt durch Mach-O type[Über]

Packageist ein Verzeichnis, das sich als Datei verhält - opaque file. Es wurde für die Benutzererfahrung erstellt , um einige Änderungen an der internen Struktur zu erschweren, die zu unvorhersehbarem Programmverhalten führen können. Paket wird in Document Packageoder mit a verwendet Bundle. Sie können Show Package Contentsin einem Finder verwenden

Bundleist ein Verzeichnis mit einer bestimmten Struktur zum Organisieren einer Binärdatei (ausführbarer Code) und Ressourcen für diesen Code (z. B. Bilder, Schreibfedern ...). Bundle enthält Info.plist[About] -Datei. Das Bundle wurde für Entwickler erstellt . Es kann auch verpackt werden. Es gibt verschiedene Arten von Bundles:

  • application bundle - - Application target
  • framework bundleund versioned bundleals Subtyp -Framework Target
  • loadable bundle(aka plug-in bundle) - Bundle target(UI Testing Bundle, Unit Testing Bundle)
  • andere ( dSYM[Über] Bundle)

Application- .ipa, .app[Über] - packaged application bundle- startfähiges Programm.

Tests- packaged loadable bundlewird verwendet, um eine Binärdatei zu testen. Die Plug-In-Architektur ermöglicht es uns, eine neue Funktionalität (Testfälle) als separates Modul in vorhandene Binärdateien einzufügen

Bibliotheken und Frameworks

Martin Fowler über InversionOfControl

Eine Bibliothek besteht im Wesentlichen aus einer Reihe von Funktionen, die Sie aufrufen können. Diese sind heutzutage normalerweise in Klassen unterteilt. Jeder Aufruf erledigt einige Arbeiten und gibt die Kontrolle an den Client zurück.

Ein Framework verkörpert ein abstraktes Design mit mehr integriertem Verhalten. Um es zu verwenden, müssen Sie Ihr Verhalten an verschiedenen Stellen im Framework einfügen, entweder durch Unterklassen oder durch Einfügen Ihrer eigenen Klassen. Der Code des Frameworks ruft dann an diesen Stellen Ihren Code auf. Die Hauptsteuerung des Programms ist invertiert und von Ihnen weg in das Framework verschoben. (Umkehrung der Kontrolle)

Bibliotheken und Frameworks unter iOS

Libraryist eine Sammlung von Mach-O-Objektdateien [statisch oder dynamisch prüfen], die für eine oder mehrere Architekturen kompiliert wurden.

Static library- .a(auch bekannt als statische Archivbibliothek, statisch verknüpfte gemeinsam genutzte Bibliothek [doc] ) - Wenn Sie sie Ihrer Anwendung hinzufügen, führt der statische Linker während der Kompilierungszeit die Objektdateien aus der Bibliothek zusammen und packt sie zusammen mit den Anwendungsobjektdateien in eine einzige ausführbare Datei Datei. Der Nachteil ist eine große Ausgabedatei

Ab Xcode 9.0 wird die statische Swift-Bibliothek unterstützt.

Dynamic library- .dylib(auch bekannt als dynamische gemeinsam genutzte Bibliothek, gemeinsam genutztes Objekt, dynamisch verknüpfte Bibliothek [doc] ) wird beim Laden oder zur Laufzeit dynamisch mit der ausführbaren Datei der App verknüpft , jedoch nicht in diese kopiert. In der Praxis enthält das Paket der App den Frameworks-Ordner mit der Datei. Alle iOS- und MacOS- Systembibliotheken sind . Der Nachteil ist eine langsame Startzeit, da alle dynamischen Bibliotheken kopiert und verknüpft werden sollten..dylibdynamic

[Statische vs dynamische Verknüpfung]

Text-based stub library- .tbd[Info] ist ein Textstub, der dynamic librarysich auf einem Zielgerät befindet. Daher sollten Sie keine dynamische Bibliothek in Ihr Bundle packen. Es hat einen Größeneffekt.

Framework- .frameworkist ein not packaged framework bundle-, damit Entwickler leicht einen Blick auf Header und Ressourcen werfen können, die eine static or dynamicBibliothek, Header-Dateien und Ressourcen enthalten.

Static frameworkenthalten ein static libraryPaket mit seinen Ressourcen.

Dynamic frameworkenthält die dynamic libraryund Ressourcen. Darüber hinaus kann das dynamische Framework verschiedene Versionen derselben dynamischen Bibliothek in einem einzigen Bundle enthalten ( versioned bundle)

[Statisches vs dynamisches Framework]

Embedded frameworkist eine dynamic framework, die in der Sandbox der App lebt. Dieser Typ wurde zunächst für die Erweiterung erstellt , um gemeinsamen Code und Ressourcen gemeinsam zu nutzen. Es ist verfügbar, wenn das Bereitstellungsziel iOS 8+ ist.

Umbrella framework [Aggregiertes Ziel] ist ein Framework, das andere Frameworks enthält. Es wird unter iOS nicht offiziell unterstützt und daher wird Entwicklern nicht empfohlen , sie zu erstellen [Offizielles Dokument] . Tatsächlich handelt es sich um eine Reihe von Unter-Frameworks (oder verschachtelten Frameworks). Wenn Sie ein Framework mit einer Abhängigkeit erstellen, ist ein Verbraucher (z. B. eine App) dafür verantwortlich, diese Abhängigkeit zusammen mit Ihrem Framework in das Projekt einzufügen. Als Entwickler ist es selbstverständlich, einen Weg zu finden, um diese Pflicht vom Verbraucher auf Ihren zu übertragen. Infolgedessen denken Sie, dass diesUmbrella frameworkdie Rettung ist, aber normalerweise führt dies zu ernsthaften Problemen bei der Verwaltung von Versionen und der Komplexität der Erstellung und Unterstützung.

Fake Framework- ist das Ergebnis bestimmter Operationen unter a static library, um ein Bundle mit .frameworkErweiterung zu erstellen , das sich als dynamic framework. verhält . Diese Technik wurde verwendet, wenn Xcode das Erstellen eines Frameworks nicht unterstützte, da keine Framework-Vorlage vorhanden war. Eine der Realisierung eines gefälschten Rahmens . Mit Xcode 6 hat Apple die Unterstützung des iOS-Frameworks hinzugefügt.

Modular Framework[About] -@importEs ist ein Framework, das eine.modulemapDateienthält. Modul kann Submodule enthalten. Der Hauptvorteil ist, dass Sie mitModular Framework.

Universal Library or Framework(aka Fat) [lipo] [Gesamtziel] enthält mehrere Architekturen. Zum Beispiel sollte Ihr Release-Build einen Bogen unterstützen, den Sie über [ONLY_ACTIVE_ARCH] regulieren können.Build Active Architecture Only

Dependency[Info] Sie können Code von Drittanbietern als Teil Ihres Ziels verwenden. Sie können einen Code aus vielen Quellen wie einem anderen Projekt, einem Projekt im selben Arbeitsbereich, einem anderen Ziel, einer anderen Bibliothek, einem anderen Framework usw. wiederverwenden.

So erstellen und verwenden Sie eine statische Bibliothek:

Erstellen und Verwenden eines dynamischen Frameworks [Wechsel zu statisch]

[Xcode Build System]
[Xcode-Komponenten]
[Dynamischer Linker]

yoAlex5
quelle
1
In vielen Swift-Tutorials wird erwähnt, dass Objective C keine dynamischen Bibliotheken unterstützt, wobei Swift [ altexsoft.com/blog/engineering/… ] unterstützt. Wie ich weiß, unterstützt Objctive C ab OS8 Dynamic Library. Können Sie das bitte klarstellen?
Pratima
@pratima, Sie können ein dynamisches Framework für Objective-C für iOS
erstellen
1
"Das statische Framework enthält eine statische Bibliothek, die mit ihren Ressourcen gepackt ist." Woher kommt diese Definition? AFAK, die Build-Phase "Copy Bundle Resources" des statischen Frameworks, funktioniert nicht wie die statische Bibliothek. Was ist der Unterschied zwischen statischem Framework und statischer Bibliothek?
toshi0383
@ toshi0383 Haben Sie eine Möglichkeit gefunden, die statische Bibliothek (.a) und ihre Ressourcen (.bundle) in einem einzigen Framework zusammenzuführen, das wir an den Verbraucher verteilen können?
user121095
2

Sie können auch eine .podspec-Datei für CocoaPods erstellen ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) und diese wie jeden anderen Pod mit dem verwenden Der einzige Unterschied besteht darin, dass es sich um Ihren privaten Pod handelt und für die Außenwelt nicht sichtbar ist (ich bin nicht sicher, was passieren wird, wenn Ihr Pod ein CoreData-Modell erstellen soll, aber das ist meines Wissens nicht der Fall).

Timur Kuchkarov
quelle