Dzięki Xcode 6 otrzymujemy możliwość tworzenia własnego Dynamic Cocoa Frameworks
.
Z powodu:
Symulator nadal korzysta z
32-bit
biblioteki-
od 1 czerwca 2015 r. aktualizacje aplikacji przesyłane do App Store muszą obejmować obsługę wersji 64-bitowej i być skompilowane przy użyciu zestawu SDK systemu iOS 8 ( developer.apple.com )
Musimy zrobić bibliotekę tłuszczu, aby uruchomić projekt na urządzeniach i symulatorach. tj. obsługuje zarówno 32, jak i 64 bitowe w Frameworkach.
Ale nie znalazłem żadnych podręczników, jak wyeksportować uniwersalny fat Framework do przyszłej integracji z innymi projektami (i udostępnić komuś tę bibliotekę).
Oto moje kroki, aby odtworzyć:
Ustaw
ONLY_ACTIVE_ARCH=NO
wBuild Settings
Dodaj wsparcie
armv7 armv7s arm64 i386 x86_64
dlaArchitectures
(na pewno)
- Zbuduj Framework i otwórz go w Finderze:
- Dodaj tę platformę do innego projektu
Aktualny rezultat:
Ale w końcu nadal mam problem z uruchomieniem projektu z tym frameworkiem na urządzeniach i symulatorze jednocześnie.
jeśli pobiorę framework z
Debug-iphoneos
folderu - działa na urządzeniach i wyświetla błąd na symulatorach:ld: symbol(s) not found for architecture i386
xcrun lipo -info CoreActionSheetPicker
Architektury w grubym pliku: CoreActionSheetPicker to: armv7 armv7s arm64
jeśli wezmę framework z
Debug-iphonesimulator
folderu - działa na symulatorach. i mam błąd na urządzeniu:ld: symbol(s) not found for architecture arm64
xcrun lipo -info CoreActionSheetPicker
Architektury w grubym pliku: CoreActionSheetPicker to: i386 x86_64
Jak więc stworzyć dynamiczną platformę działającą na urządzeniach i symulatorach?
Ta odpowiedź dotyczyła problemów z Xcode 6 iOS Creating a Cocoa Touch Framework - Architectures, ale nie jest to duplikat.
Aktualizacja:
Znalazłem "brudny hack" dla tej sprawy. Zobacz moją odpowiedź poniżej . Jeśli ktoś zna wygodniejszy sposób - daj mi znać!
źródło
Odpowiedzi:
Aktualność tej odpowiedzi brzmi: lipiec 2015 r. Najprawdopodobniej sytuacja się zmieni.
TLDR;
Obecnie Xcode nie posiada narzędzi do automatycznego eksportu uniwersalnego frameworka fat, więc programista musi uciekać się do ręcznego użycia
lipo
narzędzia. Również zgodnie z tym radarem przed przesłaniem do programisty AppStore, który jest konsumentem frameworka, również musi użyćlipo
do usunięcia fragmentów symulatora z frameworka.Następuje dłuższa odpowiedź
Zrobiłem podobne badania w temacie (link u dołu odpowiedzi).
I nie znalazł żadnej oficjalnej dokumentacji na temat dystrybucji więc moje badania oparto na eksploracji Apple Developer Forum projektów Carthage i kraina i moich własnych doświadczeń z
xcodebuild
,lipo
,codesign
narzędzi.Oto długi cytat (z odrobiną mojego znacznika) z wątku Apple Developer Forums Eksportowanie aplikacji z osadzoną strukturą :
Opisuje to prawie tak samo, jak @skywinder zrobił to w swojej odpowiedzi.
W ten sposób Carthage używa lipo, a Realm używa lipo .
WAŻNE SZCZEGÓŁY
Jest radar: Xcode 6.1.1 i 6.2: frameworki iOS zawierające wycinki symulatora nie mogą być przesyłane do App Store i długa dyskusja na ten temat w Realm # 1163 i Carthage # 188, która zakończyła się specjalnym obejściem:
Przed przesłaniem do AppStore pliki binarne platformy iOS należy usunąć z wycinków symulatora
Carthage ma specjalny kod: CopyFrameworks i odpowiednią dokumentację:
Realm ma specjalny skrypt: strip-frameworks.sh i odpowiednią dokumentację:
Jest też dobry artykuł: Usuwanie niechcianych architektur z bibliotek dynamicznych w Xcode .
Sam korzystałem z Realm,
strip-frameworks.sh
który działał dla mnie doskonale bez żadnych modyfikacji, chociaż oczywiście każdy może napisać od podstaw.Link do mojego tematu, który polecam przeczytać, ponieważ zawiera kolejny aspekt tego pytania: podpisywanie kodu - tworzenie frameworków iOS / OSX: czy konieczne jest kodowanie ich przed dystrybucją do innych programistów?
źródło
To nie jest takie jasne rozwiązanie, ale jest jedyny sposób, który znajduję:
Ustaw
ONLY_ACTIVE_ARCH=NO
wBuild Settings
Otwórz w
Products
folderze konsoli dla twojego frameworka (możesz go otworzyć, otwierając folder frameworka icd ..
stamtąd)Products
folderu. Tworzy gruby Framework w tym folderze. (lub zrób to ręcznie, jak wyjaśniono poniżej w 3. 4. )Lub:
Połącz te 2 frameworki za pomocą lipo za pomocą tego skryptu (zamień
YourFrameworkName
na nazwę swojego Framework)Zastąp nową binarną jedną z istniejących frameworków:
./YourFrameworkName.framework
- to gotowy do użycia plik binarny tłuszczu! Możesz go zaimportować do swojego projektu!W przypadku projektu, którego nie ma w obszarach roboczych:
Możesz również spróbować wykorzystać tę istotę, jak opisano tutaj . Ale wygląda na to, że nie działa to w przypadku projektów w obszarach roboczych.
źródło
Debug-
używany jest tylko folderlipo -create
? Czy ta struktura może być używana doRelease
konfiguracji i dlaczego? Dzięki.Odpowiedź @Stainlav była bardzo pomocna, ale zamiast tego skompilowałem dwie wersje frameworka (jedną dla urządzenia i jedną dla symulatora), a następnie dodałem następujące,
Run Script Phase
aby automatycznie skopiować wstępnie skompilowany framework wymagany dla działającej architekturyW ten sposób nie muszę
lipo
tworzyć grubego frameworka ani Realmstrip-frameworks.sh
do usuwania niepotrzebnych wycinków podczas przesyłania do App Store.źródło
${SRCROOT}/Frameworks/Active
folderze. Są one zastępowane przez odpowiednie wstępnie skompilowane frameworki dla aktywnej architektury w czasie kompilacji.lipo
podejście „ połącz, a następnie rozerwij” .w zasadzie na to znalazłem bardzo dobre rozwiązanie. wystarczy wykonać te proste kroki.
i to wszystko. Tutaj łączymy symulator i wersję urządzenia binarnego MyFramework obecnego w MyFramework.framework. Otrzymujemy uniwersalny framework, który buduje się dla wszystkich architektur, w tym symulatora i urządzenia.
źródło
Chcę tylko zaktualizować tę świetną odpowiedź przez @odm. Od Xcode 10
CURRENT_ARCH
zmienna nie odzwierciedla już architektury kompilacji. Więc zmieniłem skrypt, żeby zamiast tego sprawdzić platformę:Dodałem również linię, aby wyczyścić katalog docelowy przed skopiowaniem, ponieważ zauważyłem, że dodatkowe pliki w podkatalogach nie zostałyby w inny sposób nadpisane.
źródło
Moja odpowiedź obejmuje poniższe punkty:
Stwórz framework, który działa zarówno dla symulatora, jak i urządzenia
Jak wyeksportować „gruby” Cocoa Touch Framework (zarówno dla symulatora, jak i urządzenia)?
Niezdefiniowane symbole architektury x86_64
ld: nie znaleziono symboli dla architektury x86_64
Kroki 1: Najpierw zbuduj swoje frameworki za pomocą celu symulatora
Kroki 2: Po pomyślnym zakończeniu procesu tworzenia symulatora, teraz skompiluj swoją platformę z wyborem urządzenia docelowego lub ogólnym wyborem urządzenia iOS
Krok 3: Teraz wybierz docelowy framework iw tym celu w sekcji „Fazy kompilacji” wybierz „Dodaj skrypt uruchamiania” i skopiuj poniższy kod skryptu)
Krok 4: Teraz w końcu skompiluj ponownie, a twoja platforma jest gotowa zarówno na zgodność z symulatorem, jak i urządzeniem. Hurra!!!!
[Uwaga: musimy mieć obie kompatybilne ramy gotowe przed ostatnim krokiem 4 (kompatybilny z symulatorem i architekturą urządzenia, jeśli nie, postępuj zgodnie z powyższymi krokami 1 i 2)
Zobacz zdjęcie referencyjne:
Umieść poniższy kod w obszarze powłoki:
źródło