【问题标题】:Set Info.plist Value from Build Phase从构建阶段设置 Info.plist 值
【发布时间】:2019-04-08 23:18:26
【问题描述】:

我有一个 iOS,我想为其运行一个构建阶段,该阶段从 JSON 文件中读取一个值,将其导出为环境变量,然后在我的 Info.plist 中读取它。

我目前有:

# Build Scripts/SetAPIVersion
set -e

if ! which jq > /dev/null; then
echo "error: jq is missing. Be sure to git pull `dev-box` and run apply.sh"
exit 1
fi

export API_VERSION =$(cat ../src/version.json | jq .api)

echo "Set API Version to $(API_VERSION)!"

我的应用程序将构建,但该值似乎未设置。我在这里做错了什么?

【问题讨论】:

    标签: xcode sh run-script


    【解决方案1】:

    你可以用这个:

    plutil -replace APIVersion -string <VERSION> <PATH TO INFO>.plist
    

    你也可以使用 PlistBuddy:

    /usr/libexec/PlistBuddy -c "Set :APIVersion string <VERSION>" <PATH TO INFO>.plist
    

    如果版本是取决于环境的静态数字,您可以使用项目构建设置user defined variable 来:

    【讨论】:

    • 在最新的 XCode 中可以使用吗?我试图让它工作,但它没有在 plist 中添加任何价值。
    • 我尝试使用最新的 XCode,但由于它在 Build Phase > Run Script 并行运行,因此它就像在启动命令时尚未创建 plist。我不确定我是否必须在脚本之外添加任何其他内容,也许是一些输入文件?
    • 我实际上不得不在 Shell bin/shell 脚本窗口下的 Input Files 中放置两个参考文件:$(SRCROOT)/${INFOPLIST_PATH} 和 $(SRCROOT)/${TARGET_BUILD_DIR}。这就像对 XCode 说在这些文件存在之前不要运行脚本
    【解决方案2】:

    shell 解释器作为子进程运行。当它exports 是一个环境变量时,它只会影响那个 shell 解释器进程和 它的 子进程,但不会影响父进程(即 Xcode)或其兄弟进程(其他构建阶段)。

    您可以让 shell 脚本构建阶段获取一个输入文件,例如 Info.plist.in,并从中生成 Info.plist。它会根据您的喜好将输入转换为输出。例如,它可以使用sed 将一个特殊的字符串替换为它应该具有的值。请务必根据需要配置运行脚本构建阶段的输入和输出。

    或者,您可以让运行脚本构建阶段生成一个定义宏的头文件,例如 api_version.h 其中#defines API_VERSION#include Info.plist 中的那个头文件,并启用在构建设置中预处理 Info.plist。再次确保运行脚本阶段的输入和输出正确。

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2015-10-07
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多