Wyjaśnienia dotyczące struktur statycznych i dynamicznych iOS

115

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?
csotiriou
źródło
1
„iOS 7 nie obsługuje bibliotek .framework, ponieważ nie obsługuje dynamicznego łączenia”. Ta instrukcja nie jest poprawna.
Midhun MP,
1
Widzę. czy możesz mi powiedzieć poprawne zdanie? Czy to fałsz, ponieważ iOS 7 obsługuje dynamiczne łączenie lub ponieważ iOS 7 obsługuje biblioteki .framework? Lub oba?
csotiriou
1
Remeber AVFoundation i CoreGraphics to pliki .framework. Prawdopodobnie pomoże ci to znaleźć odpowiedzi na wszystkie twoje pytania: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP
Poprawiłem zdanie. Przeczytałem już link, zanim opublikowałem moje pytania. Ten link niczego nie wyjaśnia odnośnie moich pytań. Zaczyna się od biblioteki statycznej i RĘCZNIE zawija ją do pliku .framework. Mówię o docelowym Cocoa Touch Framework w Xcode 6, a następnie zmieniam typ na bibliotekę statyczną. Nie wspomina o podpisywaniu kodu (dlaczego i jeśli jest to konieczne), dodatkowych zasobach itp.
csotiriou
1
Możesz użyć CocoaPods do dystrybucji zastrzeżonego frameworka (np. Parse)
Ric Santos

Odpowiedzi:

69

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

Subbu
źródło
17

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 typeustawienia w trakcie kompilacji celu platformy. Ta technika ma również zastosowanie do struktur hybrydowych (frameworków z kodem Swift i Objective-C).

Avijeet Dutta
źródło
Świetna wskazówka. Nie wiem, dlaczego ta odpowiedź została obniżona, ponieważ pomogła mi. \ Target'Build Settings \ Mach-O-Type i wybierz Static Framework.
rustyMagnet
3
Kompatybilność z Abi nie jest dostępna w szybkim 4
csotiriou
8

staticlub dynamicw nazwie zwykle wskazuje na typ Linking[About]

Struktury mogą być staticlub dynamic[Sprawdź statyczne lub dynamiczne]

Możesz zmienić format biblioteki, który będzie miał wpływ na a Linker, zmieniając Framework target -> Build Settings -> Mach-O Type[Informacje] na Static Librarylub Dynamic Library. Domyślnie Xcode ma Dynamic Librarywartość.

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 z static librarypliku 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]

yoAlex5
źródło
5

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ć.

Beau Nouvelle
źródło
5

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

AliasCocoa
źródło
1
Możesz zaimportować bibliotekę statyczną do projektu opartego na Swift
C0D3