Biblioteka? Statyczny? Dynamiczny? Lub Framework? Wyświetlaj w innym projekcie

151

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.

pizzafilms
źródło
Możesz stworzyć szkielet parasolowy, który jest czymś w rodzaju „ramy wewnątrz struktury” stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi
możliwy duplikat How to create an Umbrella framework in iOS sdk?
Mohd Iftekhar Qurashi,

Odpowiedzi:

204

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 .anajczęś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 .aplik 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 .aplik 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:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
Programista JRG
źródło
Jak dotąd wydaje mi się, że podprojekt jest tym, czego chcę, a ten artykuł był doskonały. Zauważyłem jeden dziwny efekt uboczny: podprojekt, który przeciągnąłem do głównego projektu, zawiera również mój kod testowy (kontroler widoku i końcówkę, appdelegate itp.) I upewniłem się, że tylko klasy, których chcę użyć w główne projekty są sprawdzane do użycia w bibliotece statycznej. Ale z jakiegoś powodu, kiedy poszedłem zrobić załączniki do pliku nib mojego głównego projektu, pokazał również wyjścia i działania z mojego podprojektu. To z pewnością może prowadzić do zamieszania. Jakieś wskazówki, jak się ich pozbyć? Dzięki!
pizzafilms
Czy projekt dynamiczny można przeciągnąć i upuścić do projektu statycznego, czyniąc go w ten sposób projektem statycznym? Jestem naprawdę zdezorientowany, niektóre wyjaśnienia byłyby naprawdę świetne! Z góry dziękuję :-)
Ravindranath Akila
1
@ JRG-Developer Portowanie dynamicznego frameworka
wstecznego
Czy można ustawić niższy cel minimalny i uczynić bibliotekę opcjonalną?
kukudas
1. czy możesz dołączyć jakieś dobrze znane przykłady biblioteki statycznej, biblioteki dynamicznej, frameworka? 2. Czy możesz podać przykłady, w których musiałbyś to zrobić? 3. Ciekawe, jaka jest różnica między kapsułą a biblioteką statyczną?
Kochanie,
30

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]

Packagejest 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 w Document Packagelub z Bundle. Możesz użyć Show Package Contentsw Finderze

Bundlejest katalogiem o określonej strukturze organizowania binarnego (wykonywalnego kodu) i zasobów dla tego kodu (np. obrazy, końcówki ...). Pakiet zawiera plik Info.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 bundlei versioned bundlejako podtyp -Framework Target
  • loadable bundle(aka plug-in bundle) - Bundle target(pakiet testowy interfejsu użytkownika, pakiet testów jednostkowych)
  • inne ( pakiet dSYM[Informacje] )

Application- .ipa, .app[Informacje] - packaged application bundle- program do uruchomienia.

Tests- packaged loadable bundlektóry jest używany do testowania pliku binarnego. Architektura wtyczek pozwala nam dodać nową funkcjonalność (przypadki testowe) jako oddzielny moduł do istniejącego pliku binarnego

Biblioteki i frameworki

Martin Fowler na temat InversionOfControl

Biblioteka to zasadniczo zestaw funkcji, które można wywołać, obecnie zazwyczaj zorganizowanych w klasy. Każde połączenie wykonuje jakąś pracę i zwraca kontrolę klientowi.

Framework ucieleśnia jakiś abstrakcyjny projekt, z większą liczbą wbudowanych zachowań. Aby z niego skorzystać, musisz wstawić swoje zachowanie w różne miejsca we frameworku, albo przez tworzenie podklas, albo przez podłączenie własnych klas. Kod frameworka następnie wywołuje kod w tych punktach. Główna kontrola programu jest odwrócona, odsunięta od ciebie do ramy. (Odwrócenie sterowania)

Biblioteki i struktury na iOS

Libraryjest 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ściowy

Od 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 .dylibplikiem. Wszystkie biblioteki systemowe iOS i macOS to dynamic. 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 libraryktóry znajduje się na urządzeniu docelowym. W rezultacie nie powinieneś pakować biblioteki dynamicznej do swojego pakietu. Ma wpływ na wielkość.

Frameworkaka binary framework- .frameworkto not packaged framework bundle(aby umożliwić programistom łatwe spojrzenie na nagłówki i zasoby), który zawiera skompilowaną static or dynamicbibliotekę, pliki nagłówkowe i zasoby.

Static frameworkzawiera static librarypakiet z jego zasobami.

Dynamic frameworkzawiera dynamic libraryzasoby 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 frameworkto dynamic frameworkmieszkają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 frameworkto 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 libraryaby utworzyć paczkę z .frameworkrozszerzeniem, która będzie się zachowywać jak plik dynamic 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] -@importjest to framework, który zawiera.modulemapplik 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]

yoAlex5
źródło
1
W wielu samouczkach Swift wspomniano, że Objective C nie obsługuje bibliotek dynamicznych, gdzie jako swift obsługuje, [ altexsoft.com/blog/engineering/ ... ] Ale jak wiem, OS8 i nowsze wersje Objctive C obsługuje bibliotekę dynamiczną. Czy możesz to wyjaśnić?
pratima
@pratima, jesteś w stanie stworzyć dynamiczny framework na Objective-C na iOS
yoAlex5
1
„Struktura statyczna zawiera bibliotekę statyczną spakowaną wraz z jej zasobami”. Skąd się wzięła ta definicja? AFAK, faza budowania „Kopiuj zasoby paczki” frameworka statycznego nie działa, podobnie jak biblioteka statyczna. Jaka jest różnica między strukturą statyczną a biblioteką statyczną?
toshi0383
@ toshi0383 Czy znalazłeś sposób na połączenie biblioteki statycznej (.a) i jej zasobów (.bundle) w jedną strukturę, którą możemy przekazać konsumentowi?
user121095