【问题标题】:Use different GoogleService-Info.plist for different build schemes对不同的构建方案使用不同的 GoogleService-Info.plist
【发布时间】:2016-10-03 13:56:13
【问题描述】:

我正在为 prod 使用一个构建方案,一个用于暂存(具有 2 个不同的捆绑标识符),并且我正在尝试为每个方案使用单独的 GoogleService-Info.plist。 初始化 GCM(和 goole 登录)时,有没有办法手动选择要使用的 plist 文件?还是可以避免使用 plist 并手动进行设置?

谢谢!

【问题讨论】:

标签: ios google-cloud-messaging google-signin


【解决方案1】:

详情

测试日期:

  • Xcode 9.2
  • Xcode 10.2 (10E125)
  • Xcode 11.0 (11A420a)

解决方案

  1. 在项目中创建包含所有 Google.plist 文件(具有不同名称)的文件夹

  1. 添加运行脚本

不要忘记更改 PATH_TO_GOOGLE_PLISTS

代码

PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/SM2/Application/Firebase"

case "${CONFIGURATION}" in

   "Debug_Staging" | "AdHoc_Staging" )
        cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-dev.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;

   "Debug_Poduction" | "AdHoc_Poduction" | "Distribution" | "Test_Poduction" )
        cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-prod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;

    *)
        ;;
esac

构建方案名称

【讨论】:

  • 保存我一天的好答案
  • 这是正确的答案。显然 Firebase Analytics 需要应用程序根目录中的 plist 文件,即使您调用 configure(options:) 也是如此。 github.com/firebase/quickstart-ios/issues/5
  • 这是一个非常好的解决方案,应该被接受为答案。
  • 非常轻便和智能,很好的答案。谢谢!
  • @smileBot 你可以跳过-r,更多信息:cp command in Linux/Unix
【解决方案2】:

@inidona 的回答对我有用。在我将它转换为 Swift 之后

对于 Swift 2.3:

let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info", ofType: "plist")
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configureWithOptions(options)

对于 Swift 3.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configure(with: options)

对于 Swift 4.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)
FirebaseApp.configure(options: options!)

【讨论】:

  • 使用上面的代码,你是否有两个不同的文件GoogleService-Info.plist 文件在不同的位置,或者可能是两个不同名称的文件。您能否提供更多有关实际文件名和放置位置的信息?
  • 我有 2 个名为 GoogleService-Info-dev.plist GoogleService-Info-live.plist 的文件,此代码允许您告诉您的应用您要使用的信息文件,而不是默认的 GoogleService-Info -dev.plist 使用条件语句或目标标志在文件之间交替
  • 是的,在 AppDelegate 中
  • 给我'找不到配置文件:'GoogleService-Info.plist''
  • 最近的文档说“警告:这种方法在某些情况下会影响 Analytics 收集”firebase.google.com/docs/projects/multiprojects
【解决方案3】:

查看这篇文章:https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164

在 Xcode 上,在您的项目中创建两个目录:DebugRelease。将每个GoogleService-Info.plist 文件放在那里。

AppDelegate.m,在didFinishLaunchingWithOptions方法里面,放上代码:

Objective-C

  NSString *filePath;
#ifdef DEBUG
  NSLog(@"[FIREBASE] Development mode.");
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Debug"];
#else
  NSLog(@"[FIREBASE] Production mode.");
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Release"];
#endif

  FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
  [FIRApp configureWithOptions:options];

斯威夫特 4

var filePath:String!
#if DEBUG
    print("[FIREBASE] Development mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Debug")
#else
    print("[FIREBASE] Production mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Release")
#endif

let options = FirebaseOptions.init(contentsOfFile: filePath)!
FirebaseApp.configure(options: options)

DebugRelease 文件夹拖放到Build Phases > Copy Bundle Resources

就是这样:)

【讨论】:

  • 这对我有用。您必须在此处添加这些文件夹作为参考,否则它确实会崩溃。谢谢!
  • 这个解决方案仍然不能解决Analytics框架的问题,你无法判断正在加载哪个.plist
  • @Bruno Lemos,我可以同时使用一个 xcode 项目中的两个 Firebase 项目吗?不像Debug & Release?因为当我尝试这样做时,我总是以already configured crash. 结尾,我遵循了 Firebase 官方文档中的最新说明。谢谢
【解决方案4】:

如果 GoogleService-Info.plist 的名称不同,则会影响您的分析结果。 Firebase will warn you about this。因此,这些运行时解决方案都无法提供最佳分析结果。

