J'ai un projet avec des frameworks cibles.
FrameworkA est le seul à utiliser un certain pod, donc dans mon fichier pod j'ai quelque chose comme
target 'MainAppTarget' do
...
end
target 'FrameworkA' do
pod 'PodA'
end
la génération réussit sans problème, mais lorsque j'exécute l'application sur un simulateur, l'application se bloque immédiatement avec le message d'erreur suivant:
dyld: Library not loaded: @rpath/PodA.framework/PodA
Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
Reason: image not found
J'ai essayé tous les suspects habituels (supprimer les données dérivées, nettoyer, désintégrer le pod ...) rien n'a fonctionné jusqu'à présent.
Une idée pourquoi cela se produirait et comment je peux le faire fonctionner sans avoir à installer tous les pods nécessairement sur les deux cibles?
L'application est en Swift 4.2.
D'après votre message d'erreur, il y a quelques points à vérifier.
dyld: Library not loaded: @rpath/PodA.framework/PodA Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA Reason: image not found
La première chose qui semble étrange est que le chemin du framework en cours de chargement (FrameworkA.framework) n'est pas intégré dans une application. Vérifiez l'onglet "Général" du MainAppTarget et assurez-vous que le cadre apparaît dans les sections "Binaires intégrés" et "Cadres et bibliothèques liés".
Deuxièmement, @rpath
Est un raccourci pour la liste des chemins de recherche runpath
, qui indique à dyld
où chercher les bibliothèques nécessaires.
Voici un exemple de projet sur Github avec une application principale qui utilise un Cocoapod, et un cadre dynamique dont dépend l'application principale qui utilise un Cocoapod différent: https://github.com/dtweston/FrameworkPodTest
Créez des paramètres que vous devez vérifier sur toutes les cibles impliquées (y compris les cibles de framework construites par le projet Pods):
LD_RUNPATH_SEARCH_PATHS
) $(inherited) @executable_path/Frameworks @loader_path/Frameworks
LD_DYLIB_INSTALL_NAME
) $(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)
DYLIB_INSTALL_NAME_BASE
) @rpath
(À nouveau déterminé par le Cocoapod)Voici une capture d'écran de l'ensemble d'applications intégré montrant comment il est présenté:
Vous pouvez utiliser otool
pour obtenir des informations sur la façon dont l'application est assemblée par xcodebuild.
Voici le binaire de l'application principale:
otool -L FrameworkPodTest
FrameworkPodTest:
@rpath/KeychainSwift.framework/KeychainSwift (compatibility version 1.0.0, current version 1.0.0)
@rpath/Lottie.framework/Lottie (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 61000.0.0)
@rpath/Framework.framework/Framework (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 1245.9.2)
...
Et le cadre binaire:
otool -L Frameworks/Framework.framework/Framework
Frameworks/Framework.framework/Framework:
@rpath/Framework.framework/Framework (compatibility version 1.0.0, current version 1.0.0)
@rpath/KeychainSwift.framework/KeychainSwift (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
@rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 1000.11.42)
@rpath/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 1000.11.42)
...
La raison pour laquelle la construction réussit est que le framework PodA
est visible par le FrameworkA
pendant la compilation (il peut y créer un lien), mais lorsque l'application se lance, elle essaie de trouver et de charger la dynamique framework PodA
requis par le FrameworkA
, et il semble que le PodA
ne soit pas intégré dans le MainAppTarget
, donc l'application se bloque avec le message d'erreur que vous avez vu .
Pour résoudre ce problème, assurez-vous que le cadre PodA
est intégré dans le MainAppTarget
. Plus précisément, vous devez vous assurer que le dernier ensemble d'applications contient le PodA.framework
Dans le sous-dossier Framewokrs
. Cocoapods copie généralement les frameworks automatiquement.
Vérifiez que les phases de construction du MainAppTarget
contiennent le [CP] Embed Pods Frameworks
Des cocoapods et que les fichiers d'entrée des scripts contiennent le chemin d'accès au framework PodA
. Quelque chose comme ça (l'exemple montre le pod Alamofire):
J'ai mis en place un projet avec les détails que vous avez publiés, mais il me semble que cocoapods gère ce cas automatiquement dans la configuration de l'espace de travail créé (vous pouvez jeter un œil à mon projet de démonstration ici: https: // github. com/DmitryBespalov/StackOverflowPodFramework ). Si votre configuration est différente, veuillez me faire part des détails et je pourrai vous aider davantage.
At first, check whether your CocoaPod is compatible (supported) or not
.
Assurez-vous d'avoir fait glisser FrameworkA
vers la section Embedded Binaries
Dans l'onglet Paramètres généraux de votre projet. Assurez-vous également que vous disposez de Embed Frameworks (1 item)
dans Phases de construction onglet et FrameworkA
y est inclus.
Voici une solution:
Première étape : faites glisser et déposez FrameworkA.framework
Dans la navigation de votre projet. Le framework Link et la bibliothèque ont ajouté cette bibliothèque.
Deuxième étape : Dans Xcode, allez dans Projet> Général> Binaire incorporé> Ajouter FrameworkA.framework
.
Troisième étape : assurez-vous que dans Build Phases les onglets Link Binary with Libraries (1 item)
et Embed Frameworks (1 item)
existent.
P.S. Je l'ai fait dans Xcode 10.2.1 mais dans Xcode 10.1, cela fonctionne de la même manière.
Moi aussi, je faisais face au même problème. Tout ce que vous devez faire est de définir les cadres tiers que vous utilisez, par exemple: - PodA comme facultatif au lieu de requis sous Lien binaire avec les bibliothèques dans la section Phases de construction. C'est tout. réessayez et il fonctionnera comme prévu.
Remarque: - Vous devez ajouter le PodA dans l'application dans laquelle vous utilisez votre framework. Il n'y a pas d'autre moyen que de créer un cadre statique composé de votre PodA et d'utiliser ce nouveau cadre statique créé dans votre cadre dynamique.