fir提供了很不錯的自動化打包腳本,傳送門如下
https://github.com/FIRHQ/fir-cli/blob/master/README.md
不過實戰的時候,會遇到一些坑,這里整理一下經驗
最簡單的打包命令如下:
fir build_ipa
這樣會自動打包ipa,不過會輸出到一個臨時目錄,如
Results at '/var/folders/ky/syfrlzpn2bb8fmn5pr51tstm0000gp/T/d20160306-64805-akfs4h/1457249301.ipa'
對于一個CI平臺來說,這樣的存放路徑毫無意義,所以一般會這樣寫
fir build_ipa -o ./
這樣就會把ipa拷貝到當前目錄,命名規則是bundledisplayname+bundleversion+build號,還是挺不錯的命名方式。
接下來我們考慮一下,如果是使用了Pod的項目,需要怎么處理:
pod install;
fir build_ipa -w workspace路徑 -C release -S scheme名字
以上命令很容易理解,先把pod需要的東西配置好,然后用自動生成的workspace來打包。
遺留一個問題,如果是一個全新的項目,第一次pod install以后是不會自動生成scheme的,必須要用xcode顯式打開一下,目前還沒解決這個問題
到這里還是可以滿足需求的,不過我們還要考慮更通用的CI場景。對于CI所在的服務器來說,應該是預先不知道開發者賬號密碼的(業務解耦)。這樣的話,要求新開CI任務的時候,業務方上傳provision文件和p12文件即可。
所以如果在這種場景下,以上的命令會報錯
Code Sign error: No matching provisioning profiles found: No provisioning profiles with a valid signing
fir的團隊顯然考慮到了這種場景,提供了一個額外的參數:
-f, [--profile=PROFILE] # Set the export provisioning profile
然而,如果你直接使用的話,xcode7的環境下應該會報如下錯誤:
xcodebuild: error: The flag -exportArchive is required when specifying -exportProvisioningProfile.
xcodebuild: error: The flag -archivePath is required when specifying -exportArchive.
xcodebuild的幫助文檔是查不到這個參數的,我隱隱覺得不妙了。不過還是根據上述提示加上了-exportArchive和-archivePath,這下fir不干了,直接跳到了幫助界面,表示不認識這兩個參數。
好吧,幸好fir的腳本是開源的,如此小bug是不是修改一下build_ipa這個函數就好了?然而為了保險,我還是先轉換成命令行運行一下,然后就收到了如此的錯誤:
xcodebuild: error: The flag -scheme cannot be specified along with -exportArchive.
╮╯_╰╭搞毛,原來想用exportArchive就不能指定scheme,但是想要用workspace編譯又要指定scheme,死循環了咋辦?!
好的,為了理清思路,我們還是先搞清楚,exportArchive,exportProvisioningProfile之類的參數應該怎么用,然后就會找到這篇文章
http://www.thecave.com/2014/09/16/using-xcodebuild-to-export-a-ipa-from-an-archive/
簡單來說這個外國人的意思是這樣的,先用archive命令把做一次歸檔,然后再用exportArchive的方式給二進制文件指定provision文件簽名。
思路是簡單的,可惜現實還是殘酷的,上面已經提到了,如果本地沒有簽名文件的話,xcodebuild的最后一步,會提示簽名失敗。又死循環了?!
這個時候google起到了關鍵的作用,萬能的SO上面,有水友已經解決了這個問題
http://stackoverflow.com/questions/11034133/building-ios-applications-using-xcodebuild-without-codesign
黑科技宏定義:CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
,讓你解決打包簽名的困擾。
所以,如果想用fir打一個無簽名的包,可以如下指定
fir build_ipa -w workspace路徑 -C release -S scheme名字 CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
如此就會輸出一個無簽名的ipa文件,解壓發現Payload目錄下,并沒有_CodeSignature目錄。
接下來的思路就很明確了,我們再補上重簽名流程即可,推薦這篇文章的教程,有附上可用的腳本
http://www.ifun.cc/blog/2014/02/22/ios-appzhong-xin-qian-ming-fang-fa-jie-shao/
最后再補一下,如果想要做到更完美,可以自行解析provision文件里面的TeamName和TeamIdentifier,然后再丟給resign.sh處理,這樣resign.sh也不需要業務方提供了。