Ios 在不使用Cocoapods的情况下手动集成Firebase和Google登录SDK时复制符号

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)中必要的框

在现有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
    从该目录到您的项目。您不再需要从Google下载GoogleSignIn框架

    我的原始答复(请忽略): 如果您有这个问题,我刚刚编写了一个bashshell脚本,它为我完成了所有的工作。我已经把它保存为一个文件。使用它的风险自负


    请阅读以上所有评论,因为脚本可能需要调整以匹配新版本框架中的更改。

    以下是发生这种情况的原因(自2018年4月20日起生效):

  • Firebase依赖于GTMSessionFetcher库
  • Google登录依赖于GTMSessionFetcher库和GTMOAuth2库
  • 当使用CocoaPods时,一切都会很好地解决,因为CocoaPods是一个智能的依赖关系管理器,它可以消除常见的依赖关系

    下载预构建二进制文件时,事情会变得有点棘手

    • Firebase zip文件将每个依赖项作为单独的.framework提供。这意味着,如果已经从其他地方获取了框架,则可以手动删除重复的框架

    • GoogleSignIn zip文件采用了另一种方法,将所有依赖项捆绑到GoogleSignindependences.framework中,这意味着它同时包含GTMSessionFetcher和GTMOAuth2框架

    如果试图按原样链接,绑定到GoogleSignIndependence中的GTMSessionFetcher框架将与Firebase附带的独立GTMSessionFetcher.framework冲突

    如果删除GoogleSignindependences框架,链接器将找不到GTMOAuth2框架并失败

    理想情况下,GoogleSignIn zip文件应该包含各个依赖项,使其更清楚地了解发生了什么。目前,这个问题有两种解决方案:

    简单:从Firebase附带的框架中删除GoogleSignIndependence中捆绑的任何内容

    • 在Frameworks/Firebase/Storage下,删除GTMSessionFetcher.framework
    • 在Frameworks/Firebase/Analytics下,删除GoogleToolboxForMac.framewo