有时候,咱们的app在测试时须要链接到一个testing服务器,在打包为企业证书的app时又须要链接到另外一个ad hoc 服务器,或者咱们想企业证书打包的app和debug模式打包的app有不一样的APP Bundle Identifier,以在一个测试机上同时安装....等等这些与App开发没有实际链接的需求,若是咱们手动改,很是麻烦,若是分工程管理更麻烦。git
下面介绍一些Xcode中的运行时配置,但愿有所启发:github
一个很好地实现上面的需求的方式是使用build configuration 构建配置和C 宏定义,这避免了为不一样的配置建立不一样的target。首先你须要在工程级别开始配置:shell
能够看到,上面有三个配置:Debug,Release,adhoc。并且,前面两个配置里都有两个xcconfig文件:xcode
这些xcconfig文件内容相似这样:服务器
接下来,您能够将被传递到编译器的每一个配置定义了一些宏标志。而后,您能够在编译时检查这些标志。在target级别中找到"Preprocessor flags"(在Xcode 6中是"Preprocessor Macros")构建设置,你能够在这里定义 KEY=VALUE 或者 只是 KEY 形式的宏定义:app
在你的代码中,你能够检查这些宏定义是否存在,例如:iphone
你也能够传入字符串类型,只不过必须用单引号括起来:编辑器
DEFAULT_LOCALIZATION_NAME='@"en"'
你也能够使用Schemes 编辑器,为Debug 和Archive时指定不一样的配置:post
若是你须要在Info.plist 文件里使用自定义的参数,你能够添加一个自定义的构建设置:测试
而后对不一样的配置,设置合适的值:
而后,你在Info.plist文件中,就能够使用这个自定义的参数:
甚至,咱们在命令行下构建项目时,还能够直接设置这个参数的值:
xcodebuild … BUNDLE_ID_SUFFIX=justTest build
首先建立一个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
参考:
整合上面实践的开源项目: