web-dev-qa-db-fra.com

Erreur de commande de l'éditeur de liens Firebase Xcode à l'aide du SDK Firebase Unity

SDK Firebase Unity 1.1.1. Unity 5.5.0p4 XCode 8.2.1

Lors de l'utilisation de l'authentification et de la base de données à partir de Firebase, j'obtiens l'erreur suivante lors de la construction du projet dans XCode:

Symboles non définis pour l'architecture arm64:
"_ OBJC_CLASS _ $ _ FIRGoogleAuthProvider", référencé à partir de: objc-class-ref dans libAuth.a (credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_ OBJC_CLASS _ $ _ FIRGitHubAuthProvider", référencé à partir de: objc-class-ref dans libAuth.a (credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_ OBJC_CLASS _ $ _ FIREmailPasswordAuthProvider", référencé à partir de: objc-class-ref dans libAuth.a (credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_ OBJC_CLASS _ $ _ FIRFacebookAuthProvider", référencé à partir de: objc-class-ref dans libAuth.a (credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_ OBJC_CLASS _ $ _ FIRApp", référencé à partir de: objc-class-ref dans libApp.a (app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o)
"_ OBJC_CLASS _ $ _ FIRAuth", référencé à partir de: objc-class-ref dans libAuth.a (auth_ios_3c64a79cf1eb3f06f9309f4d8e91ee94.o)
"_ OBJC_CLASS _ $ _ FIRTwitterAuthProvider", référencé à partir de: objc-class-ref dans libAuth.a (credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_ OBJC_CLASS _ $ _ FIROptions", référencé à partir de: objc-class-ref dans libApp.a (app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o) ld: symbole (s) introuvable (s) pour l'architecture arm64 clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation)

Dois-je manquer quelque chose dans XCode? Ou vous avez quelque chose à vérifier dans Unity?

Merci!

12
Tim Koppers

J'ai passé quelques jours à essayer de comprendre les erreurs de construction avec Unity Cloud Build par rapport à la construction locale. J'espère que cela peut aider quelqu'un d'autre!

Construire localement

Cela a fonctionné tant que vous avez installé CocoaPods. Une erreur apparaîtra dans la console Unity après la construction pour iOS si CocoaPods n'est pas installé. En dehors de cela, les instructions fournies par Firebase ont bien fonctionné avec Unity 5.6 et Xcode 8.3.

Construire avec Unity Cloud Build

CocoaPods n'est pas disponible sur UCB mais Firebase a une alternative non CocoaPods: https://firebase.google.com/docs/ios/setup#frameworks

Ajouter des cadres manuellement

Les instructions supposent une construction iOS native, mais vous pouvez simplement faire glisser les cadres dont vous avez besoin dans Assets/Plugins/iOS/Firebase au lieu d'un projet Xcode. Unity ajoutera ces frameworks au projet Xcode lors de la construction.

Ajouter un indicateur de l'éditeur de liens

Vous devrez ajouter manuellement -ObjC Dans d'autres indicateurs de lien. Pour une raison quelconque, il est apparu dans mon projet Xcode local, mais pas lorsque UCB a fait la construction. Créez un script de post-processus un peu comme maros mentionné: https://forum.unity3d.com/threads/problem-building-ios-app-with-cloud-build-using-google-analytics.390803/#post -2549911

Vous devrez ajouter -ObjC Comme ceci:

proj.AddBuildProperty(target, "OTHER_LDFLAGS", "-ObjC");

Si vous n'ajoutez pas cette partie, UCB peut toujours créer une build mais le jeu se bloquera immédiatement après avoir essayé de créer FirebaseAuth car il fera référence à une méthode d'extension/catégorie qui n'a pas été incluse en raison de l'indicateur -ObjC Manquant.

Ajouter d'autres cadres et bibliothèques requis

Selon les fonctionnalités de Firebase que vous utilisez, vous pouvez avoir besoin de différents frameworks ou bibliothèques supplémentaires. Par exemple, j'avais utilisé FirebaseDatabase et bien que les documents ne l'aient pas mentionné, Xcode s'est plaint d'une erreur de l'éditeur de liens qui m'obligeait à ajouter libicucore.tbd.

La meilleure façon dont je pouvais penser pour résoudre ce problème était de désinstaller CocoaPods localement, puis de demander à Unity de créer le projet Xcode afin que je puisse obtenir une représentation plus précise de ce que subirait UCB. Cette partie peut nécessiter quelques essais et erreurs ainsi que la recherche sur Google pour déterminer à quel cadre ou bibliothèque l'erreur de l'éditeur de liens fait référence. Essayez simplement de construire le projet Xcode localement et vous obtiendrez les erreurs de l'éditeur de liens le cas échéant.

J'ai ajouté:

List<string> frameworks = new List<string>() {
    "AdSupport.framework",
    "CoreData.framework",
    "SystemConfiguration.framework",
    "libz.dylib",
    "libsqlite3.dylib",
    "libicucore.tbd"
};

Déplacer manuellement GoogleServices-Info.plist

Une autre bizarrerie est que UCB n'a pas déplacé GoogleServices-Info.plist dans le projet Xcode. Il doit y avoir un autre script qui ne s'exécute pas sur UCB qui s'exécute localement. Dans le script de post-traitement dans lequel vous ajoutez l'indicateur de l'éditeur de liens et les frameworks, vous pouvez également déplacer GoogleServices-Info.plist dans le répertoire du projet Xcode, puis l'ajouter au bundle.

Déplacez d'abord le fichier:

if (!File.Exists(path + "/GoogleService-Info.plist"))
{
    FileUtil.CopyFileOrDirectory ("GoogleService-Info.plist", path + "/GoogleService-Info.plist");
}

Ajoutez-le ensuite à la build:

string guid = proj.AddFile("GoogleService-Info.plist", "GoogleService-Info.plist");
proj.AddFileToBuild(target, guid);

Et ça devrait être ça. Je mettrai à jour si je rencontre d'autres problèmes à mesure que j'ajoute d'autres fonctionnalités Firebase. Actuellement, j'utilise Auth, Database et Analytics.

6
Tommy Leung

Tout d'abord, merci à tous d'avoir partagé votre (dur) travail!

Beaucoup a été dit sur le sujet, mais il m'a fallu beaucoup de temps et beaucoup d'essais et d'erreurs pour rassembler toutes les pièces sur les deux SO & Unity forums, donc je vais juste publier la solution que j'ai finalement trouvée, qui a finalement résolu tous les problèmes pour moi, en utilisant la construction de cloud d'unité/Unity 5.6.0f3/Xcode 8.0, le projet utilisant uniquement le package d'analyse Firebase

SOLUTION POUR UNITY CLOUD BUILD

  • désactiver complètement les cocoapods dans Unity> Actifs> Play Services Resolver> iOS Resolver> Paramètres (décochez "Podfile Generation" et "Auto Install Cocoapod Tools in Editor", choisissez "None - do not integrate Cocoapods") p
  • placez GoogleServices-Info.plist dans le dossier "Assets" de Unity
  • Méthode PostBuildProcessor:

private static void ProcessPostBuild (BuildTarget buildTarget, string path)
{
    // Only perform these steps for iOS builds
    #if UNITY_IOS

    Debug.Log ("[UNITY_IOS] ProcessPostBuild - Adding Google Analytics frameworks.");

    // Go get pbxproj file
    string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";

    // PBXProject class represents a project build settings file,
    // here is how to read that in.
    PBXProject proj = new PBXProject ();
    proj.ReadFromFile (projPath);
    // This is the Xcode target in the generated project
    string target = proj.TargetGuidByName("Unity-iPhone");

    proj.AddBuildProperty(target, "OTHER_LDFLAGS", "-ObjC");
    proj.AddBuildProperty(target, "OTHER_LDFLAGS", "-v");
    proj.SetBuildProperty(target, "ENABLE_BITCODE", "NO");

    if (!File.Exists(path + "/GoogleService-Info.plist"))
    {
        FileUtil.CopyFileOrDirectory("Assets/GoogleService-Info.plist", path + "/GoogleService-Info.plist");
    }
    string guid = proj.AddFile("GoogleService-Info.plist", "GoogleService-Info.plist");
    proj.AddFileToBuild(target, guid);

    // List of frameworks that will be added to project
    List<string> frameworks = new List<string>() {
        "AddressBook.framework",
        "AdSupport.framework",
        "CoreData.framework",
        "SystemConfiguration.framework",
    };

    // Add each by name
    frameworks.ForEach((framework) => {
        proj.AddFrameworkToProject(target, framework, false);
    });

    // List of frameworks that will be added to project
    List<string> usrLibFrameworks = new List<string>() {
        "libsqlite3.tbd",
        "libz.tbd",
        "libicucore.tbd",
    };

    // Add each by name
    usrLibFrameworks.ForEach((framework) => {
        proj.AddFileToBuild(target, proj.AddFile("usr/lib/"+ framework, "Frameworks/" + framework, PBXSourceTree.Sdk));
    });


    // Write PBXProject object back to the file
    proj.WriteToFile (projPath);

    #endif
}

PS, c'est fou que Firebase Unity SDK nécessite de tels hacks pour fonctionner (UCB est une exigence absolue pour nous et je suppose pour la plupart des développeurs mobiles multiplateformes) et j'espère que toutes ces solutions de contournement seront bientôt inutiles, mais juger que tous ces problèmes sont ici de le début du support officiel de Firebase Unity, je ne compterais pas trop dessus

5
jauboux

J'ai eu le même problème, je l'ai juste résolu.

Recherchez le fichier Podfile et ouvrez-le dans un éditeur de texte. retirer

,: integr_targets => false

dans la deuxième ligne, il est dit: installez! "cocoapods"

Ajoutez ensuite une nouvelle ligne après la plateforme: ios ...

use_frameworks!

Ouvrez ensuite un écran de terminal et accédez au répertoire de ce projet. Tapez "pod install" et entrez. Si tout se passe bien, un fichier d'espace de travail est créé et un message apparaît que vous devez ouvrir l'espace de travail dans Xcode à la place du projet. Fermez donc le projet dans xcode et ouvrez le fichier projectname.xcworkspace. Maintenant, Xcode ouvrira l'espace de travail et vous pourrez exécuter le projet. Vous devrez peut-être ajuster votre objectif de déploiement à 8.0. J'espère que cela fonctionne pour toi

4
Marc Denessen

J'ai eu le même problème, après avoir passé quelques heures, j'ai eu le problème principal.

C'était la version spécifique définie de la bibliothèque podfile.

target 'Unity-iPhone' do
    pod 'Firebase/Auth', '4.10.0'
    pod 'Firebase/Core', '4.10.0'
end

Lorsque l'unité construit le podfile du projet iOS, ils définissent leur dernière version de bibliothèque. Mais lorsque depuis xcode/terminal, essayez de mettre à jour la bibliothèque de pods de GIT et que la version spécifique n'est pas disponible, sa mise à jour n'a pas réussi et affiche cette erreur.

La solution est simple, il suffit de ne pas définir la version spécifique. Pod mettra à jour la dernière version du GIT.

target 'Unity-iPhone' do
    pod 'Firebase/Auth'
    pod 'Firebase/Core'
end
1
Khalid Musa Sagar

Construction de l'application Unity avec le framework Firebase localement avec Xcode:

Il s'agit de la version du SDK iOS. Cette réponse fait partie de la solution: https://stackoverflow.com/a/41908040/8063631

Travailler sur un environnement Mac.

Lors de la création dans Unity sur iOS. Assurez-vous de vérifier avant: Actifs -> Résolveur iOS -> Paramètres

  • Intégration des Cocoapods
    • Xcode Workspace - Ajoutez des cabosses de cacao à Xcode Workspace
  • Installer automatiquement les outils Cocoapods dans l'éditeur

Construisez sur iOS et ouvrez le fichier .workspace.

Ensuite, allez dans Pods -> Podfile et ajoutez la dernière version (3.7.0), car le 4.0.0 lance cette erreur.

target 'Unity-iPhone' do
    pod 'Firebase/Auth'
    pod 'Firebase/Core'
end

par (par exemple ...)

target 'Unity-iPhone' do
    pod 'Firebase/Auth', '3.7.0'
    pod 'Firebase/Core', '3.7.0'
end

Fermez xCode IDE pour éviter les conflits, puis installez Cocoapods si vous ne l'avez pas encore ( https://guides.cocoapods.org/using/getting-started.html ):

Vérifier avec:

pod --version

Installer avec:

Sudo gem install cocoapods

Accédez à votre dossier de projet en exécutant Terminal et tapez:

pod install

Il supprimera la version actuelle et la remplacera par la 3.7.0

Ouvrez xCode et appuyez sur Produit -> Nettoyer et produit -> Créer

1
Branko de Enero

j'ai eu ce problème et j'ai été résolu en mettant à jour l'installation des pods d'une manière, en effaçant la copie mise en cache localement et en la réinstallant et une autre façon était de forcer l'installation à provenir d'une source en ligne

il convient de mentionner que le bâtiment à IOS a été réussi

Construction terminée avec le résultat "Réussi"

mais a rencontré une erreur lors de l'installation des modules

Solution un

sur le terminal mac, changez le répertoire en dossier construit qui doit contenir un Podfile

exécuté ce qui suit

$ pod repo remove master
$ pod install --repo-update

Reconstruire le projet à partir de l'unité devrait installer automatiquement le pods

Autre solution

Installation à partir de GitHub

voir modules Firebase pour plus d'informations

Pour les versions commençant par 5.0.0, la source de chaque version est également déployée sur CocoaPods master et disponible via la syntaxe CocoaPods Podfile standard.

Ces instructions peuvent être utilisées pour accéder au référentiel Firebase dans d'autres branches, balises ou commits.

Contexte

Voir la référence de syntaxe Podfile pour obtenir des instructions et des options sur la substitution des emplacements de source de pod.

Instructions d'installation étape par étape du module source

Pour iOS, copiez un sous-ensemble des lignes suivantes dans votre Podfile:

pod 'Firebase' # To enable Firebase module, with `@import Firebase` support pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseAuth', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseDatabase', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseFunctions', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseMessaging', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseStorage', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0'

Pour macOS et tvOS, copiez un sous-ensemble des éléments suivants: pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseAuth', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseDatabase', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0' pod 'FirebaseStorage', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '5.0.0'

1- Assurez-vous d'avoir au moins la version 1.4.0 de CocoaPods - pod --version.

2- Supprimez les modules pour tous les composants dont vous n'avez pas besoin, sauf que FirebaseCore doit toujours être inclus.

3- Mettez à jour les balises vers la dernière version de Firebase. Voir les notes de version

4- Exécutez la mise à jour du pod.

0
Mahmoud Ashraf

CocoaPods

CocoaPods est un gestionnaire de dépendances pour les projets iOS/macOS. Il est utilisé pour installer des frameworks/bibliothèques externes dans votre projet.


Construction de l'application Unity avec le framework Firebase localement avec Xcode :

Vous devez avoir des cocoapods installés sur votre système: https://guides.cocoapods.org/using/getting-started.html#toc_


Construction de l'application Unity avec le framework Firebase sur Unity Build Cloud:

Pour les utilisateurs qui rencontrent ce problème sur le serveur Unity Build Cloud.

Selon ce fil de discussion du forum: https://forum.unity3d.com/threads/build-failed-cocoapods.421286/ la prise en charge des cocoapods n'est pas prise en charge. (et probablement même pas prévu pour le développement).

Les Cocoapods sont responsables d'avoir toutes les bibliothèques référencées pour la configuration de votre projet iOS dans votre projet Xcode. Comme ils ne sont pas pris en charge sur Unity Build Cloud, vous devez le faire manuellement.

  • assurez-vous d'avoir installé des cocoapods sur votre système macOS: https://guides.cocoapods.org/using/getting-started.html#toc_

  • créez votre application Unity localement (ne déclenchez pas la génération sur le cloud). La version exporte un projet Xcode (qui devrait être exécutable). Ce projet Xcode contient des bibliothèques (Frameworks) que vous devez ajouter au projet Unity.

    • déplacez tous les dossiers * .framework de EXPORTED_XCODE_PROJECT/Frameworks à YOUR_UNITY_PROJECT/Assets/Plugins/iOS par exemple: FirebaseAnalytics.framework = =, FirebaseCore.framework

    • Firebase nécessite que le framework sqlite iOS soit également inclus dans le projet. Pour cela, utilisez cette solution: https://forum.unity3d.com/threads/problem-building-ios-app-with-cloud-build-using-google-analytics.390803/#post-2549911 = Dans la classe PostBuildProcessor modifiez la méthode ProcessPostBuild,

      // ObjC - needed for Firebase proj.AddBuildProperty (target, "OTHER_LDFLAGS", "-ObjC");

      List<string> frameworks = new List<string>() { "AdSupport.framework", "CoreData.framework", "SystemConfiguration.framework", "libz.dylib", "libsqlite3.dylib", "libApp.a", "libAnalytics.a" };

Enregistrez le projet Unity et à présent, iOS Unity Build Cloud devrait fonctionner

0
maros