Mam istniejącą aplikację na iOS i chcę dodać duży fragment kodu, który opracowałem jako kolejny projekt, aby ułatwić testowanie. Nowa porcja dotyczy w zasadzie zapisywania obrazu w różnych usługach udostępniania itp. Ponieważ ten kod do udostępniania wymaga wielu testów i przyszłych aktualizacji, zastanawiałem się, jak najlepiej włączyć ten fragment kodu do mojej istniejącej aplikacji.
Nie wiem, czy powinna to być biblioteka statyczna, biblioteka dynamiczna czy framework, i szczerze mówiąc, nie jestem pewien, jaka jest różnica, ani jak mam się do tego zabrać i skonfigurować w Xcode.
Wiem tylko, że potrzebuję / chcę mieć oddzielną aplikację do testowania i aktualizowania kodu udostępniania i aby aplikacja główna z niej korzystała.
ios
xcode
frameworks
static-libraries
pizzafilms
źródło
źródło
Odpowiedzi:
Najpierw kilka ogólnych definicji (specyficznych dla iOS):
Biblioteka statyczna - jednostka kodu połączona w czasie kompilacji, która nie ulega zmianie.
Jednak biblioteki statyczne iOS nie mogą zawierać obrazów / zasobów (tylko kod). Możesz jednak obejść to wyzwanie, używając pakietu multimediów .
Lepszą, bardziej formalną definicję można znaleźć na Wikipedii tutaj .
Biblioteka dynamiczna - jednostka kodu i / lub zasobów połączonych w czasie wykonywania, która może ulec zmianie.
Jednak tylko Apple może tworzyć biblioteki dynamiczne dla iOS. Nie możesz ich tworzyć, ponieważ spowoduje to odrzucenie aplikacji. (Zobacz ten drugi post dotyczący SO w celu potwierdzenia i uzasadnienia).
Struktura oprogramowania - skompilowany zestaw kodu, który wykonuje zadanie ... stąd w rzeczywistości możesz mieć szkielet statyczny lub dynamiczny , które zazwyczaj są tylko skompilowanymi wersjami powyższego.
Aby uzyskać więcej informacji, zobacz Wiki na temat struktury oprogramowania .
W związku z tym w systemie iOS jedyną opcją jest zasadniczo użycie biblioteki statycznej lub struktury statycznej (główna różnica polega na tym, że struktura statyczna jest
.a
najczęściej dystrybuowana jako plik skompilowany , podczas gdy biblioteka statyczna może być po prostu dołączona jako podprojekt - możesz zobaczyć cały kod - który jest kompilowany jako pierwszy, a jego.a
plik wynikowy używany jako zależność przez projekt).Teraz, gdy mamy już jasność co do tych warunków, skonfigurowanie biblioteki statycznej i wsparcie pakietu multimediów dla systemu iOS nie jest zbyt trudne i istnieje wiele samouczków, jak to zrobić. Osobiście poleciłbym ten:
https://github.com/jverkoey/iOS-Framework
Jest to dość prosty przewodnik i nie ma wady radzenia sobie z „fałszywymi bibliotekami statycznymi” ... sprawdź to, aby uzyskać więcej informacji ...
Po utworzeniu biblioteki statycznej jest to tak proste, jak włączenie jej jako modułu podrzędnego w Git do użytku w różnych projektach.
Powodzenia.
EDYTOWAĆ
Jeśli chodzi o podprojekt w projekcie, o ile wiem, aby uzyskać poprawne działanie / kompilację, zasadniczo musisz skonfigurować łańcuch kompilacji, w którym podprojekt jest kompilowany jako pierwszy, co tworzy statyczny
.a
plik struktury , który jest używany jako zależność przez projekt.Oto kolejny przydatny samouczek, który o tym mówi:
http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/
EDYCJA 2
Począwszy od iOS 8, Apple pozwala teraz programistom na tworzenie dynamicznych struktur! (Uwaga: Twoja aplikacja musi mieć co najmniej system docelowy iOS 8, aby zawierała strukturę dynamiczną ... przenoszenie wsteczne jest niedozwolone).
Zostało to dodane jako nowy szablon projektu. W Xcode 6.1 można to znaleźć pod adresem:
źródło
Format pliku Mach-O (obiekt Mach -
.o
)W świecie iOS każdy plik źródłowy jest konwertowany na pliki obiektowe - ABI [About] plik Mach-O [About], który zostanie spakowany w ostateczny pakiet wykonywalny (np. Aplikacja, framework ...), plik (np. Biblioteka ...) a jego zachowanie jest określane przez
Mach-O type
[Informacje]Package
jest katalogiem, który zachowuje się jak plik -opaque file
. Został stworzony, aby doświadczenie użytkownika utrudniało wprowadzanie pewnych zmian w strukturze wewnętrznej, które mogą powodować nieprzewidywalne zachowanie programu. Pakiet jest używany wDocument Package
lub zBundle
. Możesz użyćShow Package Contents
w FinderzeBundle
jest katalogiem o określonej strukturze organizowania binarnego (wykonywalnego kodu) i zasobów dla tego kodu (np. obrazy, końcówki ...). Pakiet zawiera plikInfo.plist
[About] . Pakiet został stworzony z myślą o programistach . Można go również zapakować. Istnieje kilka rodzajów pakietów:application bundle
-Application target
framework bundle
iversioned bundle
jako podtyp -Framework Target
loadable bundle
(akaplug-in bundle
) -Bundle target
(pakiet testowy interfejsu użytkownika, pakiet testów jednostkowych)dSYM
[Informacje] )Application
-.ipa
,.app
[Informacje] -packaged
application bundle
- program do uruchomienia.Tests
-packaged
loadable bundle
który jest używany do testowania pliku binarnego. Architektura wtyczek pozwala nam dodać nową funkcjonalność (przypadki testowe) jako oddzielny moduł do istniejącego pliku binarnegoBiblioteki i frameworki
Martin Fowler na temat InversionOfControl
Biblioteki i struktury na iOS
Library
jest zbiorem plików obiektów Mach-O [sprawdź statyczne lub dynamiczne] skompilowanych dla jednej lub więcej architektur.Static library
-.a
(aka statyczna biblioteka archiwum, statyczna połączona biblioteka współdzielona [doc] ) - Kiedy dodasz ją do swojej aplikacji, statyczny linker w czasie kompilacji połączy pliki obiektowe z biblioteki i spakuje je wraz z plikami obiektów aplikacji w jeden plik wykonywalny plik. Wadą jest duży plik wyjściowyOd Xcode 9.0 obsługiwana jest biblioteka statyczna Swift.
Dynamic library
-.dylib
(czyli dynamiczna biblioteka współdzielona, obiekt współdzielony, biblioteka połączona dynamicznie [dokument] ) jest dynamicznie łączona z plikiem wykonywalnym aplikacji podczas ładowania lub w czasie wykonywania , ale nie jest do niego kopiowana. W praktyce pakiet aplikacji będzie zawierał folder Frameworks z.dylib
plikiem. Wszystkie biblioteki systemowe iOS i macOS todynamic
. Wadą jest długi czas uruchamiania, ponieważ wszystkie biblioteki dynamiczne powinny być kopiowane i linkowane.[Łączenie statyczne a dynamiczne]
Text-based stub library
-.tbd
[About] , jest to fragment tekstu,dynamic library
który znajduje się na urządzeniu docelowym. W rezultacie nie powinieneś pakować biblioteki dynamicznej do swojego pakietu. Ma wpływ na wielkość.Framework
akabinary framework
-.framework
tonot packaged framework bundle
(aby umożliwić programistom łatwe spojrzenie na nagłówki i zasoby), który zawiera skompilowanąstatic or dynamic
bibliotekę, pliki nagłówkowe i zasoby.Static framework
zawierastatic library
pakiet z jego zasobami.Dynamic framework
zawieradynamic library
zasoby i. Oprócz tego dynamiczna struktura może zawierać różne wersje tej samej biblioteki dynamicznej w jednym pakiecie (versioned bundle
)[Struktura statyczna a dynamiczna]
Embedded framework
todynamic framework
mieszkający w piaskownicy aplikacji. Ten typ został stworzony przede wszystkim z myślą o rozszerzeniu w celu współdzielenia wspólnego kodu i zasobów. Jest dostępny, gdy celem wdrożenia jest iOS 8+.Umbrella framework
[Aggregate target] to framework, który zawiera inne frameworki. Nie jest oficjalnie obsługiwany w systemie iOS i dlatego nie zaleca się programistom ich tworzenia [Oficjalny dokument] . W rzeczywistości jest to zestaw struktur podrzędnych (lub struktur zagnieżdżonych). Podczas tworzenia struktury, która ma zależność, konsument (na przykład aplikacja) jest odpowiedzialny za dodanie tej zależności wraz z platformą do projektu. Jako programista naturalnie próbujesz znaleźć sposób na przeniesienie tego obowiązku z konsumenta na swojego. W rezultacie myślisz, żeUmbrella framework
to ratunek, ale zwykle prowadzi to do poważnych problemów z zarządzaniem wersjami i złożonością tworzenia i obsługi.Fake Framework
- jest wynikiem określonych operacji pod a,static library
aby utworzyć paczkę z.framework
rozszerzeniem, która będzie się zachowywać jak plikdynamic framework
. Ta technika była używana, gdy Xcode nie obsługiwał tworzenia struktury, ponieważ nie miał szablonu struktury. Jedną z realizacji fałszywych ram . W Xcode 6 firma Apple dodała obsługę struktury iOS.Modular Framework
[About] -@import
jest to framework, który zawiera.modulemap
plik w środku. Moduł może zawierać podmoduły. Główną zaletą jest to, że oszczędzasz czas kompilacjiModular Framework
.Universal Library or Framework
(aka Fat) [lipo] [Aggregate target] zawiera wiele architektur. Na przykład Twoja kompilacja wydania powinna obsługiwać jakiś łuk, który możesz regulować za pomocąBuild Active Architecture Only
[ONLY_ACTIVE_ARCH]Dependency
[O] Możesz użyć kodu strony trzeciej jako części celu. Pozwala na ponowne użycie kodu z wielu źródeł, takich jak - inny projekt, projekt w tym samym obszarze roboczym, inny cel, biblioteka, framework itp.Jak zbudować i używać biblioteki statycznej:
Jak zbudować i używać struktury dynamicznej [zmiana na statyczną]
[Xcode Build System]
[Xcode Components]
[Dynamic linker]
źródło
Możesz także utworzyć plik .podspec dla CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) i używać go jak każdego innego poda z jedyną różnicą jest to, że jest to twój prywatny kapsuła i nie jest widoczna dla świata zewnętrznego (nie jestem pewien, co się stanie, jeśli twój pod utworzy model CoreData, ale tak nie jest, jak rozumiem).
źródło