Ios 在不使用Cocoapods的情况下手动集成Firebase和Google登录SDK时复制符号
在现有iOS项目中手动集成Firebase和Google登录SDK时,我遇到重复符号错误 这里的相关SO问题没有帮助,因为它使用椰子荚 我按时间顺序采取的步骤:Ios 在不使用Cocoapods的情况下手动集成Firebase和Google登录SDK时复制符号,ios,firebase,firebase-authentication,google-signin,Ios,Firebase,Firebase Authentication,Google Signin,在现有iOS项目中手动集成Firebase和Google登录SDK时,我遇到重复符号错误 这里的相关SO问题没有帮助,因为它使用椰子荚 我按时间顺序采取的步骤: 将下载的Firebase SDK(3.11.0)中的Analytics、Auth和Database文件夹以及Firebase.h文件复制到我的项目中,并添加到目标中 将GoogleService-Info.plist复制到项目中并添加到目标中 将-ObjC标志添加到其他链接器标志 将下载的Google登录SDK(4.0.1)中必要的框
Firebase
Analytics
FirebaseAnalytics.framework
FirebaseCore.framework
FirebaseInstanceId.framework
GoogleInterchangeUtilities.framework
GoogleSymbolUtilities.framework
GoogleToolboxForMac.framework
Auth
FirebaseAuth.framework
GTMSessionFetcher.framework
GoogleSignIn
GoogleAppUtilities.framework
GoogleSignIn.bundle
GoogleSignIn.framework
GoogleSignInDependencies.framework
GoogleSymbolUtilities.framework (removed as Firebase Analytics already includes it)
以下是错误日志(已截断):
真正的问题是;你为什么直接复制而不是使用CoCoapod?使用你的方法真的没有好处。如果你使用椰子荚,你就不会有这个问题。如果我是你,我会删除这些文件并安装cocoapods。安装cocoapods时出错的空间要小得多这就是我解决问题的方法,尽管它远不是理想的解决方案 (此解决方案可应用于任何情况,其中两个静态库由于都包含公共类并使用
-ObjC
或-all_load
标志而导致“重复符号”错误。)
将GoogleSignInDependencies文件复制到GoogleSignInDependencies.framework中的单独位置路径中。这个文件是一个fat文件,意味着它有不同体系结构的代码
打开终端并转到路径
$ cd PATH
运行以下命令以获取有关fat库的信息
$ lipo -info GoogleSignInDependencies
您将得到以下结果
Architectures in the fat file: GoogleSignInDependencies are: armv7 i386 x86_64 arm64
如您所见,fat文件中有4种体系结构
通过运行以下命令,从fat文件中获取精简文件(仅包含一种体系结构的代码的文件)
$ lipo -thin armv7 GoogleSignInDependencies -output armv7.a
$ lipo -thin i386 GoogleSignInDependencies -output i386.a
$ lipo -thin x86_64 GoogleSignInDependencies -output x86_64.a
$ lipo -thin arm64 GoogleSignInDependencies -output arm64.a
$ cd armv7
$ ar -x armv7.a
$ cd ../i386
$ ar -x i386.a
$ cd ../x86_64
$ ar -x x86_64.a
$ cd ../arm64
$ ar -x arm64.a
$ cd armv7
$ libtool -static *.o -o armv7-new.a
$ cd ../i386
$ libtool -static *.o -o i386-new.a
$ cd ../x86_64
$ libtool -static *.o -o x86_64-new.a
$ cd ../arm64
$ libtool -static *.o -o arm64-new.a
$ cd PATH_NEW
$ lipo -create armv7-new.a i386-new.a x86_64-new.a arm64-new.a -output GoogleSignInDependencies-new
您将获得名为armv7.a、i386.a、x86_64.a和arm64.a的4个精简文件
删除GoogleSignIndependences文件,我们不再需要它了
创建4个名为armv7、i386、x86_64和arm64的新文件夹。然后将精简文件armv7.a、i386.a、x86_64.a和arm64.a移动到相应的文件夹中。您应该具有如下所示的文件夹结构
arm64
arm64.a
armv7
armv7.a
i386
i386.a
x86_64
x86_64.a
从终端转到4个文件夹中的每个文件夹,并使用以下命令从精简文件中提取对象文件(*.o)
$ lipo -thin armv7 GoogleSignInDependencies -output armv7.a
$ lipo -thin i386 GoogleSignInDependencies -output i386.a
$ lipo -thin x86_64 GoogleSignInDependencies -output x86_64.a
$ lipo -thin arm64 GoogleSignInDependencies -output arm64.a
$ cd armv7
$ ar -x armv7.a
$ cd ../i386
$ ar -x i386.a
$ cd ../x86_64
$ ar -x x86_64.a
$ cd ../arm64
$ ar -x arm64.a
$ cd armv7
$ libtool -static *.o -o armv7-new.a
$ cd ../i386
$ libtool -static *.o -o i386-new.a
$ cd ../x86_64
$ libtool -static *.o -o x86_64-new.a
$ cd ../arm64
$ libtool -static *.o -o arm64-new.a
$ cd PATH_NEW
$ lipo -create armv7-new.a i386-new.a x86_64-new.a arm64-new.a -output GoogleSignInDependencies-new
运行这些命令后,4个文件夹中的每个文件夹都应包含以下文件。(这在将来的版本中可能会更改。)
从4个文件夹中删除与Firebase库冲突的文件。您需要删除这6个文件。(这在将来的版本中可能会更改。)
删除精简文件armv7.a、i386.a、x86_64.a和arm64.a
通过运行以下命令,将剩余的对象文件合并为精简文件
$ lipo -thin armv7 GoogleSignInDependencies -output armv7.a
$ lipo -thin i386 GoogleSignInDependencies -output i386.a
$ lipo -thin x86_64 GoogleSignInDependencies -output x86_64.a
$ lipo -thin arm64 GoogleSignInDependencies -output arm64.a
$ cd armv7
$ ar -x armv7.a
$ cd ../i386
$ ar -x i386.a
$ cd ../x86_64
$ ar -x x86_64.a
$ cd ../arm64
$ ar -x arm64.a
$ cd armv7
$ libtool -static *.o -o armv7-new.a
$ cd ../i386
$ libtool -static *.o -o i386-new.a
$ cd ../x86_64
$ libtool -static *.o -o x86_64-new.a
$ cd ../arm64
$ libtool -static *.o -o arm64-new.a
$ cd PATH_NEW
$ lipo -create armv7-new.a i386-new.a x86_64-new.a arm64-new.a -output GoogleSignInDependencies-new
将新创建的精简文件armv7 new.a、i386 new.a、x86_64-new.a和arm64 new.a复制到新位置路径_new。您可以删除路径中的所有其他内容
通过运行以下命令,将新的精简文件合并到新的fat文件中
$ lipo -thin armv7 GoogleSignInDependencies -output armv7.a
$ lipo -thin i386 GoogleSignInDependencies -output i386.a
$ lipo -thin x86_64 GoogleSignInDependencies -output x86_64.a
$ lipo -thin arm64 GoogleSignInDependencies -output arm64.a
$ cd armv7
$ ar -x armv7.a
$ cd ../i386
$ ar -x i386.a
$ cd ../x86_64
$ ar -x x86_64.a
$ cd ../arm64
$ ar -x arm64.a
$ cd armv7
$ libtool -static *.o -o armv7-new.a
$ cd ../i386
$ libtool -static *.o -o i386-new.a
$ cd ../x86_64
$ libtool -static *.o -o x86_64-new.a
$ cd ../arm64
$ libtool -static *.o -o arm64-new.a
$ cd PATH_NEW
$ lipo -create armv7-new.a i386-new.a x86_64-new.a arm64-new.a -output GoogleSignInDependencies-new
在您的Xcode项目中,使用新生成的GoogleSignInDependencies new代替GoogleSignInDependencies
我强烈推荐下面的文章来加深对这些事情的理解
更新2019-01-17-黑客谷歌登录现在是多余的!
根据下面的xmasalov回复,Firebase已经更新,在/invests
目录中包含Google登录所需的所有依赖项。只需添加:
- 谷歌签名框架
- GT2.2框架
- GoogleToolboxForMac.framework
请阅读以上所有评论,因为脚本可能需要调整以匹配新版本框架中的更改。以下是发生这种情况的原因(自2018年4月20日起生效):
- Firebase zip文件将每个依赖项作为单独的.framework提供。这意味着,如果已经从其他地方获取了框架,则可以手动删除重复的框架
- GoogleSignIn zip文件采用了另一种方法,将所有依赖项捆绑到GoogleSignindependences.framework中,这意味着它同时包含GTMSessionFetcher和GTMOAuth2框架
- 在Frameworks/Firebase/Storage下,删除GTMSessionFetcher.framework
- 在Frameworks/Firebase/Analytics下,删除GoogleToolboxForMac.framewo