有时候,我们的app在测试时需要连接到一个testing服务器,在打包为企业证书的app时又需要连接到另一个ad hoc 服务器,或者我们想企业证书打包的app和debug模式打包的app有不同的APP Bundle Identifier,以在一个测试机上同时安装....等等这些与App开发没有实际连接的需求,如果我们手动改,非常麻烦,如果分工程管理更麻烦。
下面介绍一些Xcode中的运行时配置,希望有所启发:
一个很好地实现上面的需求的方式是使用build configuration 构建配置和C 宏定义,这避免了为不同的配置创建不同的target。首先你需要在工程级别开始配置:
可以看到,上面有三个配置:Debug,Release,adhoc。而且,前面两个配置里都有两个xcconfig文件:
这些xcconfig文件内容类似这样:
接下来,您可以将被传递到编译器的每个配置定义了一些宏标志。然后,您可以在编译时检查这些标志。在target级别中找到"Preprocessor flags"(在Xcode 6中是"Preprocessor Macros")构建设置,你可以在这里定义 KEY=VALUE 或者 只是 KEY 形式的宏定义:
在你的代码中,你可以检查这些宏定义是否存在,例如:
你也可以传入字符串类型,只不过必须用单引号括起来:
DEFAULT_LOCALIZATION_NAME='@"en"'
你也可以使用Schemes 编辑器,为Debug 和Archive时指定不同的配置:
如果你需要在Info.plist 文件里使用自定义的参数,你可以添加一个自定义的构建设置:
然后对不同的配置,设置合适的值:
然后,你在Info.plist文件中,就可以使用这个自定义的参数:
甚至,我们在命令行下构建项目时,还可以直接设置这个参数的值:
xcodebuild … BUNDLE_ID_SUFFIX=justTest build
自动根据当前git项目的提交次数来在构建时,修改Info.plist的构建版本号
首先创建一个shell 脚本 buildNumber.sh ,主要是获取当前git项目的提交次数,作为build version,修改Info.plist文件对应的build verison:
#!/bin/sh
git=`sh /etc/profile; which git`
build_num=`"$git" rev-list --all |wc -l`
branch=`"$git" rev-parse --abbrev-ref HEAD`
commit=`"$git" rev-parse --short HEAD`
version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_FILE}"`
if [ $CONFIGURATION = "Debug" ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_num-$branch" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
else
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_num" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
fi
echo "Updated ${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
然后在 target级别中,在Build Phases菜单的最后面添加一个shell:
指定这个shell的文件路径:
注意,修改的这个Info.plist文件不会影响工程目录下的Info.plist文件,因为修改的是构建目录下的app里面的Info.plist,例如,我这里修改的是 ./Build/Products/Debug-iphonesimulator/yooke.app/Info.plist
参考:
- http://*.com/questions/10497552/how-to-configure-independent-sets-of-runtime-settings-in-xcode
- http://blog.manbolo.com/2013/05/17/passing-user-variable-to-xcodebuild
- http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build
整合上面实践的开源项目: