Writing to build directory info.plist using Xcode's “New Build System”

浪尽此生 提交于 2019-12-30 10:53:28

问题


Before using the "New Build System", we had a build phase script like this:

infoplist="$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH"
builddate=`date`
/usr/libexec/PlistBuddy -c "Set :BuildDateString $builddate" "${infoplist}"

The point of this way to write to the plist at runtime without dirtying the project and having to stash the changes. This still works well and perfectly when using the "Legacy Build System".

On the "New Build System", this script does not work. The directory variables and writing to the plist will works but the changes are somehow overwritten.

Is there a way to write to a built plist via the build phase script? If not, is there a way to achieve the goal of writing information only when the application runs without dirtying the local repo.


回答1:


It looks like that sometimes, under the "New Build System", the Process Info.plist step is after all the Run custom scripts step.

So I use script to generate another custom.plist at the bundle

#!/usr/bin/env ruby
require 'cfpropertylist'
require 'pathname'

build_info = {
    'Time' => Time.now.to_s,
    'CommitHash' => `git log --pretty="%h" | head -n1`.rstrip
}

plist = CFPropertyList::List.new
plist.value = CFPropertyList.guess(build_info)
plist_path = Pathname.new(ENV['BUILT_PRODUCTS_DIR']) /  ENV['CONTENTS_FOLDER_PATH'] / 'build_info.plist'
plist.save(plist_path, CFPropertyList::List::FORMAT_XML)



回答2:


As @rpstw points out, any custom build steps will run before the New Build System's Process .../Info.plist step.

  • To run a shell script after Xcode finishes building, you can add it to your scheme(s) as a build post-action:

Product > Scheme > Edit Scheme... > Build > Post-actions

  • If you're going to reference any build system environment variables (e.g. BUILT_PRODUCTS_DIR or INFOPLIST_PATH), make sure you change the Provide build settings from selection.

  • Add your shell script, but remember that if you edit any file in the app bundle (i.e. Info.plist), you'll need to re-sign the app. Add this to your post build step:

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


来源:https://stackoverflow.com/questions/52613024/writing-to-build-directory-info-plist-using-xcodes-new-build-system

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!