【问题标题】:Could not get GOOGLE_APP_ID in Google Services file from build environment无法从构建环境获取 Google 服务文件中的 GOOGLE_APP_ID
【发布时间】:2019-11-22 04:53:09
【问题描述】:

为了设置 firebase,我使用两个配置 1.GoogleService-Info-test.plist,2.GoogleService-Info-prdn.plist 用于 UAT 和生产。为了使用 firebase 安装 crashlytics,我遵循了 firebase 文档https://firebase.google.com/docs/crashlytics/get-started?authuser=1#ios。但是当我尝试运行时,它会在运行脚本时在构建阶段抛出错误。

我尝试过不更改配置文件名,它成功了。

在构建阶段运行结构运行脚本时出现错误消息“无法从构建环境中获取 Google 服务文件中的 GOOGLE_APP_ID”。

谁能提出更好的解决方案来满足我的要求。

【问题讨论】:

  • 为什么你的文件名里有-test或者-prdn?
  • 尝试删除它们
  • 一次添加一个文件

标签: ios swift firebase crashlytics


【解决方案1】:

如果上面提供的这些解决方案不起作用,我通过进入构建阶段解决了我的问题,如图所示。点击加号并添加Google plist

【讨论】:

    【解决方案2】:

    如果您使用 popular build scripts 之一来处理多个不同的环境,了解您应该使用基于目标平台的不同 GoogleService-Info.plist 目标可能很有用:

    // iOS
    PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
    
    // watchOS
    PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.appex
    
    // macOS
    PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/Resources
    

    【讨论】:

      【解决方案3】:

      除了其他答案..

      我遇到了完全相同的错误消息的问题,在我的情况下,文件 GoogleService-Info.plist 一切正常,除了它是使用错误的应用程序包 ID 生成的(它在 XCode 中的更改比初始 Firebase 设置发生的时间晚得多),所以我必须在 Firebase 控制台中创建具有正确 Bundle ID 的新应用程序(无法编辑)并下载新的 GoogleService-Info.plist

      【讨论】:

        【解决方案4】:

        如果您的项目名称或项目路径中有空格,则会显示此错误。

        阅读更多GitHub Issue

        【讨论】:

        • 谢谢,但这对我没有帮助。在我的情况下,项目路径中没有空格,但仍然出现此错误。
        【解决方案5】:

        只需从您的项目设置下载并放置您正在运行的正确目标。

        【讨论】:

          【解决方案6】:

          这对我有用:

          使用 Firebase 安装 Crashlytic 时,对于多个方案,您可能会遇到错误 Could not get GOOGLE_APP_ID in Google Services file from build environment。您可以通过以下方式修复它:

          • Build Settings 中,为User Defined 中的文件名添加用户定义:

          • Build Phases 中,点击 Crashlytic 构建阶段上方的加号按钮 New Run Script Phase,然后在文本字段中输入此代码。请记住将 %YOUR_CUSTOM_PATH_TO_FOLDER% 重命名为 Plist 文件的路径:
          GOOGLE_SERVICE_INFO_PLIST_FROM="${PROJECT_DIR}/%YOUR_CUSTOM_PATH_TO_FOLDER%/${FIREBASE_CONFIG_FILE}.plist"
          BUILD_APP_DIR="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}"
          GOOGLE_SERVICE_INFO_PLIST_TO="${BUILD_APP_DIR}/GoogleService-Info.plist"
          cp "${GOOGLE_SERVICE_INFO_PLIST_FROM}" "${GOOGLE_SERVICE_INFO_PLIST_TO}" 
          

          【讨论】:

          • 为了使其保持一致:GOOGLE_SERVICE_INFO_PLIST_FROM="${PROJECT_DIR}/%YOUR_CUSTOM_PATH_TO_FOLDER%/${FIREBASE_CONFIG_FILE}.plist" BUILD_APP_DIR="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" GOOGLE_SERVICE_INFO_PLIST_TO="${BUILD_APP_DIR}/GoogleService-Info.plist" cp "${GOOGLE_SERVICE_INFO_PLIST_FROM}" "${GOOGLE_SERVICE_INFO_PLIST_TO}" 但这个解决方案确实适用于多个方案共享相同的目标和不同的捆绑 id。
          • 我收到以下错误:unexpected EOF while looking for matching "' ` 和 ` 语法错误:文件意外结束命令 PhaseScriptExecution 失败,退出代码为非零 `
          • @huync 运行此脚本时出错 ${PODS_ROOT}/FirebaseCrashlytics/run 输入文件路径应该是什么?
          • @Ollikas 如果您遇到同样的问题并已解决。请告知输入文件路径是什么?我在运行脚本时遇到了同样的错误。
          【解决方案7】:

          @react-native-firebase/crashlytics 遇到了同样的问题

          如果您遇到此问题,您可能错过了以下链接中提到的“ios 设置”说明。请按照说明解决问题。 https://rnfirebase.io/#generating-ios-credentials

          【讨论】:

            【解决方案8】:

            我的解决方案是删除对 upload-symbols 脚本的调用。

            Crashlytics 指南之一提到您应该添加以下内容:

            ${PODS_ROOT}/FirebaseCrashlytics/run
            /path/to/pods/directory/FirebaseCrashlytics/upload-symbols  <- Not needed
            

            我误解了这一点...运行脚本已经调用了上传符号,因此无需添加第二个调用。

            【讨论】:

            • 我收到一个错误:无法从构建环境中获取 Google 服务文件中的 GOOGLE_APP_ID
            • @ashwinitechnopurple 确保您已将 Firebase 中的 plist 添加到您的项目中,并且它也已添加到正确的应用目标中
            【解决方案9】:

            在我的情况下,我的文件中有一个不同的名称,当我将其更改为正常名称时,他的名称是 GoogleService-Enterprise-Info.plis GoogleService-Info.plist强>,它工作正常!!

            【讨论】:

              【解决方案10】:

              我为几个带有白标签的应用程序使用了多种配置。我添加了一个用户定义变量 FIREBASE_SUFFIX 并将我的脚本更改为以下内容:

              ${PODS_ROOT}/FirebaseCrashlytics/run -gsp ${PROJECT_DIR}/Firebase/GoogleService-Info-${FIREBASE_SUFFIX}.plist
              

              注意:我在这里使用 Carthage 作为 Firebase:https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md。如果你是同样的设置,你应该使用类似这样的东西(替换你放置脚本文件的路径):

              ${PROJECT_DIR}/scripts/run -gsp ${PROJECT_DIR}/Firebase/GoogleService-Info-${FIREBASE_SUFFIX}.plist
              

              【讨论】:

                【解决方案11】:

                我们的项目只有一个目标,但我们需要使用两个 Firebase 配置文件 GoogleService-Info-Prod.plistGoogleService-Info-Dev.plist

                我的“构建阶段”中有这个,它可以工作。

                if [ "${CONFIGURATION}" = "Release" ]; then
                ${PODS_ROOT}/FirebaseCrashlytics/run -gsp ${PROJECT_DIR}/RushCard/FirebaseConfig/GoogleService-Info-Prod.plist
                else
                ${PODS_ROOT}/FirebaseCrashlytics/run -gsp ${PROJECT_DIR}/RushCard/FirebaseConfig/GoogleService-Info-Dev.plist
                fi
                

                【讨论】:

                  【解决方案12】:

                  我在“构建阶段”中有这个,它的工作原理

                  "${PODS_ROOT}/FirebaseCrashlytics/run"
                  "${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" -gsp "${PROJECT_DIR}/MyApp/GoogleService-Info.plist" -p ios "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"
                  

                  【讨论】:

                  • 添加 -gsp-p 对我有用。我将GoogleService-Info.plist 移动到了不同的目录,所以我必须使用-gsp 来指定位置。
                  • 这是我选择的解决方案。我使用 CONFIGURATION 变量来解析这样的目标:PLIST="${PROJECT_DIR}/${TARGET_NAME}/Environment/${CONFIGURATION}/GoogleService-Info.plist"
                  【解决方案13】:

                  我遇到了同样的错误,这也是因为我有多个包标识符,因此我有一个名为 Firebase 脚本 的构建阶段脚本(它指向正确的 GoogleService-Info .plist ) 在 Crashlytics 脚本 之后运行。 解决方案是在 Crashlytics 脚本之前运行 Firebase 脚本

                  【讨论】:

                    【解决方案14】:

                    在我的例子中,我在 Compile Sources 上方创建了 New Run Script Phrase,这就是为什么我总是看到

                    无法从构建环境获取 Google Services 文件中的 GOOGLE_APP_ID

                    当我在列表末尾移动 Crashlytic 的运行脚本时,错误消失了。请看以下屏幕截图:

                    关于它的文章是here

                    【讨论】:

                    • 我也遵循了相同的步骤,但仍然出现错误:无法从构建环境中获取 Google 服务文件中的 GOOGLE_APP_ID。
                    【解决方案15】:

                    以上所有答案都是针对此问题的可能解决方案,在我的情况下,“复制捆绑资源”中缺少 GoogleService.plist 文件,方法是在我的情况下添加它。

                    检查文件转到

                    项目目录 >> 构建阶段 >> 复制捆绑资源

                    如果您发现丢失,请在此处添加。

                    【讨论】:

                      【解决方案16】:

                      当我尝试手动上传 dSYMS 时,我使用的是新的 Firebase/Crashlytics,它是 beta 版并收到错误“没有提供 Google App ID 或 Google 服务文件”

                      这里是命令:

                      /path/to/pods/directory/FirebaseCrashlytics/upload-symbols
                      -gsp/path/to/GoogleService-Info.plist -p ios /path/to/dSYMs
                      

                      然后我认为“-gsp”和 Google.plist 的路径之间应该有空格,之后它起作用了。

                      【讨论】:

                      • 你用这个命令做了什么?你是在终端运行的吗?您如何获得 dSYM 的路径?
                      • 您可以在构建部分使用 itunnes connect 获取 dsym... 是的,我在终端中运行
                      【解决方案17】:

                      确保在 xcode 文件资源管理器中显示 “GoogleService-Info.plist”

                      在我的情况下,问题是由于“GoogleService-Info.plist”参考。错误地,我只是在项目位置添加了文件,因此 xcode 左侧文件资源管理器中缺少它。

                      只需将“GoogleService-Info.plist”拖放到 xcode 中即可。

                      【讨论】:

                        【解决方案18】:

                        这对我有用:

                        确保在复制捆绑资源之后添加 Xcode Crashlytics 构建阶段。

                        【讨论】:

                        • 你是明星安德里亚!谢谢,格蕾丝
                        【解决方案19】:

                        尝试降级,它对我有用! 我用了: '面料','1.9.0' 'Crashlytics','3.12.0'

                        【讨论】:

                        • 每个人都应该始终使用最新版本的稳定软件。旧版本软件可能存在严重错误和安全问题。
                        【解决方案20】:

                        另一种方法是确保一个 plist 保留原始名称 GoogleService-Info.plist

                        不同的目标意味着我需要做更多的工作来更新 CI。

                        这至少对 Xcode 11 有效,未在任何其他版本上测试

                        【讨论】:

                        • 你怎么能确定它会将 Dsym 绑定到相关的应用程序呢?如果您有一个用于测试的捆绑包 ID 和一个用于生产的捆绑包 ID,则 plist 文件中的 GOOGLE_APP_ID 会有所不同。
                        【解决方案21】:

                        这是您可以做到的一种方法,通过让您的项目环境由目标分隔,通过这样做,您可以添加不同的 plist 文件并检查它们所属的目标,这样当您编译目标时会取它对应的plist文件

                        另一种实现方式,或查找如何实现,称为具有 firebase 的多个环境,这里有一些有用的链接

                        Use different GoogleService-Info.plist for different build schemes

                        https://medium.com/rocket-fuel/using-multiple-firebase-environments-in-ios-12b204cfa6c0

                        【讨论】:

                        • 这太棒了。这应该是 FB 文档的一部分。
                        • 不要创建目标,为此使用“构建配置”。
                        • @DanSkeel 为什么?这听起来像是执行此任务的错误工具
                        • @BenLeggiero 因为目标是为完全不同的应用程序(例如手表应用程序)设计的,而不是为同一应用程序的配置而设计的。这就是为什么他们为此目的使用build configurations。这种方法的主要缺点 - 在每个源文件的 pbxproj 文件中,您会得到 重复行,这会增加解决冲突的复杂性。您可以使用配置文件的名称添加用户定义的构建设置,并在代码中使用它来根据构建配置获取正确的文件。
                        • 很棒的推理!谢谢,@DanSkeel
                        猜你喜欢
                        • 2019-12-28
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-03-06
                        • 1970-01-01
                        • 2019-09-06
                        • 1970-01-01
                        • 2016-07-17
                        • 1970-01-01
                        相关资源
                        最近更新 更多