Dieser Absturz war ein Blockierungsproblem. Ich habe die folgenden Schritte ausgeführt, um das Problem zu reproduzieren:
- Erstellen Sie ein Cocoa Touch Framework-Projekt
- Fügen Sie eine schnelle Datei und eine Klasse Dog
- Erstellen Sie ein Framework für das Gerät
- Erstellen Sie eine Einzelansicht-Anwendung in Swift
- Framework in App-Projekt importieren
- Instanziieren Sie eine schnelle Klasse aus dem Framework in ViewController
- Erstellen Sie eine App und führen Sie sie auf dem Gerät aus
Die App stürzte sofort beim Start ab. Hier ist das Konsolenprotokoll:
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
Ich habe versucht, auf iOS 7.1- und 8.0-Geräten zu bauen, beide haben den gleichen Absturz. Ich kann jedoch eine App erstellen und auf dem Simulator gut ausführen. Ich bin mir auch bewusst, dass ich das Framework in Link Binary With Libraries in Required to Optional ändern kann , aber das Problem wurde nicht vollständig behoben. Die App stürzte ab, als ich eine Instanz von Dog erstellte . Das Verhalten auf dem Gerät und dem Simulator ist unterschiedlich. Ich vermute, dass wir mit einer Beta-Version von Xcode kein Framework für das Gerät verteilen können. Kann jemand Licht ins Dunkel bringen?
Link Binary with Libraries
in Ihr App-Bundle kopiert werden können, während dies bei benutzerdefinierten Frameworks einfach nicht der Fall ist.Antworten:
Auf der Registerkarte Allgemein des Ziels befindet sich ein Feld Eingebettete Binärdateien . Wenn Sie dort das Framework hinzufügen, wird der Absturz behoben.
Die Referenz finden Sie hier in den Apple Developer Forums.
quelle
Für iOS größer oder gleich 8
Fügen Sie auf der Registerkarte Allgemein des Ziels im Abschnitt Eingebettete Binärdateien das Framework hinzu. Dadurch wird das Framework in das kompilierte Framework kopiert, sodass es zur Laufzeit verknüpft werden kann.
Warum passiert dies? : weil das Framework, mit dem Sie verknüpfen, als dynamisch verknüpftes Framework kompiliert und somit zur Laufzeit verknüpft wird.
** Hinweis: ** Das Einbetten von benutzerdefinierten Frameworks wird nur in iOS> 8 unterstützt. Daher folgt eine alternative Lösung, die auf älteren Versionen von iOS funktioniert.
Für iOS weniger als 8
Wenn Sie dieses Framework beeinflussen (Zugriff auf den Quellcode / Build-Prozess haben), können Sie dieses Framework so ändern, dass es statisch und nicht dynamisch verknüpft ist. Dadurch wird der Code in Ihre kompilierte App aufgenommen und nicht zur Laufzeit verknüpft, sodass das Framework nicht eingebettet werden muss.
** Wie: ** Ändern Sie auf der Registerkarte Build-Einstellungen des Frameworks im Abschnitt Verknüpfung den Mach-O-Typ in Statische Bibliothek. Sie sollten das Framework jetzt nicht mehr in eingebettete Binärdateien aufnehmen müssen.
Einbeziehen von Assets: Um Dinge wie Bilder, Audio oder XIB / NIB-Dateien einzuschließen, empfehle ich, ein Bundle (im Wesentlichen ein Verzeichnis, weitere Informationen hier bit.ly/ios_bundle) zu erstellen und die Assets dann mit NSBundle aus dem Bundle zu laden.
quelle
Swift is not supported for static libraries
Nur das Framework in Ihr Projekt zu ziehen, wird nicht gut genug sein. Das ist so, als ob Sie im selben Stadion wären, aber Ihre Kinder nicht finden könnten. Folge diesen Schritten:
1) Erstellen Sie Ihr Framework
COMMAND
+B
erstellen Sie Ihr Framework und stellen Sie sicher, dass Sie "Build Succeeded" erhalten.2) Greifen Sie auf Ihr Framework zu
Products
Ordner in Ihrem Projekt darauf zugreifen ..framework
und wählen Sie "Im Finder anzeigen".3) Platzieren Sie das Framework in Ihrem Projekt
.framework
aus Ihrem Finder-Fenster in den Ordner "Framework" Ihres App-Projekts.4) Konfigurieren Sie das App-Projekt für das Framework
+
Schaltfläche. Wählen Sie in der Dropdown-Liste "Neue Phase für Kopierdateien".Destination
"Frameworks" eingestellt haben. Lassen Sie den Unterpfad leer. Klicken Sie dann+
unten links auf die Schaltfläche.5) Reinigen Sie Ihr Projekt und führen Sie es aus
COMMAND
+SHIFT
+K
COMMAND
+R
quelle
Ich habe ein Framework mit Swift3 / Xcode 8.1 erstellt und es in einem Objective-C / Xcode 8.1-Projekt verwendet. Um dieses Problem zu beheben, musste ich die
Always Embed Swift Standard Libraries
Option unter aktivierenBuild Options
.Schauen Sie sich diesen Screenshot an:
quelle
Embedded Binaries
Abschnitt meines Ziels ein . Warum funktioniert das so?Versuchen Sie zunächst, nach Befehl + Option + Umschalt + K zu erstellen. Wenn dies immer noch fehlschlägt, führen Sie die folgenden Schritte aus.
Wenn in Xcode 8 jemand auf diesen Fehler stößt, ändern Sie Ihren Framework-Status auf der Registerkarte "Allgemein" Ihres Ziels in " Optional" anstatt "Erforderlich".
quelle
Ich habe das gleiche Problem in der iOS 9.x-Version
Ich habe dieses Problem behoben, indem ich
Required
zuOptional
inLinked Frameworks and Libraries
forUserNotifications.framework
Framework gewechselt habe .quelle
Ich musste (zusätzlich zu dem, was hier erwähnt wurde) die folgende Zeile zu Runpath Search Paths auf der Registerkarte Build Settings hinzufügen :
@executable_path/Frameworks
quelle
Sie müssen das Framework einer neuen Erstellungsphase zum Kopieren von Dateien hinzufügen, um sicherzustellen, dass das Framework zur Laufzeit in das Anwendungspaket kopiert wird.
Siehe Wie eine ‚Kopieren von Dateien BUILD - Phase‘ zu meinem Ziel hinzuzufügen , für weitere Informationen.
Offizielle Apple-Dokumente: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html
quelle
Wenn Sie Xcode 11 oder neuer verwenden :
Scrollen Sie nach unten zu Frameworks, Bibliotheken und eingebetteten Inhalten .
Stellen Sie sicher, dass der Wert Einbetten & Signieren oder Ohne Signieren einbetten für die Option Einbetten ausgewählt ist, falls erforderlich.
quelle
Fügen Sie das Framework in Embedded Binaries hinzu
Dann reinigen und bauen.
quelle
Überraschenderweise sind hier nicht alle notwendigen Teile dokumentiert, zumindest für Xcode 8.
Mein Fall war ein benutzerdefiniertes Framework als Teil desselben Arbeitsbereichs. Es stellt sich heraus, dass es falsch gebaut wurde. Basierend auf Jeremyhus letzter Antwort auf diesen Thread:
https://forums.developer.apple.com/thread/4687
Ich musste
Dynamic Library Install Name Base
(DYLIB_INSTALL_NAME_BASE
) unterBuild Settings
dem Framework- Projekt setzen und es dann neu erstellen. Es war falsch eingestellt$(LOCAL_LIBRARY_DIR)
und ich musste es ändern@rpath
.In der Phase der Linkverarbeitung im App- Projekt wurde die Host-App angewiesen, das Framework zur Laufzeit dynamisch von
/Library/Frameworks/fw.Framework/fw
(wie im Stammverzeichnis des Laufzeit-Dateisystems) und nicht vom Pfad zur App zu laden/Frameworks/fw.Framework/fw
In Bezug auf alle anderen Einstellungen: Es muss sich an drei Stellen befinden
Build Phases
, aber diese werden alle gleichzeitig festgelegt, wenn Sie es einfach zurEmbedded Binaries
Einstellung auf derGeneral
Registerkarte der Hosting-App hinzufügen .Ich musste keine zusätzliche
Copy Files
Phase einrichten , die in Bezug auf die Einbettungsphase ohnehin intuitiv überflüssig erscheint. Indem wir das hintere Ende des Build-Transkripts überprüfen, können wir sicherstellen, dass dies nicht erforderlich ist.[Viele ausführliche Zeilen wurden entfernt, aber aus dem vereinfachten Transkript in der Xcode-Benutzeroberfläche geht hervor.]
Ich habe immer noch keine Ahnung, warum Xcode den
DYLIB_INSTALL_NAME_BASE
Wert falsch auf mich eingestellt hat.quelle
In meinem Fall bestand die Lösung darin, das kompilierte Framework aus den eingebetteten Binärdateien zu entfernen, die ein eigenständiges Projekt im Arbeitsbereich waren, es zu bereinigen und neu zu erstellen und schließlich wieder zu eingebetteten Binärdateien hinzuzufügen.
quelle
Meine Umgebung: Cocos2d 2.0, Box2d, Ziel C.
Zusätzlich zu den anderen Antworten oben ging ich schließlich zur Registerkarte Allgemein und machte WatchKit optional.
quelle
Wenn Sie ein Framework eines Drittanbieters verwenden und Cocoapods als Abhängigkeitsmanager verwenden, versuchen Sie,
pod install
Ihre Pods zu aktualisieren .Dieser Absturz trat in einer von mir verwendeten Drittanbieter-Bibliothek auf. Ich bin froh, dass die oben genannte Lösung für mich funktioniert hat. Ich hoffe, sie funktioniert für Sie!
quelle
Für mich behoben, indem die Option "Nur bei Installation kopieren" in Build Phases-> Embed Frameworks deaktiviert wurde
quelle
Es ist ein Laufzeitfehler, der durch verursacht wird
Dynamic Linker
Der Fehler
Library not loaded
mit@rpath
zeigt an, dassDynamic Linker
die Binärdatei nicht gefunden werden kann.Überprüfen Sie, ob das dynamische Framework hinzugefügt wurde
General -> Embedded Binaries
Überprüfen Sie das
@rpath
Setup zwischen Consumer (Anwendung) und Producer (Dynamic Framework):Build Settings -> Dynamic Library Install Name
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Dynamischer Linker
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
Dies wird vonloadable bundle
(Dynamic framework
als Ableitung) verwendet, wodyld
ins Spiel kommtDynamic Library Install Name
- Pfad zur Binärdatei (nicht .framework). Ja, sie haben die gleichen Namen, aberMyFramework.framework
einpackaged bundle
mitMyFramework
Binär - Datei und Ressourcen im Innern.Dieser Pfad zum Verzeichnis kann absolut oder relativ sein (zB
@executable_path
,@loader_path
,@rpath
). Der relative Pfad ist vorzuziehen, da er zusammen mit einem Anker geändert wird, der nützlich ist, wenn Sie Ihr Bundle als einzelnes Verzeichnis verteilenabsoluter Pfad - Framework1 Beispiel
@executable_path
@executable_path - relativ zum Eintrag binär - Framework2- Beispielanwendungsfall
: Einbetten eines
Dynamic framework
in eine Anwendung@loader_path
@loader_path - relativ zum Bundle, das Eigentümer dieses binären
Anwendungsfalls ist: Framework mit eingebettetem Framework - Framework3_1 mit Framework3_2 im Inneren
@rpath - Runpath-Suchpfad
Framework2 Beispiel
Zuvor mussten wir ein Framework einrichten, um mit dyld zu arbeiten. Dies ist nicht praktisch, da dasselbe Framework nicht mit unterschiedlichen Konfigurationen verwendet werden kann
@rpath
ist ein zusammengesetztes Konzept, das auf äußeren (Anwendung) und verschachtelten (Dynamic Framework) Teilen basiert:Anwendung:
Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)
- definiert eine Liste von Vorlagen, durch die ersetzt werden soll@rpath
.Build Phases -> Embed Frameworks -> Destination, Subpath
, ob genau das eingebettete Framework vorhanden istDynamisches Framework:
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
- Punkt,@rpath
der zusammen mit dem lokalen Bündelpfad zu einer Binärdatei verwendet wird*
../
- Wechseln Sie zum übergeordneten Verzeichnis des aktuellen Verzeichnissesotool
- Werkzeug zur Anzeige von Objektdateieninstall_name_tool
Ändern Sie die Installationsnamen der dynamischen gemeinsam genutzten Bibliothek mithilfe von-rpath
CocoaPods
verwendetuse_frameworks!
[About] , um a zu regulierenDynamic Linker
[Wortschatz]
quelle
Vor kurzem ist dieses Problem beim Importieren von CoreNFC auf ältere iPhones (z. B. iPhone 6) und Xcode (11.3.1) aufgetreten. Ich konnte es zum Laufen bringen
Dadurch konnte ich für ältere / neuere iPhones kompilieren, ohne Codeänderungen vornehmen zu müssen. Ich hoffe das hilft anderen.
quelle
Ich hatte das gleiche Problem. Ich habe versucht, mein Projekt mit einem iPhone zu erstellen, das ich noch nie zuvor verwendet habe, und ich habe kein neues Framework hinzugefügt. Für mich hat das Aufräumen gut funktioniert ( Umschalt + Befehl + K ). Vielleicht liegt es daran, dass ich Beta 5 von Xcode 7 und ein iPhone 6 mit iOS 9 Beta verwende, aber es hat funktioniert.
quelle
In meinem Fall wird mein Projekt von Objective-C geschrieben und in der Bibliothek befinden sich Swift-Dateien. Daher habe ich "Always Embed Swift Standard Libraries" auf der Registerkarte " Build Settings " meines Projekts in " Yes " geändert und es wurde völlig in Ordnung.
quelle
Für jedes Projekt oder Framework-Projekt in Xcode, das Pods verwendet, besteht eine einfache Möglichkeit, zu vermeiden, dass die dynamische Bibliothek (dylb) nicht geladen wird, darin, die Pod-Datei im statischen Modus auf Tinte zu setzen. Stellen Sie dazu sicher, dass Sie nicht die folgende Zeile in Ihre Pod-Datei schreiben.
Sobald die Zeile aus Ihrer gespeicherten Datei gelöscht wurde, führen Sie sie einfach über die Konsole aus:
quelle
Wenn Entwicklungs-Pod vorhanden ist Löschen Sie Ihre App aus dem Simulator, installieren Sie sie aus dem Pod -> Reinigen -> Führen Sie sie erneut aus ...
quelle
Das gleiche war, als ich ein neues Konfigurations- und Erstellungsschema erstellt habe.
Die Lösung für mich war also zu rennen
für diese neu erstellte Konfiguration.
quelle
Nachdem ich alle im Internet verfügbaren Methoden und meine eigenen Trial-and-Error-Tricks 100 Mal ausprobiert habe. Endlich konnte ich es lösen. - Apeksha Sahu vor 6 Minuten Gehe zu
iTunes auf dem Mac -> Konten -> Autorisiere diesen Computer - Apeksha Sahu vor 5 Minuten
Zweiter Schritt .... Gehe zum Entwickler in den Einstellungen in iPad und iPhone und indiziere alles neu mit Kennungen und klaren Vertrauenscomputern. Es hat bei mir funktioniert ........ ....... Nach der Neuinstallation von Mac OSHigh Seria 10.13.15 Version von Mac OS Seirra Beta neueste Version, um Xcode neueste Version neu zu installieren, nachdem alle Zertifikate aktualisiert wurden. etc etc etc ... so viele Methoden, wie Sie denken können, dass ich es getan habe. - -
quelle
Versuchen Sie, das Flag
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
(in früheren Xcode-Versionen :)Embedded Content Contains Swift Code
in den Build-Einstellungen von NEIN auf JA zu ändern.quelle
Xcode 11
quelle
In Xcode 11
Ich stand vor dem gleichen Problem
Das Ändern von "Nicht einbetten" auf der Registerkarte " Allgemein " > "Frameworks, Bibliotheken und eingebettete Inhalte" führte immer noch zu demselben Fehler.
Was für mich gelöst wurde, war das Hinzufügen des Frameworks im Abschnitt " Phasen erstellen" > " Frameworks einbetten"
--Aktualisiert---
Ich habe festgestellt, dass in Projekten, die in früheren Versionen von Xcode Embed Frameworks erstellt wurden, der Abschnitt nicht verfügbar ist, wenn er in Xcode 11 ausgeführt wird. Führen Sie die folgenden Schritte aus, um die Lösung zu erzielen:
1: Zunächst müssen die hinzufügen Neue Dateien kopieren Phase unter Build - Phasen - Registerkarte.
2: Ändern Sie anschließend den Namen der hinzugefügten Phase in Embed Frameworks
3: Ändern Sie das Ziel in Frameworks .
4: Fügen Sie das Framework hinzu, für das der Fehler aufgetreten ist.
quelle
Zwar sagen alle, dass das Framework unter den eingebetteten Binärdateien eingebettet werden soll, aber es funktioniert immer noch nicht, da uns hier ein wichtiger Schritt fehlt.
Hier sind die beiden richtigen Schritte zum Hinzufügen der Binärdateien auf der Registerkarte Eingebettete Binärdateien:
Entfernen Sie das Framework, das den Fehler verursacht, aus den "Verknüpften Frameworks und Bibliotheken" auf der Registerkarte "Allgemein".
Fügen Sie nun das entfernte Framework nur unter der Registerkarte Eingebettete Binärdateien hinzu, und das ist alles, was Sie tun müssten.
Führen Sie es auf dem Gerät aus und behalten Sie das Lächeln bei;)
quelle
Die obigen Schritte haben meine Probleme behoben.
quelle
Falls dieses Problem immer noch auftritt, müssen Sie möglicherweise Ihr Codesignaturzertifikat wie folgt widerrufen und neu erstellen , obwohl Sie alle in den vielen anderen Antworten beschriebenen Schritte ausgeführt haben :
https://developer.apple.com/library/ios/qa/qa1886/_index.html
quelle