web-dev-qa-db-ja.com

Firebase Unity SDKを使用したFirebase Xcodeリンカーコマンドエラー

Firebase Unity SDK 1.1.1。 Unity 5.5.0p4 XCode 8.2.1

Firebaseの認証とデータベースを使用すると、XCodeでプロジェクトをビルドするときに次のエラーが発生します。

アーキテクチャarm64の未定義シンボル:
"_ OBJC_CLASS _ $ _ FIRGoogleAuthProvider"、参照元:libAuth.aのobjc-class-ref(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_ OBJC_CLASS _ $ _ FIRGitHubAuthProvider"、参照先:libAuth.a(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)のobjc-class-ref
"_ OBJC_CLASS _ $ _ FIREmailPasswordAuthProvider"、参照先:libAuth.a(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)のobjc-class-ref
"_ OBJC_CLASS _ $ _ FIRFacebookAuthProvider"、参照先:libAuth.a(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)のobjc-class-ref
"_ OBJC_CLASS _ $ _ FIRApp"、参照元:libApp.aのobjc-class-ref(app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o)
"_ OBJC_CLASS _ $ _ FIRAuth"、参照元:libAuth.a(auth_ios_3c64a79cf1eb3f06f9309f4d8e91ee94.o)のobjc-class-ref
"_ OBJC_CLASS _ $ _ FIRTwitterAuthProvider"、参照先:libAuth.aのobjc-class-ref(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_ OBJC_CLASS _ $ _ FIROptions"、参照元:libApp.a(app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o)のobjc-class-ref)ld:シンボルのシンボルが見つかりませんarm64 clang:エラー:リンカコマンドが終了コード1で失敗しました(呼び出しを表示するには-vを使用します)

XCodeで何かを見逃していますか?または、Unityでチェックするものがありますか?

ありがとう!

12
Tim Koppers

Unity Cloud Buildで構築する場合とローカルで構築する場合のエラーを把握するために数日を費やしました。うまくいけば、これは他の誰かを助けることができます!

ローカルでの構築

CocoaPodsがインストールされている限り、これは機能します。 CocoaPodsがインストールされていない場合、iOS用にビルドした後、Unityコンソールにエラーが表示されます。それ以外は、Firebaseが提供する指示はUnity 5.6およびXcode 8.3で正常に機能しました。

Unity Cloud Buildを使用したビルド

CocoaPodsはUCBでは使用できませんが、Firebaseには非CocoaPodsの代替手段があります。 https://firebase.google.com/docs/ios/setup#frameworks

フレームワークを手動で追加

手順はネイティブiOSビルドを前提としていますが、必要なフレームワークをXcodeプロジェクトではなくAssets/Plugins/iOS/Firebaseにドラッグするだけです。 Unityはこれらのフレームワークをビルド時にXcodeプロジェクトに追加します。

リンカーフラグを追加

_-ObjC_を他のリンクフラグに手動で追加する必要があります。何らかの理由で、ローカルXcodeプロジェクトに表示されましたが、UCBがビルドしたときには表示されませんでした。前述のmarosのようなポストプロセススクリプトを作成します。 https://forum.unity3d.com/threads/problem-building-ios-app-with-cloud-build-using-google-analytics.390803/#post -2549911

次のように_-ObjC_を追加する必要があります。

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

この部分を追加しない場合、UCBはビルドを作成する可能性がありますが、_-ObjC_フラグがないために含まれていない拡張機能/カテゴリメソッドを参照するため、FirebaseAuthを作成しようとするとすぐにゲームがクラッシュします。

他の必要なフレームワークとライブラリの追加

使用しているFirebase機能に応じて、異なる追加のフレームワークまたはライブラリが必要になる場合があります。たとえば、FirebaseDatabaseを使用したことがあり、ドキュメントではこれについて言及していませんでしたが、Xcodeは_libicucore.tbd_を追加する必要があるリンカーエラーについて不平を言いました。

これを解決するための最良の方法は、CocoaPodsをローカルにアンインストールしてから、UnityにXcodeプロジェクトを作成させて、UCBが経験する内容をより正確に表現することです。この部分では、リンカエラーが参照しているフレームワークまたはライブラリを特定するために、Googlingと同様に試行錯誤が必要になる場合があります。 Xcodeプロジェクトをローカルでビルドしようとすると、リンカーエラーが発生します。

追加した:

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

GoogleServices-Info.plistを手動で移動する

もう1つの奇妙な点は、UCBがGoogleServices-Info.plistをXcodeプロジェクトに移動しなかったことです。ローカルで実行されるUCBで実行されていない他のスクリプトが必要です。リンカフラグとフレームワークを追加するポストプロセススクリプトでは、GoogleServices-Info.plistをXcodeプロジェクトディレクトリに移動してから、バンドルに追加することもできます。

最初にファイルを移動します。

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

次に、ビルドに追加します。

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

そしてそれはそれであるはずです。 Firebase機能を追加する際に他の問題が発生した場合は更新します。現在、認証、データベース、分析を使用しています。

6
Tommy Leung

まず、あなたの(ハード)作業を共有してくれたすべての人に感謝します!

この件については多くのことが言われていますが、両方のすべてのピースを収集するのに、時間のlotと試行錯誤のlotがかかりましたSO&Unityフォーラム、だから私は最終的に解決したソリューションを投稿するだけで、Unity Cloud Build/Unity 5.6.0f3/Xcode 8.0を使用して、すべての問題を最終的に解決しました。

ユニティクラウド構築ソリューション

  • unity> Assets> Play Services Resolver> iOS Resolver> Settingsからcocoapodsを完全に無効にします(「Podfile Generation」および「EditorでCocoapod Toolsを自動インストール」をオフにし、「なし-Cocoapodsを統合しない」を選択します)p
  • unityの「アセット」フォルダーにGoogleServices-Info.plistを配置します
  • 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 firebase unity sdkがそのようなハックが動作することを必要とするのはクレイジーです(UCBは私たちにとって絶対的な要件であり、ほとんどのマルチプラットフォームモバイル開発者にとっては推測です)公式のFirebase Unityサポートの始まり、私はあまりそれを数えません

5
jauboux

私は同じ問題を抱えていました。それを直しました。

Podfileファイルを見つけて、テキストエディターで開きます。削除する

、:integrate_targets => false

2行目で、「インストール! 「ココアポッド」

次に、プラットフォームの後に新しい行を追加します:ios ...

use_frameworks!

次に、ターミナル画面を開き、このプロジェクトのディレクトリに移動します。 「pod install」と入力して入力します。すべてがうまくいけば、ワークスペースファイルが作成され、プロジェクトの代わりにXcodeでワークスペースを開く必要があるというメッセージが表示されます。 Xcodeでプロジェクトを閉じて、projectname.xcworkspaceファイルを開きます。これで、Xcodeがワークスペースを開き、プロジェクトを実行できるようになります。展開ターゲットを8.0に調整する必要がある場合があります。これがあなたのために働くことを願っています

4
Marc Denessen

私はちょうどそれを把握し、このようになるようにUnityによって作成されたポッドファイルで古いバージョンを使用するだけです

ターゲット「Unity-iPhone」ポッド「Firebase/Analytics」、「3.17.0」ポッド「Firebase/Auth」、「3.17.0」ポッド「Firebase/Core」、「3.17.0」ポッド「Google-Mobile-Ads」 -SDK '、' 7.13 '終了

///注意: //

(Google-Mobile-Ads-SDK)の設定を作成する際に、Enable Modules(cおよびObjective-c)をyesに設定することを忘れないでください

ターミナルからフォルダーを開いて実行します:-> pod install to update pods

:)

私は同じ問題を抱えていた、数時間を費やした後、私は主な問題を得た。

それは、ポッドファイルライブラリの定義された特定のバージョンでした。

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

IOSプロジェクトのポッドファイルをユニティビルドすると、最新のライブラリバージョンが定義されます。ただし、xcode/terminalからGITからポッドライブラリを更新しようとして、特定のバージョンが利用できない場合、更新に失敗してこのエラーが表示されます。

ソリューションは単純で、特定のバージョンを定義する必要はありません。ポッドはGITの最新バージョンを更新します。

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

Xcodeを使用してFirebaseフレームワークでUnityアプリをローカルでビルド:

IOS SDKバージョンがすべてです。この答えには解決策の一部があります: https://stackoverflow.com/a/41908040/8063631

Mac環境での作業。

Unity to iOSでビルドする場合。事前に確認してください:アセット-> iOSリゾルバー->設定

  • Cocoapods統合
    • Xcodeワークスペース-Xcodeワークスペースにココアポッドを追加します
  • EditorでCocoapods Toolsを自動インストールする

IOSにビルドし、.workspaceファイルを開きます。

次にPods-> Podfileに移動して、4.0.0がそのエラーを起動するため、過去のリリースバージョン(3.7.0)を追加します。

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

によって(たとえば...)

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

競合を避けるためにxCode IDEを閉じ、まだ持っていない場合はCocoapodsをインストールします( https://guides.cocoapods.org/using/getting-started.html ):

確認する:

pod --version

でインストール:

Sudo gem install cocoapods

ターミナルを実行してプロジェクトフォルダーに移動し、次のように入力します。

pod install

現在のバージョンを削除し、3.7.0に置き換えます。

XCodeを開き、[Product]-> [Clean and Product]-> [Build]を押します

1
Branko de Enero

この問題が発生し、ポッドのインストールを更新することで修正されました。1つの方法はローカルにキャッシュされたコピーを消去して再インストールし、別の方法はインストールをオンラインソースから強制することでした

IOSへの構築が成功したことに言及する価値がある

「成功」の結果でビルドが完了しました

しかし、ポッドのインストール中にエラーが発生しました

解決策1

macターミナルで、ディレクトリをPodfileが含まれるビルド済みフォルダーに変更します

以下を実行しました

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

Unityからプロジェクトを再ビルドすると、podsが自動的にインストールされます

その他の解決策

GitHubからインストールする

詳細については Firebase pods を参照してください

5.0.0以降のリリースでは、各リリースのソースもCocoaPodsマスターにデプロイされ、標準のCocoaPods Podfile構文を介して利用できます。

これらの手順を使用して、他のブランチ、タグ、またはコミットでFirebaseリポジトリにアクセスできます。

バックグラウンド

ポッドソースの場所を上書きする方法とオプションについては、Podfile構文リファレンスをご覧ください。

段階的なソースポッドのインストール手順

IOSの場合、次の行のサブセットを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'

MacOSおよびtvOSの場合、次のサブセットをコピーします: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-少なくともCocoaPodsバージョン1.4.0-pod --versionがあることを確認します。

2-不要なコンポーネントのポッドを削除します。ただし、FirebaseCoreを常に含める必要があります。

3-最新のFirebaseリリースにタグを更新します。 リリースノート を参照してください

4-ポッドの更新を実行します。

0
Mahmoud Ashraf

ココアポッド

CocoaPodsは、iOS/macOSプロジェクトの依存関係マネージャーです。外部のフレームワーク/ライブラリをプロジェクトにインストールするために使用されます。


Firebaseフレームワークを使用してUnityアプリをXcodeでローカルにビルドする

システムにcocoapodsをインストールする必要があります。 https://guides.cocoapods.org/using/getting-started.html#toc_


Unity Build CloudでFirebaseフレームワークを使用してUnityアプリをビルドする:

Unity Build Cloudサーバーでこの問題が発生するユーザー向け。

このフォーラムのスレッドによると、 https://forum.unity3d.com/threads/build-failed-cocoapods.421286/ cocoapodsのサポートはサポートされていません。 (そしておそらく開発の予定さえありません)。

Cocoapodsは、XcodeプロジェクトでiOSプロジェクトのセットアップ用に参照されるすべてのライブラリを保持する責任があります。 Unity Build Cloudではサポートされていないため、手動で行う必要があります。

  • macOSシステムにcocoapodsがインストールされていることを確認してください: https://guides.cocoapods.org/using/getting-started.html#toc_

  • unityアプリをローカルでビルドします(クラウドでビルドをトリガーしないでください)。ビルドは、Xcodeプロジェクト(実行可能である必要があります)をエクスポートします。このXcodeプロジェクトには、Unityプロジェクトに追加する必要があるライブラリ(Frameworks)が含まれています。

    • すべての* .frameworkフォルダーをEXPORTED_XCODE_PROJECT/FrameworksからYOUR_UNITY_PROJECT/Assets/Plugins/iOSに移動します。例:FirebaseAnalytics.frameworkFirebaseCore.framework

    • Firebaseでは、iOS sqliteフレームワークもプロジェクトに含める必要があります。そのためには、このソリューションを使用します。 https://forum.unity3d.com/threads/problem-building-ios-app-with-cloud-build-using-google-analytics.390803/#post-2549911 =クラスPostBuildProcessorでメソッドを変更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" };

Unityプロジェクトを保存すると、iOS Unity Build Cloudが動作するはずです

0
maros