有两种解决方案不会与 Analytics 混淆。

  1. 对每个方案使用不同的目标,并将GoogleService-Info.plist 的每个版本与其自己的目标相关联。在 Xcode 右侧的 文件检查器 中查看 Target Membership。欲了解更多信息See this question

  2. 使用构建阶段脚本将GoogleService-Info.plist 的正确版本复制到构建目录中。我使用不同的捆绑 ID 进行暂存和生产。这使我能够同时安装两个版本的应用程序。这也意味着使用下面的脚本,我可以用捆绑 ID 命名我的不同 GoogleService-Info.plist 文件。例如:

  • GoogleService-Info-com.example.app.plist
  • GoogleService-Info-com.example.app.staging.plist

构建阶段脚本

PATH_TO_CONFIG=$SRCROOT/Config/GoogleService-Info-$PRODUCT_BUNDLE_IDENTIFIER.plist
FILENAME_IN_BUNDLE=GoogleService-Info.plist
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"
cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"

注意:您必须更改 PATH_TO_CONFIG 以适合您的设置。

【讨论】:

  • 这是迄今为止最好的解决方案。因为 Firebase Crashlytics 只能使用 GoogleService-Info.plist 文件通过“upload-symbols”脚本上传 dSYM 文件 - 此解决方案完美运行!
【解决方案5】:

我认为您可以使用这种方式动态配置您的 GoogleService-Info.plist 并为不同的捆绑标识符使用不同的名称。

ciao 安德烈亚斯

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];

【讨论】:

  • 使用上面的代码,你是否有两个不同的文件GoogleService-Info.plist 文件在不同的位置,或者可能有两个不同名称的文件。您能否提供更多有关实际文件名和放置位置的信息?
  • 我在 configureWithOptions 调用期间在日志中遇到此错误:Could not locate configuration file: 'GoogleService-Info.plist'
【解决方案6】:

我注意到 google 期望代码中的文件名是 GoogleServiceInfo.plist:

 * The method |configureWithError:| will read from the file GoogleServices-Info.plist bundled with
 * your app target for the keys to configure each individual API. To generate your
 * GoogleServices-Info.plist, please go to https://developers.google.com/mobile/add
 *
 * @see GGLContext (Analytics)
 * @see GGLContext (SignIn)
 */
@interface GGLContext : NSObject

关键词是这个

从与您的应用目标捆绑的文件 GoogleServices-Info.plist 中读取

所以我只是简单地将同一个文件复制到不同的目录中,并将其绑定到不同的目标:

【讨论】:

  • 谢谢,非常简单,对我来说效果很好,Xcode 10.1,FirebaseCore (5.3.1)
  • 如何避免App内有多个Plist或其他文件后出现的“Multiple command generate”错误
【解决方案7】:

这个答案非常受@abbood 的答案的启发,但更具体地说明了如何做到这一点。

对于您的每个目标,例如开发,stg,产品:

  • 将对应的GoogleService-Info.plist 下载到以您的目标命名的单独文件夹中
  • 在 Xcode 中,右键单击您的应用文件夹并选择 Add files to "your app"
  • 选择包含目标GoogleService-Info.plist的文件夹,确保选择Copy items if neededCreate groups,在目标列表中只检查对应的目标,然后按Add

就是这样。现在你应该有类似这个结构的东西了

当您构建目标时,将使用正确的GoogleService-Info.plist

【讨论】:

  • 非常适合我。
  • 不需要自定义脚本。完美。
  • 这应该是公认的答案。这种方式更容易实现和维护
  • 其实这些是针对不同的构建目标的。问题是如何处理非目标模式。但这似乎是理想的方式
  • 我这几天一直在尝试这样做,而且效果很好。只需确保删除对GoogleServices-Info.plist 的任何其他引用,否则您可能会得到:error: Multiple commands produce GoogleServices-Info.plist...
【解决方案8】:

迟到了,但我想我必须发布这个答案来帮助新开发人员,我找到了一篇非常好的文章来解决我的问题,我保证它也可以帮助你:)
查看this 也可以解决您的问题的文章。

第 1 步:
将您的 Firebase 开发环境对应的 GoogleService-Info.plist 复制到 Dev 目录中。同样,复制 Prod 目录中与您的 Firebase 生产环境对应的 GoogleService-Info.plist。确保取消选中“Copy items if needed”以及“Add to targets”下的所有目标。

第 2 步:
在 Xcode 项目导航器中,选择应用程序目标。切换到顶部的 Build Phases 选项卡,然后添加 New Run Script Phase。将阶段命名为 “Setup Firebase Environment GoogleService-Info.plist” 或类似的名称,并将其放在 “Copy Bundle Resources” 步骤之前。

第 3 步:
实施一个 shell 脚本,该脚本将根据构建配置将适当的 GoogleService-Info.plist 复制到应用程序包中。将以下 shell 脚本复制并粘贴到您刚刚创建的运行脚本阶段:

# Name of the resource we're selectively copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist

# Get references to dev and prod versions of the GoogleService-Info.plist
# NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Dev/${GOOGLESERVICE_INFO_PLIST}
GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Prod/${GOOGLESERVICE_INFO_PLIST}

# Make sure the dev version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"
if [ ! -f $GOOGLESERVICE_INFO_DEV ]
then
    echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
    exit 1
fi

# Make sure the prod version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
if [ ! -f $GOOGLESERVICE_INFO_PROD ]
then
    echo "No Production GoogleService-Info.plist found. Please ensure it's in the proper directory."
    exit 1
fi

# Get a reference to the destination location for the GoogleService-Info.plist
PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}"

# Copy over the prod GoogleService-Info.plist for Release builds
if [ "${CONFIGURATION}" == "Release" ]
then
    echo "Using ${GOOGLESERVICE_INFO_PROD}"
    cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
else
    echo "Using ${GOOGLESERVICE_INFO_DEV}"
    cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
fi

【讨论】:

    【解决方案9】:

    您无法避免将 plist 与 Firebase 一起使用。到目前为止,我为您找到的最佳解决方案是添加两个文件并为其命名

    GoogleService-Info_stage.plist

    GoogleService-Info_prod.plist

    然后,您可以从您的代码中调用正确的文件。如果您没有文件,这种方式不会使您的应用程序崩溃。只需将 FILENAME 替换为 GoogleService-Info_prod 或 GoogleService-Info_stage。

    if let configFile = Bundle.main.path(forResource: "FILENAME", ofType: "plist"), 
        let options = FirebaseOptions(contentsOfFile: configFile)   
    {
       FirebaseApp.configure(options: options)
    }
    

    【讨论】:

    • 运行时配置可能导致docs 中提到的分析报告问题。
    • 这会在 dsym 文件中出现问题。
    【解决方案10】:

    假设我们有两个配置集,developproduction。你必须做两件事:

    1. 重命名两个 plist 以符合给定的配置:
    • GoogleService-Info-develop.plist
    • GoogleService-Info-production.plist
    1. 添加一个运行脚本,为所选配置复制正确的 plist:
    FIREBASE_PLIST_PATH="${PROJECT_DIR}/App/Resources/Plists/GoogleService-Info-${CONFIGURATION}.plist"
    echo "Firebase plist path: ${FIREBASE_PLIST_PATH}"
    cp -r ${FIREBASE_PLIST_PATH} "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
    

    运行脚本需要位于FirebaseCrashlytics 脚本之前。

    您可以像之前对单一方案所做的那样初始化 firebase:FirebaseApp.configure()

    【讨论】:

      【解决方案11】:

      我发现在单一目标的情况下,唯一 100% 可行的方法是在构建期间复制与构建配置相对应的 plist;但是这里的这些答案在如何做的细节上有所不同,而且没有人对我来说足够方便。我的回答基于@KnightFighter 的answer 和Medium 上的this 文章。


      首先将所有不同的plist添加到不同名称的项目中(它们不能作为资源添加到目标中):

      接下来创建用户定义的构建设置,您可以在其中为每个构建配置分配特定的 plist:

      最后用代码添加“运行脚本”阶段:

      GOOGLE_SERVICE_INFO_PLIST_SOURCE=${PROJECT_DIR}/${TARGET_NAME}/${GOOGLE_SERVICE_INFO_PLIST_FILENAME}
      
      if [ ! -f $GOOGLE_SERVICE_INFO_PLIST_SOURCE ]
      then
          echo "${GOOGLE_SERVICE_INFO_PLIST_SOURCE} not found."
          exit 1
      fi
      
      GOOGLE_SERVICE_INFO_PLIST_DESTINATION="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
      
      cp "${GOOGLE_SERVICE_INFO_PLIST_SOURCE}" "${GOOGLE_SERVICE_INFO_PLIST_DESTINATION}"
      

      我认为这种方式有一些优势:

      • 无需文件夹层次结构来存储 plist;
      • 如果单个 plist 用于多个配置,则无需复制文件;
      • 如果您需要添加配置或重新分配 plist,在构建设置中更改文件名比编辑脚本更容易;特别是对于非程序员(即构建经理)。

      【讨论】:

      • 我使用多种方案和配置(只有一个目标),所以这个解决方案非常适合我。感谢您提供非常详细的解释。
      【解决方案12】:

      这是我的解决方案!

      NSString *filePath;
      if([self isProduction]){
          filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
      }else{
          filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Sandbox" ofType:@"plist"];
      }
      FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
      [FIRApp configureWithOptions:options];
      

      就是这样!

      【讨论】:

        【解决方案13】:

        我解决了这个问题:

            #if STAGING
                if let filePath = Bundle.main.path(forResource: "GoogleService-Info-Dev", ofType: "plist"),
                    let options = FirebaseOptions(contentsOfFile: filePath) {
                        FirebaseApp.configure(options: options)
                } else {
                    fatalError("GoogleService-Info-Dev.plist is missing!")
                }
            #else
                if let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist"),
                    let options = FirebaseOptions(contentsOfFile: filePath) {
                        FirebaseApp.configure(options: options)
                } else {
                    fatalError("GoogleService-Info.plist is missing!")
                }
            #endif
        

        【讨论】:

        • 绝对是最简单直接的方法。
        【解决方案14】:

        如果你们中的一些人遇到错误并且 Xcode 抱怨

        “多个命令生成 GoogleService-Info.plist”

        在申请@Knight Fighter response 后,您可能想要:

        • 检查构建阶段>复制捆绑资源
        • 过滤名为GoogleService-Info.plist 的文件
        • 删除所有对它的引用,因为 它已经通过脚本被复制了。

        【讨论】:

        • 与@Bjorn Egil 的答案相同,但更紧凑
        【解决方案15】:

        所以我思考了同样的问题,并使用了之前帖子中的一些想法,其中一些为所有应用程序中的所有环境发布了带有GoogleServices-Info.plist 的应用程序,这有点令人担忧。

        我想出了一个可扩展的解决方案,可以在构建时复制GoogleSerives-Info.plist 文件。此外,这种方法可以支持任意数量的环境,并且能够自定义并遵循简单的约定,使其易于管理。

        首先,我有三个环境,debug(用于在模拟器和设备中运行并调试和主动剪切代码)、staging(用于部署到测试飞行)和release 用于生产。

        第一步是创建配置:

        选择“产品”->“方案”->“编辑方案”并根据需要复制/新建。浏览每个方案并从 每个类别中的“构建配置”下拉菜单:

        我更进一步,取消选中需要分发的方案的“运行”,即发布和登台,相反,取消选中“存档”进行调试。你应该做对你有意义的事情。

        在构建阶段添加以下运行脚本(CONFIGURATIONS_FOLDER 变量可以根据需要自定义 - 只需确保在下一步中使用相同的文件夹名称):

        # Get a reference to the folder which contains the configuration subfolders.
        CONFIGURATIONS_FOLDER=Firebase
        # Get a refernce to the filename of a 'GoogleService-Info.plist' file.
        GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
        # Get a reference to the 'GoogleService-Info.plist' for the current configuration.
        GOOGLESERVICE_INFO_PLIST_LOCATION=${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/${CONFIGURATION}/${GOOGLESERVICE_INFO_PLIST}
        # Check if 'GoogleService-Info.plist' file for current configuration exist.
        if [ ! -f $GOOGLESERVICE_INFO_PLIST_LOCATION ]
        then
          echo "No '${GOOGLESERVICE_INFO_PLIST}' file found for the configuration '${CONFIGURATION}' in the configuration directory '${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/${CONFIGURATION}'."
          exit 1
        fi
        # Get a reference to the destination location for the GoogleService-Info.plist.
        GOOGLESERVICE_INFO_PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
        # Copy 'GoogleService-Info.plist' for current configution to destination.
        cp "${GOOGLESERVICE_INFO_PLIST_LOCATION}" "${GOOGLESERVICE_INFO_PLIST_DESTINATION}"
        echo "Successfully coppied the '${GOOGLESERVICE_INFO_PLIST}' file for the '${CONFIGURATION}' configuration from '${GOOGLESERVICE_INFO_PLIST_LOCATION}' to '${GOOGLESERVICE_INFO_PLIST_DESTINATION}'."
        

        在您选择的配置文件夹(上例中的“Firebase”)中,每个配置的嵌套文件夹与其各自的配置命名完全相同(区分大小写),在其中放置各自的 GoogleServices-Info.plist 文件,如下所示:

        最后但同样重要的是,我还想确保根级别 GoogleServices-Info.plist 不会意外添加到项目中,因此我将以下内容添加到我的 .gitignore 中。

        # Ignore project level GoogleService-Info.plist
        /[Project Name]/GoogleService-Info.plist
        

        【讨论】:

          【解决方案16】:

          我认为不使用GoogleService-Info.plist. 是不可能实现的,因为在您开始将您的iOS 应用程序与Google 登录组件集成之前,您必须下载依赖项并配置您的Xcode 项目。 而这个process 表明GoogleService-Info.plist 有很大的影响。

          因此,SO question 中的解决方案和想法可以帮助您解决问题。只需将 GoogleService-Info plist 的主副本从应用程序中移出到 2 个单独的文件夹中,然后使用每个目标上的构建阶段“复制文件”将目标特定 plist 导入资源文件夹。

          也请查看此SO question,它可能会为您提供更多信息/想法来解决您的问题。

          【讨论】:

          • 这里,target是指同一个项目的不同方案吗?在阅读了这些问题后,我发现目标完全意味着不同的构建目标,而不仅仅是针对同一目标的不同构建方案。
          • 但是,如果您有一个目标,每个方案的配置都不同呢?
          【解决方案17】:

          这是在 Xamarin C# 中的操作方法:

          string plistPath = NSBundle.MainBundle.PathForResource ("GoogleService-Info", "plist");
          Options options = new Options (plistPath);
          App.Configure (options);
          

          记得包含 Firebase 命名空间:

          using Firebase.Analytics;
          

          【讨论】:

            【解决方案18】:

            使用 Xcode 9.2,我需要将两个目标的文件命名为“googleServiceInfo.plist”,但放置在不同的目录中,每个目标的目录/文件在“构建阶段”、“复制捆绑资源”中指定。

            以上不是我首选的解决方案,但我之前曾尝试使用不同的文件名,按照@inidona 的回答,转换为 Swift 4:

             let filePath = Bundle.main.path(forResource: "googleServiceInfo-Pro", ofType: "plist")!
             let options = FirebaseOptions(contentsOfFile: filePath)
             FirebaseApp.configure(options: options!)
            

            很遗憾,这并没有更正 Firebase 错误消息。在这个问题中:Firebase iOS SDK - Using configuration file other than GoogleService-Info.plist generates console warning 原发帖人似乎已通过更新 Firebase Pod 进行了修复,但我尚未确认这一点。

            【讨论】:

              【解决方案19】:

              @Vasily Bodnarchuk 的回答对我有用。唯一需要注意的是Xcode中的脚本有一个精确的顺序,所以你需要把这个脚本作为第一个,在带有

              的脚本之前
              ${PODS_ROOT}/FirebaseCrashlytics/run
              

              "${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" -gsp "${PROJECT_DIR}/<yourapp>/Configuration Files/GoogleService-Info-dev.plist" -p ios "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"
              

              【讨论】:

                【解决方案20】:

                这是我的@Essam 解决方案版本。

                1. 为默认方案生成 GoogleServices 版本 (Google-Services.plist) 使用默认标识符
                2. 生成第二个 GoogleServices 版本 对于具有正确标识符的变体方案 (Google-Services-debug.plist)
                3. 将两者都添加到 项目的根目录(在他们的指南中告诉你)

                将此代码添加到您要添加配置的位置:

                        let bundleID = Bundle.main.bundleIdentifier
                        if (bundleID!.contains("debug")) {
                            let resource: String = "GoogleService-Info-debug"
                            let filePath = Bundle.main.path(forResource: resource, ofType: "plist")!
                            let options = FirebaseOptions(contentsOfFile: filePath)
                            FirebaseApp.configure(options: options!)
                        } else {
                            FirebaseApp.configure()
                        }
                

                【讨论】:

                  【解决方案21】:

                  对于那些想在 Fastlane 中进行的人。

                  您可以使用 fastlane 的文件管理器插件 (fastlane-plugin-file_manager) 来运行简单的复制命令。

                  1. 以标准方式将 GoogleService-info-app.plist 添加到您的 xcode 项目中,以便正确链接。

                  2. 使用复制文件用您想要的构建/测试通道中的文件覆盖此链接文件。

                    copy_files(source: "firebase/GoogleService-Info-" + ENV["APP_IDENTIFIER"] + ".plist", destination: "GoogleService-Info.plist")

                  【讨论】:

                    猜你喜欢
                    • 2018-12-10
                    • 2019-12-07
                    • 2022-01-06
                    • 2019-10-30
                    • 1970-01-01
                    • 2016-03-21
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-01-04
                    相关资源
                    最近更新 更多