在自定义 .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 文件复制到正确的位置:
创建一个新文件夹(例如:Resources/GoogleServiceInfoPlists
)。
将构建配置的所有 .plist 文件复制到那里。例如:
GoogleService-Info-Debug.plist
GoogleService-Info-Stage.plist
GoogleService-Info-Prod.plist
添加新的 Run Script Phase
- Xcode: Target-->Build Phases-->"+" button (top left角)。
使用下面的脚本将给定构建配置的 .plist 文件复制(替换)到项目目录:
cp "${SRCROOT}/${PRODUCT_NAME}/Resources/GoogleServiceInfoPlists/GoogleService-Info-$CONFIGURATION.plist" "${SRCROOT}/${PRODUCT_NAME}/GoogleService-Info.plist"
在输出文件下,您可能还应该输入目标文件,以确保下一阶段仅在文件实际复制后才开始。
"${SRCROOT}/${PRODUCT_NAME}/GoogleService-Info.plist"
重要:将新添加的脚本移到之前 Copy Bundle Resources
阶段,否则将使用默认文件,忽略替换文件。
二手variables/paths:
${SRCROOT}
- 预定义,它指向您的项目位置。
${PRODUCT_NAME}
- 预定义的产品名称。
$CONFIGURATION
- 预定义,这是您的构建配置。默认情况下,它是:Debug
、Release
。在我的例子中:Debug
、Stage
、Prod
。您可以在 Xcode 中更改构建配置:Project(不是 Target!)-->Info.
注:
GoogleService-Info.plist
文件 必须 添加到 Xcode 项目资源(构建阶段-->复制捆绑资源s) 而 Resources/GoogleServiceInfoPlists/GoogleService-Info-*
文件不一定。
如果上述方法不起作用,请尝试单击您不喜欢的 .plist 文件 > 文件检查器 > 目标成员资格 > 检查您的主项目,以便将其捆绑在最终输出中。
我将两个具有(相同)名称的文件 GoogleService-Info.plist 放入我的项目中。
一个在根目录下,一个在名为'staging'的文件夹中,以避免文件系统中的命名冲突。
在一个目标中包含一个,在另一个目标中包含另一个,这样每个目标都有一个唯一的 plist 文件,名称正确。
创建一个新文件夹(例如:GoogleServiceInfoPlists
)。
复制每个配置的所有 .plist
文件
例如:
GoogleService-Info-Debug.plist,
GoogleService-Info-Alpha.plist,
GoogleService-Info-Beta.plist,
GoogleService-Info-Release.plist
最后添加新的Run Script Phase
(Xcode:目标->构建阶段->“+”按钮)。
使用下面的脚本将给定环境的 .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"
我为我的应用程序定义了不同的构建配置(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 文件复制到正确的位置:
创建一个新文件夹(例如:
Resources/GoogleServiceInfoPlists
)。将构建配置的所有 .plist 文件复制到那里。例如:
GoogleService-Info-Debug.plist
GoogleService-Info-Stage.plist
GoogleService-Info-Prod.plist
添加新的
Run Script Phase
- Xcode: Target-->Build Phases-->"+" button (top left角)。使用下面的脚本将给定构建配置的 .plist 文件复制(替换)到项目目录:
cp "${SRCROOT}/${PRODUCT_NAME}/Resources/GoogleServiceInfoPlists/GoogleService-Info-$CONFIGURATION.plist" "${SRCROOT}/${PRODUCT_NAME}/GoogleService-Info.plist"
在输出文件下,您可能还应该输入目标文件,以确保下一阶段仅在文件实际复制后才开始。
"${SRCROOT}/${PRODUCT_NAME}/GoogleService-Info.plist"
重要:将新添加的脚本移到之前
Copy Bundle Resources
阶段,否则将使用默认文件,忽略替换文件。
二手variables/paths:
${SRCROOT}
- 预定义,它指向您的项目位置。
${PRODUCT_NAME}
- 预定义的产品名称。
$CONFIGURATION
- 预定义,这是您的构建配置。默认情况下,它是:Debug
、Release
。在我的例子中:Debug
、Stage
、Prod
。您可以在 Xcode 中更改构建配置:Project(不是 Target!)-->Info.
注:
GoogleService-Info.plist
文件 必须 添加到 Xcode 项目资源(构建阶段-->复制捆绑资源s) 而 Resources/GoogleServiceInfoPlists/GoogleService-Info-*
文件不一定。
如果上述方法不起作用,请尝试单击您不喜欢的 .plist 文件 > 文件检查器 > 目标成员资格 > 检查您的主项目,以便将其捆绑在最终输出中。
我将两个具有(相同)名称的文件 GoogleService-Info.plist 放入我的项目中。
一个在根目录下,一个在名为'staging'的文件夹中,以避免文件系统中的命名冲突。
在一个目标中包含一个,在另一个目标中包含另一个,这样每个目标都有一个唯一的 plist 文件,名称正确。
创建一个新文件夹(例如:
GoogleServiceInfoPlists
)。复制每个配置的所有
.plist
文件
例如:
GoogleService-Info-Debug.plist,
GoogleService-Info-Alpha.plist,
GoogleService-Info-Beta.plist,
GoogleService-Info-Release.plist
最后添加新的
Run Script Phase
(Xcode:目标->构建阶段->“+”按钮)。使用下面的脚本将给定环境的
.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"