Writing to build directory info.plist using Xcode&

2020-03-26 05:06发布

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.

2条回答
ら.Afraid
2楼-- · 2020-03-26 05:38

enter image description here

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)
查看更多
Juvenile、少年°
3楼-- · 2020-03-26 05:54

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

enter image description here

  • 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}"
查看更多
登录 后发表回答