在我们的项目中,我们从 git 标签等导出我们的发布版本,然后使用如下 shell 脚本将其写入构建文件夹的 Info.plist:
GIT_RELEASE_VERSION=$(some git command)
defaults write "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH%.*}" "CFBundleShortVersionString" "${GIT_RELEASE_VERSION#*v}"
这对所有过去的 Xcode 版本都有效,但在 Xcode 10 的新构建系统中,这未能实际更新 info.list 文件中的 CFBundleShortVersionString。不过,该值已使用 Xcode 10 的 Legacy Build System 正确更新。
我在脚本中添加了一些回声并比较了新旧系统上的构建日志,看不出有什么区别:
echo "git release version:" ${GIT_RELEASE_VERSION}
echo "info path:" ${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH%.*}
echo "grv:" "${GIT_RELEASE_VERSION#*v}"
不确定是否有人遇到过新构建系统的类似问题?
似乎问题在于有时您的
Run Script Phase
会在Xcode创建Info.plist
之前执行。如果您想确保您的脚本阶段在特定步骤之后运行,您需要使用输入来标记您的依赖项。
例如添加:
$(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)
作为脚本阶段的输入,应该强制执行您正在寻找的顺序:Xcode 将创建
Info.plist
,之后的某个时间,您的脚本将执行并修改 Info.plist
.
Xcode 14 编辑 - J Nozzi
根据下面的评论,上面的内容对我来说并不完全有效,因为它一直声称它会在每次构建时运行。将
$(DERIVED_FILE_DIR)/$(INFOPLIST_PATH)
添加到 Output Files 列表中。
(Xcode 11.2)
Process .../Info.plist
步骤:Product > Scheme > Edit Scheme... > Build > Post-actions
如果您要引用任何构建系统环境变量(例如
BUILT_PRODUCTS_DIR
或 INFOPLIST_PATH
),请确保更改 Provide build settings from 选择。添加您的 shell 脚本,但请记住,如果您编辑应用程序包中的任何文件(即
Info.plist
),您将需要重新签署应用程序。将此添加到您的后期构建步骤:export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate
/usr/bin/codesign --force --sign - --entitlements "${TARGET_TEMP_DIR}/${FULL_PRODUCT_NAME}.xcent" --timestamp=none "${CODESIGNING_FOLDER_PATH}"
这里有同样的问题......一种解决方法是清理然后执行完整构建。
Xcode 10 中的新构建系统在完整构建和增量构建中以不同方式运行 Process Info.plist 步骤:
实际问题是作为构建步骤运行并更新已处理 Info.plist 文件的脚本需要始终在文件处理之后但签名之前运行。
类似于上面的答案(还不能评论)但略有变化。
脚本输入文件:
$(PROJECT_DIR)/$(INFOPLIST_FILE)
$(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)
输出文件:
$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
我用一个脚本创建了一个要点,我用它来设置捆绑版本和一些额外的信息,比如标签、日期、分支。
https://gist.github.com/JoeMatt/aedd459c54a383373231719e508a2a36