多應用自動打包
前言
網上很多文章都是陳詞濫調,老黃歷啦,在XCode多次更新后,那些腳本,那些命令已經不管用啦。
本文是基於XCode8.3版本的。
需求描述
要求做一個工具,可以批量打上百個應用,這些應用有不同的icon,啟動圖,bundleID,第三方賬號,和其他一些業務相關的差異。
做起來~
重簽名打包是有多種方法實現的。
我原來是用xcodebuild命令直接打出ipa包,然后重簽名再導出的。
但執行xcrun -sdk iphoneos PackageApplication
命令時發現,新版OS X已經沒有PackageApplication工具了。
所以采用了以下方法:編譯出xcarchive包,再使用xcodebuild導出ipa。
編譯
xcodebuild -quiet -workspace xxx.xcworkspace -scheme xxx -configuration Release clean -sdk iphoneos -archivePath xxx.xcarchive archive
修改
修改bundleID等Info.plist中的內容:
簡單的數據格式:
defaults write ${InfoPlistPath} key value
復雜的數據格式:
defaults write $InfoPlistPath "CFBundleURLTypes" -array-add "<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>xxx</string>
</array>
</dict>"
修改icon等資源文件
使用cp命令替換
重簽名
一段題外話:由於某些錯誤,我打出了可以安裝成功的adhoc包,但是檢查證書才發現,是用的dev證書簽名的,也是夠神奇的了。
XCode8.3會在導出時自動根據bundleid重簽名,但問題是不會自動修改包里的embedded.mobileprovision文件(也就是配置文件),會導致在使用Application Loader上傳包時,報錯說配置文件與簽名證書不符。
我嘗試過直接使用cp替換配置文件,但在導出時,它又給我換回去了。。。
所以采取了先重簽名再導出的方法。
security cms -D -i "embedded.mobileprovision" > t_entitlements_full.plist
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' t_entitlements_full.plist > entitlements.plist
Entitlements=entitlements.plist
codesign -f -s "$tcertificationname" --entitlements $Entitlements ${tapppackagepath}
注意:--entitlements $Entitlements
這個參數十分重要,對應的是一個plist文件,但不能通過手動編輯的方式生成這個文件,必須通過命令(好神奇吧)。
關於entitlements后續更新。
導出
defaults write ${exportoptionsplistpath} "teamID" "${tteamid}"
defaults write ${exportoptionsplistpath} "export_method" "${texportmethod}"
defaults write ${exportoptionsplistpath} "uploadSymbols" -bool true
xcodebuild -exportArchive -exportOptionsPlist ${exportoptionsplistpath} -archivePath xxx.xcarchive -exportPath
-exportOptionsPlist參數是新出的,目前已知的參數有:
- teamID
- export_method:值為ad-hoc或者app-store,如果找不到該參數,就會使用dev證書簽名。。。
- uploadSymbols