Ios 在自定义.plist文件中使用用户定义的生成设置

Ios 在自定义.plist文件中使用用户定义的生成设置,ios,xcode,plist,google-signin,Ios,Xcode,Plist,Google Signin,我为我的应用程序定义了不同的构建配置(调试、阶段、产品),我使用用户定义的构建设置: 要在Info.plist文件中设置Facebook登录和其他内容: 在这种情况下,$(用户定义的设置)符号起作用 当我试图设置谷歌登录时,这需要使用额外的.plist文件(谷歌服务信息.plist),我使用了用户定义的设置,就像我在信息.plist文件中使用的一样,它不起作用 如何在自定义.plist文件中使用用户定义的设置?如果我不能,我如何解决这个问题?在自定义.plist文件中使用用户定义的设置是不可

我为我的应用程序定义了不同的构建配置(调试、阶段、产品),我使用用户定义的构建设置:

要在
Info.plist
文件中设置Facebook登录和其他内容:

在这种情况下,
$(用户定义的设置)
符号起作用

当我试图设置谷歌登录时,这需要使用额外的
.plist
文件(
谷歌服务信息.plist
),我使用了用户定义的设置,就像我在
信息.plist
文件中使用的一样,它不起作用


如何在自定义
.plist
文件中使用用户定义的设置?如果我不能,我如何解决这个问题?

自定义.plist文件中使用用户定义的设置是不可能的

但是您可以在构建应用程序时将自定义.plist文件复制到正确的位置:

  • 创建新文件夹(例如:
    Resources/googleservicesinfoplists

  • 将生成配置的所有.plist文件复制到那里。例如:

  • GoogleService Info Debug.plist

  • GoogleService Info Stage.plist

  • GoogleService-Info-Prod.plist

  • 添加新的
    运行脚本阶段
    -Xcode:Target-->构建阶段-->“+”按钮(左上角)

  • 使用以下脚本将给定生成配置的.plist文件复制(替换)到项目目录:

    cp "${SRCROOT}/${PRODUCT_NAME}/Resources/GoogleServiceInfoPlists/GoogleService-Info-$CONFIGURATION.plist" "${SRCROOT}/${PRODUCT_NAME}/GoogleService-Info.plist"
    
  • 在“输出文件”下,您可能还应该输入目标文件,以确保仅当文件实际被复制时,下一阶段才开始

    "${SRCROOT}/${PRODUCT_NAME}/GoogleService-Info.plist"
    
  • 重要提示:将新添加的脚本移动到
    复制捆绑资源
    阶段之前,否则将使用默认文件,忽略替换的文件

  • 使用的变量/路径:

    ${SRCROOT}
    -预定义,它指向您的项目位置

    ${PRODUCT_NAME}
    -预定义的产品名称

    $CONFIGURATION
    -预定义,这是您的构建配置。默认情况下,它是:
    Debug
    Release
    。在我的例子中:
    Debug
    Stage
    Prod
    。您可以在Xcode:Project(而不是Target!)-->Info中更改生成配置

    注意:

    GoogleService Info.plist
    文件必须添加到Xcode项目资源中(构建阶段-->复制捆绑资源),而
    资源/googleservicesinfoplists/GoogleService Info-*
    文件不一定

    如果上述方法不起作用,请尝试单击您的disired.plist文件>file Inspector>Target Membership>检查您的主项目,以便在最终输出时将其捆绑在一起。

    我将两个名为GoogleService-Info.plist的文件放入我的项目中

    一个位于根目录,另一个位于名为“staging”的文件夹中,以避免文件系统中的命名冲突

    在一个目标中包含一个,在另一个目标中包含另一个,这样每个目标都有一个具有正确名称的唯一plist文件

  • 创建新文件夹(例如:
    GoogleServiceInfoPList

  • 复制每个配置的所有
    .plist
    文件

  • 例如:

    GoogleService-Info-Debug.plist, 
    GoogleService-Info-Alpha.plist,
    GoogleService-Info-Beta.plist,
    GoogleService-Info-Release.plist
    
  • 最后添加新的
    runscriptphase
    (Xcode:Target->buildphases->“+”按钮)

  • 使用下面的脚本将给定环境的
    .plist
    文件复制到生成目录

  • 脚本:

    RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/GoogleServiceInfoPlists/GoogleService-Info-$CONFIGURATION.plist
    
    BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
    
    echo "Copying ${RESOURCE_PATH} to ${BUILD_APP_DIR}"
    cp "${RESOURCE_PATH}" "${BUILD_APP_DIR}/GoogleService-Info.plist"
    
    PS:您不需要将文件添加到项目中。只需在主目录中创建一个新文件夹


    实际上有一个更好的解决方案

    可以使用手动替换环境变量(包括用户定义的)

    它有两个参数:输入和输出路径。递归地遍历所有输入plist值(如果需要,也可以添加要处理的dict键),并替换它找到的所有Env变量。并写入输出路径

    这是您在
    运行脚本阶段使用它的方式:

    /usr/bin/xcrun --sdk macosx swift "${PROJECT_DIR}/scripts/replacePlistEnvironmentVariables.swift"  "${PROJECT_DIR}/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
    

    +1虽然我不喜欢解决方案本身,但我找不到任何其他方法来实现它。谷歌至少应该提供通过API更改跟踪标识符的方法(而不是自己修改.plist)。我认为你可以在自定义plist中使用${USER\u DEFINED\u SETTINGS},而不是在你的项目的Info.plist中,但我还没有尝试过。当然,但谷歌登录需要单独的(自定义)设置.plist文件。我应用了此解决方案,并遇到以下问题。我确实看到该文件被复制到我的主目录中,但是,我认为该文件没有与我的Xcode项目链接,因此它仍然导致“丢失GoogleService-Info.plist文件”。还有其他人有这个问题吗?@pixelfreak,您是否尝试过单击并拖动构建阶段以确保在链接文件之前进行复制?@Cleversou我发现问题
    找不到配置文件:“GoogleService Info.plist”。
    您是否使用新的构建设置?@smj2393尝试单击您需要的.plist文件>文件检查器>目标成员资格>检查主项目,以便在最终输出中将其捆绑在一起。