使用Firebase Unity SDK

时间:2017-01-27 14:38:46

标签: xcode unity3d firebase firebase-realtime-database firebase-authentication

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中的objc-class-ref(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
  “_OBJC_CLASS _ $ _ FIREmailPasswordAuthProvider”,引自:         libAuth.a中的objc-class-ref(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
  “_OBJC_CLASS _ $ _ FIRFacebookAuthProvider”,引自:         libAuth.a中的objc-class-ref(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
  “_OBJC_CLASS _ $ _ FIRApp”,引自:         libApp.a中的objc-class-ref(app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o)
  “_OBJC_CLASS _ $ _ FIRAuth”,引自:         libAuth.a中的objc-class-ref(auth_ios_3c64a79cf1eb3f06f9309f4d8e91ee94.o)
  “_OBJC_CLASS _ $ _ FIRTwitterAuthProvider”,引自:         libAuth.a中的objc-class-ref(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
  “_OBJC_CLASS _ $ _ FIROptions”,引自:         libApp.a中的objc-class-ref(app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o)ld:符号不符号   发现架构arm64 clang:错误:链接器命令失败   退出代码1(使用-v查看调用)

我是否想念XCode中的某些内容?或者在Unity中检查一下?

谢谢!

8 个答案:

答案 0 :(得分:6)

我花了几天时间试图弄清楚使用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构建,但您只需将所需的框架拖到Assets / Plugins / iOS / Firebase而不是Xcode项目中。 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可能仍然会创建一个版本,但是在尝试创建FirebaseAuth后游戏会立即崩溃,因为它会引用由于缺少-ObjC而未包含的扩展/类别方法标志。

添加其他所需的框架和库

根据您使用的Firebase功能,您可能需要不同的其他框架或库。例如,我使用过FirebaseDatabase,虽然文档没有提到这一点,但Xcode抱怨链接器错误,要求我添加libicucore.tbd

我能想到解决这个问题的最好方法是在本地卸载CocoaPods然后让Unity创建Xcode项目,这样我就可以更准确地表示UCB会遇到什么。这部分可能需要一些试验和错误以及谷歌搜索来确定链接器错误所指的是哪个框架或库。只是尝试在本地构建Xcode项目,如果有的话,你会得到链接器错误。

我补充说:

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

手动移动GoogleServices-Info.plist

另一个奇怪的是,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功能时遇到任何其他问题,我会更新。目前我正在使用Auth,数据库和分析。

答案 1 :(得分:4)

我遇到了同样的问题,只是修好了。

找到Podfile文件并在文本编辑器中打开它。 删除

  

,:integrate_targets =&gt;假

在第二行,所以它说: 安装! '的CocoaPods'

然后在平台之后添加一个新行:ios ...

  

use_frameworks!

然后打开终端屏幕并转到该项目的目录。输入“pod install”并输入。 如果一切顺利,将创建工作区文件,并显示一条消息,您应该在Xcode中打开工作区而不是项目。所以在xcode中关闭项目并打开projectname.xcworkspace文件。现在Xcode将打开工作区,您将能够运行该项目。您可能必须将部署目标调整为8.0。 希望这对你有用

答案 2 :(得分:4)

首先,感谢所有人分享你的(努力)工作!

关于这个问题已经说了很多,但是我花了很多时间和很多的试验和错误来收集所有SO&amp; ; Unity论坛,所以我将发布我最终解决的解决方案,最终解决了所有问题,使用统一云构建/ Unity 5.6.0f3 / Xcode 8.0,该项目仅使用firebase分析包

UNITY CLOUD BUILD的解决方案

  • 从Unity完全禁用cocoapods&gt;资产&gt;播放服务解析器&gt; iOS解析器&gt;设置(取消选中&#34; Podfile生成&#34;和&#34;在编辑器中自动安装Cocoapod工具&#34;,选择&#34;无 - 不集成Cocoapods&#34;) P
  • 将GoogleServices-Info.plist放入Unity&#34;资产&#34;夹
  • 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是我们的绝对要求,我想对于大多数多平台移动开发人员而言)并且我希望所有这些变通办法很快就会毫无用处,但是判断所有这些问题都来自官方火力基地Unity支持的开头,我不会对它过分重视

答案 3 :(得分:2)

我只是搞清楚,只需在Unity创建的pod文件中使用旧版本就像这样

目标'Unity-iPhone'做 pod'Firebase / Analytics','3.17.0' pod'Firebase / Auth','3.17.0' pod'Firebase / Core','3.17.0' pod'Google-Mobile-Ads-SDK','7.13' 端

///注: //

不要忘记在(Google-Mobile-Ads-SDK)的构建设置中将启用模块(c和Objective-c)设置为是

然后 从终端打开文件夹并运行: - &gt; pod install 更新广告

:)

答案 4 :(得分:1)

使用Xcode在本地构建具有Firebase框架的Unity应用程序:

这完全与iOS SDK版本有关。这个答案包含解决方案的一部分:https://stackoverflow.com/a/41908040/8063631

在Mac环境中工作。

在Unity中构建iOS时。请务必先检查: 资产 - &gt; iOS解析器 - &gt;设置

  • Cocoapods整合
    • Xcode工作区 - 将可可豆荚添加到Xcode工作区
  • 在编辑器中自动安装Cocoapods工具

构建iOS并打开.workspace文件。

然后去Pods - &gt; Podfile并添加过去发布的版本(3.7.0),因为4.0.0启动时出错。

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

by(例如......)

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并按产品 - &gt;清洁和产品 - &gt;构建

答案 5 :(得分:1)

我遇到了同样的问题,花了几个小时后我遇到了主要问题。

这是podfile库定义的特定版本。

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

当Unity统一构建iOS项目的podfile时,他们会定义最新的库版本。但是当从xcode / terminal尝试从GIT更新pod库并且特定版本不可用时,它无法更新并显示此错误。

解决方案很简单,不需要定义特定版本。 pod将更新GIT的最新版本。

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

答案 6 :(得分:0)

CocoaPods

CocoaPods是iOS / macOS项目的依赖管理器。它用于为项目安装外部框架/库。

使用Xcode在本地构建具有Firebase框架的Unity应用

您需要在系统上安装cocoapod:https://guides.cocoapods.org/using/getting-started.html#toc_3

在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_3

  • 在本地构建您的Unity应用程序(不要在云上触发构建)。构建导出一个Xcode项目(应该是可运行的)。此Xcode项目包含您需要添加到Unity项目的库(框架)。

    • 将所有* .framework文件夹从 EXPORTED_XCODE_PROJECT / Frameworks 移至 YOUR_UNITY_PROJECT / Assets / Plugins / iOS 例如: FirebaseAnalytics.framework FirebaseCore.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应该可以运行

答案 7 :(得分:0)

我有这个问题,并通过更新pods安装修复了一种方法是清除本地缓存的副本并重新安装它 另一种方法是强制安装来自在线资源

值得一提的是,IOS的建设成功了

  

构建已完成,结果为“成功”

但安装pod时出错

解决方案一

在mac终端上将目录更改为应包含Podfile

的构建文件夹

执行以下

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

从Unity重建项目应自动安装pods

其他解决方案

从GitHub安装

有关详细信息,请参阅Firebase pods

对于从5.0.0开始的发行版,每个发行版的源代码也部署到CocoaPods master,并通过标准CocoaPods Podfile语法提供。

这些说明可用于访问其他分支机构,代码或提交中的Firebase存储库。

背景

有关覆盖pod源位置的说明和选项,请参阅Podfile语法参考。

逐步的源Pod安装说明

对于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版本。请参阅release notes

4-运行pod update。