在自定义 .plist 文件中使用用户定义的构建设置

Use User-Defined build settings in custom .plist file

我为我的应用程序定义了不同的构建配置(Debug、Stage、Prod),我使用 User-Defined 构建设置:

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

在这种情况下,$(USER_DEFINED_SETTINGS) 表示法 确实 有效。

当我尝试设置 Google 登录 时,这需要使用额外的 .plist 文件 (GoogleService-Info.plist),我使用了 User-Defined设置和我在Info.plist文件中做的一样,它不起作用。

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

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

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

  1. 创建一个新文件夹(例如:Resources/GoogleServiceInfoPlists)。

  2. 将构建配置的所有 .plist 文件复制到那里。例如:

  3. GoogleService-Info-Debug.plist

  4. GoogleService-Info-Stage.plist

  5. GoogleService-Info-Prod.plist

  6. 添加新的 Run Script Phase - Xcode: Target-->Build Phases-->"+" button (top left角)。

  7. 使用下面的脚本将给定构建配置的 .plist 文件复制(替换)到项目目录:

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

    "${SRCROOT}/${PRODUCT_NAME}/GoogleService-Info.plist"
    
  9. 重要:将新添加的脚本移到之前 Copy Bundle Resources阶段,否则将使用默认文件,忽略替换文件。

二手variables/paths:

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

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

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

注:

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

如果上述方法不起作用,请尝试单击您不喜欢的 .plist 文件 > 文件检查器 > 目标成员资格 > 检查您的主项目,以便将其捆绑在最终输出中。

我将两个具有(相同)名称的文件 GoogleService-Info.plist 放入我的项目中。

一个在根目录下,一个在名为'staging'的文件夹中,以避免文件系统中的命名冲突。

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

  1. 创建一个新文件夹(例如:GoogleServiceInfoPlists)。

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

例如:

GoogleService-Info-Debug.plist, 
GoogleService-Info-Alpha.plist,
GoogleService-Info-Beta.plist,
GoogleService-Info-Release.plist
  1. 最后添加新的Run Script Phase(Xcode:目标->构建阶段->“+”按钮)。

  2. 使用下面的脚本将给定环境的 .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:您不需要将文件添加到项目中。只需在主目录中创建一个新文件夹即可。

其实还有更好的解决办法。

您可以使用 my swift script.

手动替换 Env 变量(包括用户定义的)

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

这就是您在 Run script phase 中使用它的方式:

/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"