作為iOS開發人員,pbxproj文件對於我們來說即熟悉又陌生,熟悉到我們每天都得見面。而除了偶爾遇到的合並沖突,其余時候我們甚至忘記了它的存在。當然,並不是說它不重要,相反,pbxproj文件保存了項目的所有配置關聯信息
pbxproj文件主要包含了以下幾項主要信息
工程文件關聯信息,如PBXBuildFile、PBXFileReference
組織結構分類信息,如PBXGroup
項目工程配置信息,如XCBuildConfiguration、XCConfigurationList
pbxproj文件格式既不是json也不是xml,但是網上已經開源了不少解析該文件的工具,如XcodeProjectJavaAPI、pbxplorer等,通過這些工具,我們可以解析pbxproj文件從而獲取工程的一些配置信息等。
由於Xcode工具的存在,我們一般不需要與pbxproj直接打交道,通過General、Build Settungs或者Info等面板,就可以完成項目工程配置信息的修改。但是,當涉及到命令行的時候,Xcode就顯得束手無策。最常見的比如ci的持續集成。通常情況下,大型工程一般由多個開發人員共同開發,而每一個開發人員的開發證書配置文件都有可能不同,特別是當工程中包含Today或者Watch時,配置證書的不同經常會導致ci編譯的失敗。此時,通過Xcode幾乎無法解決問題,而在ci編譯前,通過修改pbxproj文件證書配置信息就能很好的解決該問題
打開pbxproj文件,涉及到證書配置文件的代碼段如下
A05D02521AFFB09600011ADB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = ""; INFOPLIST_FILE = Simple/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = "4656b587-123a-45bc-a030-bd1a2ewqeqeq"; }; name = Debug; };
我們需要做的就是在ci編譯前用服務器上相應mobileprovision替換PROVISIONING_PROFILE後面的mobileprovision(mobileprovision文件通常以字符串命名),不幸的是,你會發現多行PROVISIONING_PROFILE,而Today和Watch與工程的證書文件都不相同,簡單的字符替換已無法區別target。解決方法就是通過A05D02521AFFB09600011ADB這一串編號(姑且叫它編號吧)來區分不同的target
當工程創建的時候,每一個target都有一個相應的編號,並且不會再改變,編號後面/*Debug*/表明這一配置屬於Debug Configuration,而ci集成時一般選擇release或者distribution,因此,選擇對應的編號,其後面的PROVISIONING_PROFILE就是我們需要修改的字符串
filepath=project.pbxproj functhParam(){ orgin=$(grep -i -n $1 $filepath | head -n 1 | 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 } functhParam "^.*7AD502241505A17900652731.*=" 'PROVISIONING_PROFILE = "ace6cb3b-9231-498c-acad-5ea4542f53ff";'
以上腳本的功能就是查找7AD502241505A17900652731編號後面的PROVISIONING_PROFILE,並將該行替換為“ace6cb3b-9231-498c-acad-5ea4542f53ff”表示的mobileprovision配置文件
以上只是修改pbxproj文件的一個應用,如果你想一鍵修改工程Bundle Identifier,或者你想工程文件夾整理,修改pbxproj都是一種不錯的選擇,換一換思路,也許路就有了,祝大家玩的愉快!