web-dev-qa-db-fra.com

Utiliser des Cocoapods avec une extension d'application

J'essaie de créer une extension photo App dans Xcode 6 Beta-6 qui utilise les bibliothèques de cocoapodes. L'en-tête de pontage créé par Xcode pour l'extension photo ne peut rien voir des cocoapodes.

Par exemple: #import <GPUImage/GPUImage.h> entraîne l'erreur "GPUImage/GPUImage.h" file not found.

J'ai essayé tous les chemins imaginables pour l'importation (avec des crochets et des guillemets) et je n'ai pratiquement pas réussi. La seule exception est que pour de simples pods comme SVProgressHUD, le vilain horrible hack fonctionne: #import "../Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h".

Mais pour GPUImage, il entre dans le GPUImage.h en-tête et décide qu'il ne peut tout à coup pas voir GPUImageContext.h malgré le fait qu’il n’ait aucun problème lorsqu’il est importé avec l’en-tête de pontage pour le code Swift) normal qui ne fait pas partie de l’extension de l’application.

En quoi la compilation des extensions d'application empêche-t-elle l'en-tête de pontage de se comporter correctement?

Remarque: j'ai lu toutes les permutations possibles de ce didacticiel et elles ne sont pas immédiatement applicables, au cas où quelqu'un penserait avoir trouvé la réponse.

En outre, le problème décrit dans this SO question peut être lié, mais j'ai quand même posé cette question au cas où mon problème serait spécifique aux extensions d'application.

80
DanBlakemore

Pour ce faire, vous devez mettre à jour votre podfile en ajoutant une seule ligne:

link_with 'yourApp', 'yourAppExtension'

et une mise à jour de pod devrait résoudre le problème.

66
LeChatNoir

EDIT (2015/03/10)

Voir la nouvelle réponse acceptée. Je l'ai essayé dans un nouveau projet et cela a fonctionné, bien que mes pods de test aient tous deux utilisé sharedApplication, ce qui est interdit dans les extensions. Le fait qu’ils aient montré ces erreurs signifie que tout est lié correctement. Bien aller @LeChatNoir!


Succès.

La solution est la suivante: Une fois que vous avez l'extension de votre application et son en-tête de pontage dans un projet utilisant des cocoapodes, vous souhaitez utiliser l'une de ces bibliothèques, en essayant d'inclure le pod comme #import <GPUImage/GPUImage.h> échouera avec file not found.

Tout d’abord, assurez-vous d’indiquer l’extension de l’application (cliquez sur votre fichier de projet, puis sur la cible de l’extension) pour établir un lien avec libPods.a, un peu comme la cible de votre application.

Ensuite, dans votre projet actuel (cliquez sur votre fichier de projet, puis à nouveau sur le fichier de projet dans la section "Projet" de la barre latérale intérieure) sous l'onglet Informations, définissez la configuration de l'extension à utiliser pour Debug, Release et Inhouse. la configuration "Pods" du menu déroulant. Pod Install ne le fera pas pour vous, vous devrez donc le faire vous-même.

Enfin, assurez-vous que les cibles du projet Pods et de votre projet possèdent toutes les architectures pour lesquelles vous devez créer dans la variable Architectures valides, sinon vous obtiendrez l'erreur toujours amusante des symboles non définis.

Ceci devrait fonctionner et vous permettre d'importer les pods de votre choix comme d'habitude.


EDIT (2014/10/14): En passant, étant donné que vous pouvez également inclure des fichiers Objective-C à partir de votre propre code de projet dans l'extension Swift, vous devez vous assurer que .m Les fichiers que vous avez placés dans l'en-tête de pontage sont également compilés par la cible de l'extension. Vous pouvez le faire depuis le menu de compilation des sources pour la cible ou dans le .m fichier lui-même en utilisant la section "Adhésion à la cible" de la barre latérale droite dans Xcode.

85
DanBlakemore

Les réponses ci-dessus vont fonctionner, mais je ne voulais que quelques pods dans mon extension, alors j'ai fait ce qui suit pour mon Podfile:

target '[Main App Target Name]' do
        pod ...
        pod ...
        pod ...
end

target '[Extension Target Name]' do
        pod ...
end

Et puis un pod install le fera!

67
wyzkid207

enter image description here

link_with, vous ne l'utiliserez plus.

Fichier Podfile non valide: [!] La spécification de link_with _ dans le fichier podfile n'est plus pris en charge, utilisez plutôt des blocs cible.

Voici la réponse parfaite, testée également.

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, ‘9.0’
use_frameworks!
inhibit_all_warnings!

target 'DemoTodayWidget' do
    pod 'Reachability',                         '~> 3.2'
end

target 'My Widget' do
    pod 'Reachability',                         '~> 3.2'
end
1
Mehul