有時候,咱們的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
參考:
整合上面實踐的開源項目: