使用Firebase Unity SDK的Firebase Xcode链接器命令错误

Tim*_*ers 12 xcode unity-game-engine firebase firebase-authentication firebase-realtime-database

Firebase Unity SDK 1.1.1.Unity 5.5.0p4 XCode 8.2.1

从Firebase使用身份验证和数据库时,在XCode中构建项目时出现以下错误:

对于建筑arm64未定义的符号:
"_OBJC_CLASS _ $ _ FIRGoogleAuthProvider",从引用:在libAuth.a(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)objc级-REF
"_OBJC_CLASS _ $ _ FIRGitHubAuthProvider",从引用:objc级-REF在libAuth.a(credential_ios_ef8c3cf45c3329a5e5902f99026c639a. O)
"_OBJC_CLASS _ $ _ FIREmailPasswordAuthProvider",从引用:在libAuth.a(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)objc级-REF
"_OBJC_CLASS _ $ _ FIRFacebookAuthProvider",从引用:在libAuth.a(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)objc级-REF
"_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",引自:o libApp.a中的bjc-class-ref(app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o)ld:找不到架构arm64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)

我在XCode中想念一下吗?或者在Unity中检查一下?

谢谢!

小智 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"
};
Run Code Online (Sandbox Code Playgroud)

手动移动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");
}
Run Code Online (Sandbox Code Playgroud)

然后将其添加到构建中:

string guid = proj.AddFile("GoogleService-Info.plist", "GoogleService-Info.plist");
proj.AddFileToBuild(target, guid);
Run Code Online (Sandbox Code Playgroud)

这应该是它.如果我在添加更多Firebase功能时遇到任何其他问题,我会更新.目前我正在使用Auth,数据库和分析.


jau*_*oux 5

首先,感谢大家分享您的(辛苦的)工作!

关于这个话题已经说了很多,但是我花了很多时间和大量的反复试验才能在SO&Unity论坛上收集所有内容,所以我将发布最终解决的解决方案,终于使用unity cloud build / Unity 5.6.0f3 / Xcode 8.0为我解决了所有问题,该项目仅使用Firebase分析包

统一云构建的解决方案

  • 完全从Unity>资产> Play服务解析器> iOS解析器>设置中禁用cocoapods(取消选中“ Podfile生成”和“在编辑器中自动安装Cocoapods工具”,选择“无-不集成Cocoapods”)p
  • 将GoogleServices-Info.plist放入Unity“资产”文件夹
  • 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
}
Run Code Online (Sandbox Code Playgroud)

PS疯狂的是,firebase unity sdk要求这样的hack才能起作用(UCB是我们的绝对要求,我猜对于大多数多平台移动开发人员来说),我希望所有这些解决方案很快都将无用,但是判断所有这些问题均来自此正式提供Firebase Unity支持的开始,我不会对此过多地指望


小智 4

我有同样的问题,刚刚解决了。

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

, :integrate_targets => false

在第二行中,它显示:安装!'可可足类'

然后在platform: ios后面添加新行...

使用框架!

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