更新存档中的Info.plist值

时间:2015-12-08 21:55:26

标签: xcode archive info.plist

我需要能够在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中更新这些值(例如,使用预执行),因为每次归档时它都会使源变脏。

1 个答案:

答案 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"