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.
quelle
Antworten:
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
.a
am 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.a
Datei 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-
.a
Datei 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:
quelle
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]Package
ist 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 inDocument Package
oder mit a verwendetBundle
. Sie könnenShow Package Contents
in einem Finder verwendenBundle
ist 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ältInfo.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 bundle
undversioned bundle
als Subtyp -Framework Target
loadable bundle
(akaplug-in bundle
) -Bundle target
(UI Testing Bundle, Unit Testing Bundle)dSYM
[Über] Bundle)Application
-.ipa
,.app
[Über] -packaged
application bundle
- startfähiges Programm.Tests
-packaged
loadable bundle
wird 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ügenBibliotheken und Frameworks
Martin Fowler über InversionOfControl
Bibliotheken und Frameworks unter iOS
Library
ist 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 AusgabedateiAb 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..dylib
dynamic
[Statische vs dynamische Verknüpfung]
Text-based stub library
-.tbd
[Info] ist ein Textstub, derdynamic library
sich auf einem Zielgerät befindet. Daher sollten Sie keine dynamische Bibliothek in Ihr Bundle packen. Es hat einen Größeneffekt.Framework
-.framework
ist einnot packaged
framework bundle
-, damit Entwickler leicht einen Blick auf Header und Ressourcen werfen können, die einestatic or dynamic
Bibliothek, Header-Dateien und Ressourcen enthalten.Static framework
enthalten einstatic library
Paket mit seinen Ressourcen.Dynamic framework
enthält diedynamic library
und 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 framework
ist einedynamic 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 framework
die 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 astatic library
, um ein Bundle mit.framework
Erweiterung zu erstellen , das sich alsdynamic 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] -@import
Es ist ein Framework, das eine.modulemap
Dateienthä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]
quelle
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).
quelle