Muszę przyznać, że wraz z wydaniem iOS 8 jestem trochę zdezorientowany co do dynamicznych i statycznych frameworków w iOS.
Szukam sposobu na dystrybucję utworzonej przeze mnie biblioteki i potrzebuję obsługi systemu iOS 7 i nowszych. (Uwaga: to będzie zastrzeżona struktura. Nie mogę używać strąków kakao, a także nie mogę rozpowszechniać źródła). Oto co już wiem:
- iOS 8 wprowadził „embedded frameworks” na iOS, ale, jak rozumiem, nie działają one na iOS 7, tylko na iOS 8 i nowsze.
- Mam możliwość dystrybucji mojej biblioteki jako biblioteki statycznej (plik .a), a także rozpowszechniania nagłówków. Wiem, że jest to powszechny sposób radzenia sobie z tą sytuacją, ale chciałbym znaleźć coś prostszego (a także, jeśli to możliwe, dołączyć do tego trochę zasobów).
- Odkryłem również, że iOS 7 nie obsługuje dynamicznych bibliotek .framework (tylko statyczne), ponieważ nie obsługuje dynamicznego łączenia. Ale iOS 8 tak samo jak statyczne linkowanie.
A oto moje pytania dotyczące tych informacji:
- Widziałem, że mogę utworzyć cel .framework i uczynić go statycznym, zmieniając typ Mach-O na "bibliotekę statyczną. Czy to wystarczy, aby bez problemu obsługiwać iOS 7, a także dystrybuować moją bibliotekę jako Pakiet .framework? Jeśli tak, dlaczego „wbudowane frameworki” w iOS 8 są aż tak wielkim problemem, jak sugeruje wiele zasobów w Internecie? Czy czegoś mi brakuje?
- Czy konieczne jest kodowanie .framework tak samo, jak w przypadku każdej innej aplikacji, którą tworzę?
- Co się stanie, jeśli muszę dołączyć inne zasoby (takie jak dane podstawowe lub obrazy) do mojego pliku .framework? Czy muszę w tym celu utworzyć osobny plik .bundle?
Odpowiedzi:
Przed iOS8 Xcode pozwalał tylko na tworzenie bibliotek statycznych dla iOS. Typowy problem polegał na tym, że musieliśmy oddzielnie wysyłać pliki binarne i nagłówki.
Później niektórzy programiści wpadli na pomysł stworzenia „struktur statycznych”. [.framework to tylko folder z symbolicznymi dowiązaniami do biblioteki i nagłówków]. Jednym z takich przykładów jest https://github.com/jverkoey/iOS-Framework
Ta opcja będzie działać na iOS 7 lub 8 lub wcześniej. Ponieważ są to tylko biblioteki statyczne, z wygodą łączenia plików nagłówkowych.
Jeśli chodzi o Twoje pytania dotyczące zasobów, musielibyśmy spakować je w „.bundle”. Przy wysyłce nie jestem pewien, czy możemy je umieścić w folderze .framework .. W przeszłości wysyłałem moje biblioteki jako statyczna struktura i pakiet ...
Jednak powyższa opcja nie zadziała, jeśli używasz Swift. Xcode nie obsługuje tworzenia bibliotek statycznych, które zawierają szybki kod.
Musisz iść z dynamicznymi strukturami, jeśli istnieje szybkie użycie. Teoretycznie frameworki dynamiczne działają w iOS7 .. Ale myślę, że iTunes Connect odrzuci, jeśli aplikacja jest przeznaczona dla iOS7 i używa ram dynamicznych :-).
Mam nadzieję że to pomoże
źródło
W Xcode 9 i nowszych możesz tworzyć struktury statyczne również dla Swift. Jest to możliwe dzięki kompatybilności źródeł ABI. Wszystko, co musisz zrobić, to po prostu zmienić
Mach-O type
ustawienia w trakcie kompilacji celu platformy. Ta technika ma również zastosowanie do struktur hybrydowych (frameworków z kodem Swift i Objective-C).źródło
static
lubdynamic
w nazwie zwykle wskazuje na typLinking
[About]Struktury mogą być
static
lubdynamic
[Sprawdź statyczne lub dynamiczne]Możesz zmienić format biblioteki, który będzie miał wpływ na a
Linker
, zmieniającFramework target -> Build Settings -> Mach-O Type
[Informacje] naStatic Library
lubDynamic Library
. Domyślnie Xcode maDynamic Library
wartość.W zależności od tego ustawienia zostaną wygenerowane różne typy plików binarnych
Po pomyślnym skonfigurowaniu klienta [Link vs Embed]
Static Linker
ld : w czasie kompilacji włączy cały kod zstatic library
pliku do wykonywalnego pliku obiektowego.Dynamic Linker
dyld : w czasie ładowania / wykonywania spróbuje znaleźć osadzony framework za pomocą@rpath
[Informacje] i połączyć go[Słownictwo]
źródło
Nie znam wszystkich odpowiedzi, ale postaram się tutaj odpowiedzieć na niektóre pytania.
Otrzymasz ostrzeżenie o korzystaniu z tych frameworków w iOS 7, ale to wszystko, ostrzeżenie. Zobacz tę odpowiedź .
Możesz dołączyć inne zasoby, takie jak CoreData, jednak musisz ręcznie utworzyć je w kodzie. Oto samouczek pokazujący, jak utworzyć podstawowy model danych.
Musisz kodować biblioteki dynamiczne dla systemu iOS.
Musisz upewnić się, że twoja platforma obsługuje zarówno architekturę symulatora, jak i urządzenia, jeśli planujesz ją rozpowszechniać.
źródło
Swift nie działa w statycznej bibliotece lib. Jeśli musisz używać dynamicznego frameworka, musisz ustawić min iOS na 8.0, ponieważ AppStore odrzuca ios 7 z dynamiczną frameworkiem
źródło