我需要能够在Xcode ARCHIVE过程中在Info.plist中设置一些自定义值。这适用于Xcode 6和Xcode 7。
我已经有一个脚本可以成功更新这些值,作为BUILD过程的后期操作。从Xcode 6部署到模拟器或手机时效果很好。
但是,在ARCHIVE过程中,Info.plist似乎在目录结构中不可用。在BUILD之后,我可以在$ CONFIGURATION-iphoneos和$ CONFIGURATION-iphonesimulator中的... / Build / Products下找到结果。但是在ARCHIVE之后,没有任何东西,我只能在... / Build / Intermediates下找到已编译的二进制文件。
当然,我可以在IPA中看到Info.plist。然而,在事实之后更新和替换此文件的任何尝试都是不成功的; IPA不再有效,我认为由于校验和的变化或其他原因。
我不想在源Info.plist中更新这些值(例如,使用预执行),因为每次归档时它都会使源变脏。
答案 0 :(得分:0)
想出来了。该过程几乎与构建相同 - 使用构建的后期操作,对归档使用后期操作 - 只是路径不同(下面全部列出)以查找Info.plist的位置。
下面是我的构建脚本,其中我使用了令牌,以便在Info.plist中更新“name”和“value”。我刚刚复制了这个脚本并重命名它以用于存档后期操作。请注意,此脚本还有一个从Info.plist中提取值的示例,因为我从客户端版本派生Web服务版本。
构建Info.plist的路径是:
"$BUILD_DIR/$CONFIGURATION-iphoneos/$PRODUCT_NAME.app/Info.plist"
"$BUILD_DIR/$CONFIGURATION-iphonesimulator/$PRODUCT_NAME.app/Info.plist"
注意:两个目标都正在为构建进行更新,因为我还没有找到一种方法来识别它正在进行的构建。
档案Info.plist的路径是:
"$ARCHIVE_PRODUCTS_PATH/Applications/$PRODUCT_NAME.app/Info.plist"
构建后期行动:
$SRCROOT/post_build.sh <value> ~/xcode_build_$PRODUCT_NAME.out
构建脚本:
#!/bin/bash
# post_build.sh
#
# This script is intended for use by Xcode build process as a post-action.
# It expects the only argument is the value to be updated in Info.plist. It
# derives the WS version for the URL from the version found in Info.plist.
printf "Running $0 using scheme '$SCHEME_NAME' as '$USER'\n"
# If this is a clean operation, just leave
if [ $COPY_PHASE_STRIP == "YES" ]
then
printf "Doing a clean; exiting.\n"
exit 1
fi
# Confirm that PlistBuddy is available
PLIST_BUDDY=/usr/libexec/PlistBuddy
if ![-f "$PLIST_BUDDY"]
then
printf "Unable to access $PLIST_BUDDY\n"
exit 1
else
printf "PLIST_BUDDY=$PLIST_BUDDY\n"
fi
# Function to perform the changes
updatePlist()
{
PLIST_FILE=$1
if [ -f "$PLIST_FILE" ]
then
printf "Determing WS version...\n"
if [[ $SCHEME_NAME == *"Local"* ]]
then
WS_VER=""
else
# Determine the services version
BUILD_VER=$(${PLIST_BUDDY} -c "Print CFBundleShortVersionString" "$PLIST_FILE")
WS_VER=$(printf $BUILD_VER | sed 's/\(.*\)\..*/\1/' | sed 's/\./_/g')
fi
# Update the plist
${PLIST_BUDDY} -c "Set <name> <value>" "$PLIST_FILE"
printf "Updated plist $PLIST_FILE\n"
else
printf "Skipping -- no plist: $PLIST_FILE\n"
fi
}
# Retrieve the supplied URL
BASE_URL=$1
printf "BASE_URL=$BASE_URL\n\n"
# Record the environment settings
printenv | sort > ~/xcode_build_$PRODUCT_NAME.env
# Locate the plist in the device build
printf "Checking device build...\n"
updatePlist "$BUILD_DIR/$CONFIGURATION-iphoneos/$PRODUCT_NAME.app/Info.plist"
printf "\n"
# Locate the plist in the simulator build
printf "Checking simulator build...\n"
updatePlist "$BUILD_DIR/$CONFIGURATION-iphonesimulator/$PRODUCT_NAME.app/Info.plist"
printf "\n"