Ta awaria była problemem blokującym. Aby odtworzyć problem, wykonałem następujące kroki:
- Utwórz projekt Cocoa Touch Framework
- Dodaj szybki plik i psa klasy
- Zbuduj platformę dla urządzenia
- Utwórz aplikację Single View w Swift
- Zaimportuj platformę do projektu aplikacji
- Utwórz instancję szybkiej klasy z frameworka w ViewController
- Zbuduj i uruchom aplikację na urządzeniu
Aplikacja natychmiast uległa awarii podczas uruchamiania, oto dziennik konsoli:
dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
Reason: image not found
Próbowałem zbudować na urządzeniach iOS 7.1 i 8.0, oba mają tę samą awarię. Mogę jednak zbudować aplikację i dobrze uruchomić na symulatorze. Wiem też, że mogę zmienić strukturę, aby utworzyć Wymagane na Opcjonalne w Link Binary With Libraries , ale nie rozwiązało to całkowicie problemu, aplikacja uległa awarii podczas tworzenia instancji Dog . Zachowanie jest inne na urządzeniu i symulatorze, podejrzewam, że nie możemy dystrybuować frameworka na urządzenie za pomocą wersji beta Xcode. Czy ktoś może rzucić na to światło?
Link Binary with Libraries
a Xcode wie, jak je skopiować do pakietu aplikacji, podczas gdy w przypadku niestandardowych ram po prostu tak się nie dzieje.Odpowiedzi:
Na karcie Ogólne celu znajduje się pole Osadzone pliki binarne . Po dodaniu szkieletu następuje awaria.
Odnośnik znajduje się tutaj na forach programistów Apple.
źródło
W systemie iOS większym lub równym 8
Pod zakładką Ogólne celu, w sekcji Osadzone pliki binarne dodaj strukturę. Spowoduje to skopiowanie frameworka do skompilowanej, aby można było go połączyć w czasie wykonywania.
Dlaczego to się dzieje? : ponieważ środowisko, do którego się łączysz, jest kompilowane jako środowisko dynamicznie połączone, a zatem jest połączone z środowiskiem uruchomieniowym.
** Uwaga: ** Osadzanie niestandardowych ram jest obsługiwane tylko w systemie iOS> 8, dlatego alternatywne rozwiązanie działa na starszych wersjach systemu iOS.
Na iOS mniej niż 8
Jeśli wpływasz na ten framework (masz dostęp do kodu źródłowego / procesu kompilacji), możesz zmienić ten framework na statyczny, a nie dynamiczny. Spowoduje to, że kod zostanie dołączony do skompilowanej aplikacji, a nie połączony z nią w środowisku wykonawczym, a zatem nie będzie konieczne osadzanie frameworka.
** Jak: ** Na karcie Ustawienia kompilacji środowiska, w sekcji Łączenie zmień Typ Mach-O na Biblioteka statyczna. Odtąd nie trzeba uwzględniać frameworka pod osadzonymi plikami binarnymi.
W tym zasoby: Aby uwzględnić takie rzeczy, jak obrazy, audio lub pliki xib / nib, polecam utworzenie pakietu (zasadniczo katalog, więcej informacji tutaj bit.ly/ios_bundle), a następnie załadowanie zasobów z pakietu za pomocą NSBundle.
źródło
Swift is not supported for static libraries
Samo przeciągnięcie frameworka do projektu nie będzie wystarczająco dobre. To tak, jakby być na tym samym boisku, ale nie móc znaleźć swoich dzieci. Wykonaj następujące kroki:
1) Utwórz swoją strukturę
COMMAND
+B
zbuduj platformę i upewnij się, że otrzymasz komunikat „Kompilacja zakończona sukcesem”.2) Uzyskaj dostęp do swojego frameworka
Products
folderu w projekcie..framework
i wybierz „Pokaż w Finderze”.3) Umieść ramy w swoim projekcie
.framework
z okna Findera do folderu „Framework” projektu aplikacji.4) Skonfiguruj projekt aplikacji dla frameworka
+
przycisk. Z rozwijanego menu wybierz „Nowa faza kopiowania plików”.Destination
opcję „Szkielety”. Pozostaw podścieżkę pustą. Następnie kliknij+
przycisk w lewym dolnym rogu.5) Oczyść, a następnie uruchom projekt
COMMAND
+SHIFT
+K
COMMAND
+R
źródło
Stworzyłem framework za pomocą Swift3 / Xcode 8.1 i wykorzystałem go w projekcie Objective-C / Xcode 8.1. Aby rozwiązać ten problem, musiałem włączyć
Always Embed Swift Standard Libraries
opcję poniżejBuild Options
.Spójrz na ten zrzut ekranu:
źródło
Embedded Binaries
sekcji mojego celu . Dlaczego to sprawia, że działa?Najpierw spróbuj zbudować po Command + Opcja + Shift + K.Jeśli nadal nie powiedzie się, wykonaj poniższe czynności.
Jeśli ktoś napotyka ten błąd w Xcode 8, zmień status frameworka na Opcjonalny zamiast Wymagany w zakładce Ogólne swojego celu.
źródło
Ten sam problem występuje w wersji iOS 9.x.
Rozwiązałem ten problem, zmieniając
Required
naOptional
wLinked Frameworks and Libraries
for forUserNotifications.framework
framework.źródło
Musiałem ( oprócz tego, co tu wspomniano) dodać następujący wiersz do Ścieżek wyszukiwania Runpath w zakładce Ustawienia kompilacji :
@executable_path/Frameworks
źródło
Musisz dodać platformę do nowej fazy tworzenia kopii plików, aby upewnić się, że platforma zostanie skopiowana do pakietu aplikacji w czasie wykonywania.
Zobacz Jak dodać „fazę kompilacji Kopiuj pliki” do mojego obiektu docelowego uzyskać więcej informacji, .
Oficjalne dokumenty Apple: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html
źródło
Jeśli używasz Xcode 11 lub nowszego :
Przewiń w dół do ram, bibliotek i treści osadzonych .
Upewnij się, że wartość Osadź i podpisz lub Osadź bez podpisu jest wybrana dla opcji Osadź , jeśli to konieczne.
źródło
Dodaj strukturę w osadzonych plikach binarnych
Następnie wyczyść i zbuduj.
źródło
Zaskakujące jest to, że nie wszystkie niezbędne elementy są tutaj udokumentowane, przynajmniej dla Xcode 8.
Mój przypadek był niestandardowym szkieletem w ramach tego samego obszaru roboczego. Okazuje się, że był budowany niepoprawnie. Na podstawie ostatniej odpowiedzi jeremyhu na ten wątek:
https://forums.developer.apple.com/thread/4687
Miałem do zestawu
Dynamic Library Install Name Base
(DYLIB_INSTALL_NAME_BASE
), zgodnieBuild Settings
z ramowym projekt, a następnie go odbudować. To było niepoprawnie ustawione$(LOCAL_LIBRARY_DIR)
i musiałem to zmienić@rpath
.Tak więc na etapie przetwarzania łącza w App Project instruowała aplikację hosta, aby dynamicznie ładowała platformę w czasie wykonywania z
/Library/Frameworks/fw.Framework/fw
(jak w katalogu głównym systemu plików środowiska wykonawczego), a nie ze ścieżki do aplikacji/Frameworks/fw.Framework/fw
Jeżeli chodzi o wszystkie inne ustawienia: to ma być w 3 miejscach
Build Phases
, ale to wszystko jest gotowe od razu po prostu dodać go doEmbedded Binaries
ustawienia zGeneral
karcie hostingu aplikacji.I nie nie trzeba skonfigurować dodatkową
Copy Files
fazę, która wydaje się intuicyjnie zbędny w odniesieniu do etapu osadzania tak. Sprawdzając końcowy zapis kompilacji, możemy upewnić się, że nie jest to konieczne.[Usunięto wiele pełnych linii, ale wynika to z uproszczonego zapisu w interfejsie użytkownika Xcode.]
Nadal nie mam pojęcia, dlaczego Xcode
DYLIB_INSTALL_NAME_BASE
nieprawidłowo ustawił dla mnie wartość.źródło
W moim przypadku rozwiązaniem było usunięcie skompilowanej struktury z osadzonych plików binarnych, która była samodzielnym projektem w obszarze roboczym, wyczyszczenie i przebudowanie go, a na końcu ponowne dodanie do osadzonych plików binarnych.
źródło
Moje środowisko: Cocos2d 2.0, Box2d, Cel C
Oprócz wykonania innych odpowiedzi powyżej, w końcu poszedłem do zakładki Ogólne i ustawiłem WatchKit jako opcjonalny.
źródło
Jeśli używasz frameworka innej firmy i używasz Cocoapods jako menedżera zależności, spróbuj
pod install
odświeżyć swoje kapsułki.Ta awaria miała miejsce w bibliotece innej firmy, z której korzystałem, więc cieszę się, że powyższe rozwiązanie działało dla mnie, mam nadzieję, że zadziała dla Ciebie!
źródło
Rozwiązano dla mnie, odznaczając opcję „Kopiuj tylko po zainstalowaniu” w Fazach kompilacji-> Osadź ramy
źródło
Jest to błąd czasu wykonywania spowodowany przez
Dynamic Linker
Błąd
Library not loaded
z@rpath
wskazuje, żeDynamic Linker
nie można znaleźć pliku binarnego.Sprawdź, czy dodano ramy dynamiczne
General -> Embedded Binaries
Sprawdź
@rpath
konfigurację między konsumentem (aplikacją) a producentem (dynamiczne środowisko):Build Settings -> Dynamic Library Install Name
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Dynamiczny linker
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
który jest używany przezloadable bundle
(Dynamic framework
jako pochodną), gdziedyld
wchodzi w gręDynamic Library Install Name
- ścieżka do pliku binarnego (nie .framework). Tak, mają taką samą nazwę, aleMyFramework.framework
jestpackaged bundle
zMyFramework
pliku binarnego i zasobów wewnątrz.Ta ścieżka katalogu mogą być bezwzględne lub względne (np
@executable_path
,@loader_path
,@rpath
). Ścieżka względna jest bardziej preferowana, ponieważ jest zmieniana wraz z kotwicą, która jest przydatna, gdy dystrybuujesz swój pakiet jako pojedynczy katalogścieżka absolutna - przykład Framework1
@executable_path
@executable_path - względem wejścia binarnego - Framework2 Przykład
użycia : osadzenie a
Dynamic framework
w aplikacji@loader_path
@ loader_path - w stosunku do pakietu, który jest właścicielem tego binarnego
przypadku użycia: framework z osadzonym frameworkiem - Framework3_1 z Framework3_2 wewnątrz
@rpath - Ścieżka wyszukiwania Runpath
Framework2Przykład
Wcześniej musieliśmy skonfigurować Framework do pracy z dyld. Nie jest to wygodne, ponieważ ten sam Framework nie może być używany z różnymi konfiguracjami
@rpath
jest złożoną koncepcją opartą na częściach zewnętrznych (Aplikacja) i zagnieżdżonych (Dynamiczne środowisko):Podanie:
Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)
- określa listę szablonów, które można zastąpić@rpath
.Build Phases -> Embed Frameworks -> Destination, Subpath
chcesz znaleźć dokładnie miejsce osadzeniaDynamic Framework:
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
- punkt@rpath
używany razem z lokalną ścieżką pakietu do pliku binarnego*
../
- przejdź do rodzica bieżącego kataloguotool
- narzędzie do wyświetlania plików obiektowychinstall_name_tool
zmień nazwy instalacji dynamicznej biblioteki współużytkowanej za pomocą-rpath
CocoaPods
używause_frameworks!
[Informacje] do regulowaniaDynamic Linker
[Słownictwo]
źródło
Ostatnio natknąłem się na ten problem z importowaniem CoreNFC na starszych telefonach (np. IPhone 6) i Xcode (11.3.1). Udało mi się sprawić, żeby to zadziałało
To pozwoliło mi skompilować dla starszych / nowszych iPhone'ów bez wprowadzania jakichkolwiek zmian w kodzie. Mam nadzieję, że to pomaga innym.
źródło
Miałem ten sam problem. Próbowałem zbudować swój projekt na iPhonie, którego nigdy wcześniej nie używałem i nie dodałem nowego frameworka. Dla mnie sprzątanie działało dobrze ( Shift + Command + K ). Może to dlatego, że używam wersji beta Xcode 7 i iPhone'a 6 z iOS 9 Beta, ale działało.
źródło
W moim przypadku mój projekt jest napisany przez cel-c, aw bibliotece znajdują się pliki Swift. Dlatego zmieniłem „Zawsze osadzaj szybkie biblioteki standardowe” na karcie Ustawienia kompilacji mojego projektu na Tak i stało się to całkowicie w porządku.
źródło
W przypadku każdego projektu lub projektu Framework w Xcode, które używają zasobników, jednym z łatwych sposobów uniknięcia ładowania biblioteki dynamicznej (dylb) jest ustawienie pliku zasobnika na atrament w trybie statycznym. Aby to zrobić, pamiętaj, aby nie zapisywać następującego wiersza w pliku pod.
Po usunięciu wiersza z zapisanego pliku wystarczy uruchomić z konsoli:
źródło
Jeśli masz programistę Pod usuń aplikację z symulatora instalacji z pod -> wyczyść -> uruchom ponownie ...
źródło
Tak samo było, gdy stworzyłem nowy schemat konfiguracji i kompilacji.
Więc rozwiązaniem było dla mnie uruchomienie
dla tej nowo utworzonej konfiguracji.
źródło
Po wypróbowaniu wszystkich metod dostępnych w Internecie i moich 100 prób prób i błędów. W końcu udało mi się to rozwiązać. - Apeksha Sahu 6 minut temu
Przejdź do iTunes na Macu -> konta -> Autoryzuj ten komputer - Apeksha Sahu 5 minut temu
drugi krok .... Przejdź do dewelopera w ustawieniach na iPadzie i iPhonie i ponownieindeksuj z identyfikatorami i wyczyść wszystko komputery zaufania. To działało dla mnie ........ ....... Po ponownej instalacji Mac OSHigh seria 10.13.15 wersja z najnowszej wersji Mac OS seirra beta, do ponownej instalacji najnowszej wersji Xcode, po zaktualizowaniu wszystkich certyfikatów. etc etc etc ... tyle metod, ile możesz sobie wyobrazić. -
źródło
Spróbuj zmienić flagę
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
(we wcześniejszych wersjach xcode:)Embedded Content Contains Swift Code
w Ustawieniach kompilacji z NIE na TAK.źródło
Xcode 11
źródło
W Xcode 11
Miałem do czynienia z tym samym problemem
Zmiana „Nie osadzaj” na karcie Ogólne > „Szkielety, biblioteki i treści osadzone” nadal powodowała ten sam błąd.
Rozwiązałem dla mnie dodanie frameworka w zakładce Fazy kompilacji > sekcja Osadzanie frameworków
- Zaktualizowano ---
Zauważyłem to w projektach zbudowanych w poprzednich wersjach Xcode Embed Frameworks nie jest dostępna podczas uruchamiania w Xcode 11, Znajdź poniższe kroki, aby osiągnąć rozwiązanie:
1: Najpierw musisz dodać nową fazę kopiowania plików w zakładce Fazy kompilacji .
2: Po drugie zmień nazwę dodanej fazy na Embed Frameworks
3: Zmień miejsce docelowe na Frameworki .
4: Dodaj strukturę, dla której wystąpił błąd.
źródło
Chociaż wszyscy mówią, aby osadzić platformę pod osadzonymi plikami binarnymi, ale nadal nie działa, ponieważ brakuje nam tutaj jednego ważnego kroku.
Oto dwa właściwe kroki, aby dodać pliki binarne na karcie Osadzone pliki binarne:
Usuń platformę, która powoduje błąd z „Połączonych ram i bibliotek” na karcie Ogólne.
Teraz dodaj usuniętą strukturę tylko na karcie Osadzone pliki binarne i to wszystko, co trzeba zrobić.
Uruchom go na urządzeniu i zachowaj ten uśmiech;)
źródło
Powyższe kroki rozwiązały moje problemy.
źródło
W przypadku, gdy ktoś nadal ma ten problem, pomimo wykonania wszystkich kroków opisanych w wielu innych odpowiedziach, może być konieczne odwołanie i ponowne utworzenie certyfikatu do podpisywania kodu , zgodnie z następującymi zasadami:
https://developer.apple.com/library/ios/qa/qa1886/_index.html
źródło