使用Firebase Unity SDK时出现Firebase Xcode链接器命令错误



Firebase Unity SDK 1.1.1。Unity 5.5.0p4XCode 8.2.1

当使用Firebase的身份验证和数据库时,我在XCode中构建项目时遇到以下错误:

体系结构arm64:
"_OBJC_CLASS_$_FIRGoogleAuthProvider"的未定义符号,引用自:libAuth.a中的objc类引用(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_objc_class_$_FIRGitHubAuthProvider",引用自:libAuth.a中的objc类引用(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_objc_class_$_FIREmailPasswordAuthProvider",引用自:libAuth.a中的objc类引用(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_objc_class_$_FIRFacebookAuthProvider",引用自:libAuth.a中的objc类引用(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_objc_class_$_FIRApp",引用自:libApp.a中的objc类引用(app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o)
"_objc_class_$_FIRAuth",引用自:libAuth.a中的objc类引用(auth_ios_3c64a79cf1eb3f06f9309f4d8e91ee94.o)
"_objc_class_$_FIRTwitterAuthProvider",引用自:libAuth.a中的objc类引用(credential_ios_ef8c3cf45c3329a5e5902f99026c639a.o)
"_objc_class_$_FIROptions",引用自:libApp.a中的objc类ref(app_ios_c76c7d869e568a9b561ea55e25a7dcc0.o)ld:符号不是为体系结构arm64 clang找到:错误:链接器命令失败退出代码1(使用-v查看调用)

我在XCode中遗漏了什么吗?或者在Unity有什么要检查的?

谢谢!

我花了几天时间试图找出使用Unity Cloud Build构建与本地构建的错误。希望这能帮助其他人!

本地建筑

只要你安装了CocoaPods,这就行了。如果没有安装CocoaPods,在为iOS构建之后,Unity控制台中将出现错误。除此之外,Firebase提供的说明在Unity 5.6和Xcode 8.3中运行良好。

使用Unity Cloud构建

CocoaPods在UCB上不可用,但Firebase有一个非CocoaPod的替代方案: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、数据库和分析。

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

关于这个话题已经说了很多,但我花了很多时间和试错,才收集到关于SO&Unity论坛,所以我只会发布我最终制定的解决方案,它最终为我解决了所有问题,使用Unity云构建/Unity 5.6.0f/Xcode 8.0,该项目仅使用firebase分析包

统一云构建解决方案

  • 从Unity>Assets>Play Services Resolver>iOS Resolver>Settings完全禁用cocoapods(取消选中"Podfile Generation"one_answers"Auto Install Cocoapod Tools in Editor",选择"None-do-integrate-Cooapods")p
  • 将GoogleServices-Info.plist放在Unity"Assets"文件夹中
  • 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 Uniti官方支持的一开始就判断出所有这些问题,我不会太依赖它

我也遇到了同样的问题,只是解决了它。

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

,:integrate_targets=>错误

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

然后在平台后面添加一行:ios。。。

use_frameworks!

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

我刚刚想好了,只需在unity创建的pod文件中使用旧版本,就像这个一样

目标"Unity iPhone"dopod"Firebase/Analytics","3.17.0"pod"Firebase/Auth","3.17.0"吊舱"Firebase/Core","3.17.0"pod"谷歌移动广告SDK","7.13"结束

///注意://

不要忘记在(Google Mobile Ads SDK)的构建设置中将Enable Modules(c和Objective-c)设置为yes

那么从终端打开文件夹并运行:->吊舱安装更新吊舱

:)

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

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

在Mac环境下工作。

当在Unity到iOS中构建时。请务必在以下时间之前进行检查:资产->iOS解析程序->设置

  • Cocoapods集成
    • Xcode工作区-将可可荚添加到Xcode工作空间
  • 在编辑器中自动安装Cocoapods工具

构建到iOS并打开.workspace文件。

然后转到Pods->Podfile并添加过去的发布版本(3.7.0),因为4.0.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

它将删除当前的versión,并用3.7.0 取而代之

打开xCode并按产品->清洁和产品->构建

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

这是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

CocoaPods

CocoaPods是iOS/AcOS项目的依赖管理器。它用于将外部框架/库安装到您的项目中。


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

您需要在系统上安装茧: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负责在Xcode项目中设置iOS项目的所有引用库。由于Unity Build Cloud不支持它们,您需要手动执行。

  • 确保您已在macOS系统上安装了cocoapods:https://guides.cocoapods.org/using/getting-started.html#toc_3

  • 在本地构建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应该可以工作

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

值得一提的是,IOS的大楼是的继任者

构建完成,结果为"成功">

但在安装pod 时出错

解决方案一

在mac终端上,将目录更改为应该包含Podfile的构建文件夹

执行以下

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

从统一重建项目应自动安装pods

其他解决方案

从GitHub安装

有关的更多信息,请参阅Firebase吊舱

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

这些指令可用于访问其他分支、标记或提交处的Firebase repo。

背景

有关覆盖pod源位置的说明和选项,请参阅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-版本。

2-删除任何不需要的组件的pod,除非必须始终包含FirebaseCore。

3-将标签更新到最新的Firebase版本。参见发行说明

4-运行pod更新。

最新更新