(這篇文章原來發布在 csdn ,如今 blog 遷移過來,並用 Markdown 從新排版以及修改)xcode
由於項目的需求,最近學習了一下 project.pbxproj ,對於這個文件的介紹,網上有很多資料,但感受都不甚詳細,這裏對我在學習中,學到的一些東西,稍做記錄,一方面方便新學的同窗能有個瞭解,同時也讓本身之後,有個參考。學習
xcode 將咱們對項目的配置信息,統一寫到了 project.pbxproj 文件裏,通常狀況下,咱們是不須要直接和 project.pbxproj 打交道的,咱們經過編輯 xcode 裏面的選項,如 buildsetting,general 來修改 pbxproj 文件,以下圖所示:ui
可是,在一些狀況下,咱們爲了方便、或者爲了不衝突,(尤爲在多人協做的狀況下),可能須要動態的修改 pbxproj 文件裏面的內容,這個時候,咱們就有必要了解一些project.pbxproj 文件的構成了。
pbxproj文件主要包含了如下幾項主要信息
工程文件關聯信息,如 PBXBuildFile、PBXFileReference
組織結構分類信息,如 PBXGroup
項目工程配置信息,如 XCBuildConfiguration、XCConfigurationList 這裏主要介紹項目工程配置信息。
查看工程的 pbxproj 文件的方法:找到工程文件,也就是 yourproject.xcodeproj,右鍵,顯示包內內容便可。spa
XCConfigurationList.net
這個部分,主要是 target ,以及 project 的一些基本信息,一般一個 project 會對應一個或者多個 target ,而每一個 target 以及 project 自己的配置都會不一樣的,相應的,在 pbxproj 文件中,須要將這幾個部分區分開來。以下圖:
上圖是一個 demo 工程裏的 XCConfigurationList。這個工程有一個 project PBXProject "NSUrlSession" ,兩個 target, 分別是
PBXNativeTarget "NSUrlSession" PBXNativeTarget "NSUrlSessionTests" 每一個部分,都包含了 debug release 兩部分,且都有相對應的 id。這些 uuid 是每一個target 相應的 CONFIGURATION 配置下的惟一標識。debug
XCBuildConfigurationcode
這個部分,記錄了 project 以及每一個 target 具體的配置信息,以上面的例子爲例,你想看知道 target NSUrlSession debug 對應的配置信息,你能夠根據其相應的id(62A4BA691B8228C000568CEF),去找到其相應的配置:
buildsetting 下面保存了咱們在 xcode 的 buildsetting 裏面,對該 target 的 debug 所設置的全部信息。若是你想知道每一個鍵值對具體對於那個選項,你能夠在 buildsetting 對某一項進行更改,而後 diff 一下 pbxproj 文件便可。blog
在大體瞭解了pbxproj文件的結構後,你就能夠開始作一些比較靈活的更改了,好比,咱們在開發過程當中,可能須要構建release、dailybuild等不一樣的ipa,每一個ipa都包含不一樣的provisioning文件。針對某種狀況,在構建過程總,手動選擇不一樣的證書,顯然太麻煩了,如今根據咱們上面的知識,咱們知道,咱們使用xcode對項目進行配置,全部的配置結果最終都會保存到pbxproj文件裏面,一樣的,provisioning選項,也保存在其中。那麼,咱們在build以前,根據不一樣的CONFIGURATION,修改pbxproj文件中相應的provisioning文件,就可以達到修改provisioning配置的目的,自動的實現上述過程。圖片
還以上面的例子來講,假如,我要在build以前,更改debug的provision,只須要把這個鍵值對改爲本身但願的樣子便可。ip
如下爲實現的腳本
#replace functhParam(){ orgin=$(grep -i -n $1 $filepath | head -n1 | awk -F ':''{print $1}') count=$(grep -i -A 200 $1 $filepath | grep -i -n'PROVISIONING_PROFILE' | head -n 1 |awk -F ':''{print $1}') let line=$orgin+count-1 echo $line sed -i '' $line"s/^.*/$2/g" $filepath } #Debug functhParam "^.*62A4BA691B8228C000568CEF.*="'PROVISIONING_PROFILE = "4173f94a-df88-4756-9f0e-1e40f83cdd21";'
這樣,就在腳本中,將 debug 的provisioning 綁定爲4173f94a-df88-4756-9f0e-1e40f83cdd21 了。