隨著App產(chǎn)品上線運(yùn)行后的運(yùn)營(yíng),會(huì)出現(xiàn)這樣的需求:對(duì)同一個(gè)App,編譯出不同ipa包,供不同渠道使用,也即是我們常常說的馬甲包。這種需求在Android中出現(xiàn)較多,不同的apk對(duì)應(yīng)不同的渠道。Android中可以通過ADB命令行一次性配置好所有渠道標(biāo)志,很輕易的完成馬甲包的需求。iOS端也有同樣的利器——xcodebuild。下面逐步介紹其實(shí)現(xiàn)方式。
打開Mac命令行,輸入
xcodebuild -version
我們就能看到我們本機(jī)安裝Xcode的版本信息,「9.2」代表大版本,「9C40b」代表9.2下的小版本。一般安裝Xcode的同時(shí)會(huì)自動(dòng)帶有xcodebuild命令,如果找不到命令,則需要下載xcodebuild重新安裝,請(qǐng)自行搜索。
Xcode 9.2
Build version 9C40b
輸入命令
xcodebuild -help
能看到xcodebuild命令詳情。其中命令參數(shù)的解釋可以對(duì)照官方文檔理解。
下面只介紹和打包有關(guān)的命令。
Xcode中新建Single View App,或者命令行cd進(jìn)入自己工程的根目錄(即帶有xxx.xcodeproj的目錄),輸入命令
xcodebuild -configuration Debug
就能產(chǎn)生Xcode中 command+r 一樣的效果。如果出現(xiàn)如下錯(cuò)誤:
Check dependencies
Code Signing Error: Signing for "ipaAuto" requires a development team. Select a development team in the project editor.
Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.2'
** BUILD FAILED **
The following build commands failed:
Check dependencies
說明我們?cè)诠こ讨袥]有配置好 BundleIdentifier 和
Provisioning Profile。因?yàn)閤codebuild命令如果沒有指定具體參數(shù),就會(huì)采用項(xiàng)目中的默認(rèn)配置。配置好項(xiàng)目中的
BundleIdentifier 和 Provisioning Profile 文件,保證項(xiàng)目正常運(yùn)行后,再次使用命令,就能得到正確的提示。
** BUILD SUCCEEDED **
如果我們使用的是Xcode8.0或者以下版本,打包使用的命令為:
//“xxx/xxx.app" 代表Product文件的存放路徑;
//“xxx.ipa“代表編譯成功的ipa路徑;
xcrun -sdk iphoneos PackageApplication -v “xxx/xxx.app" -o “xxx.ipa“
Product文件路徑的尋找方式如下圖,右鍵Show in Finder后,按住app文件拖拽到Mac命令行,就能獲取Product的路徑。ipa路徑可以自定義。

在Xcode9.0中,蘋果爸爸對(duì)打包命令進(jìn)行了修改,舍棄了PackageApplication(當(dāng)然也可以重新安裝PackageApplication),使用「xcodebuild -exportArchive」命令,具體參數(shù)如下:
//xxx.xcarchive代表xcarchive文件;
//xxx.plist代表指定的exportOptionsPlist文件;
xcodebuild -exportArchive -archivePath xxx.xcarchive -exportOptionsPlist xxx.plist -exportPath ./Product
xcarchive和exportOptionsPlist都是在對(duì)工程進(jìn)行Archive時(shí)自動(dòng)生成的文件。

打包工程,選擇和Provisioning Profile對(duì)應(yīng)的distribution:

注:
此處去掉勾選,否者命令行打包會(huì)報(bào)錯(cuò)

如果正常導(dǎo)出導(dǎo)出,最后能看到如下4個(gè)文件:

其中ExportOptions.plist就是打包需要的plist文件,可以看到它包含8個(gè)內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>compileBitcode</key>
<false/>
<key>method</key>
<string>ad-hoc</string>
<key>signingStyle</key>
<string>automatic</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>Z5QA9CANKM</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
以上8個(gè)內(nèi)容不可減少,可以根據(jù)打包要求繼續(xù)增加。
xcarchive文件也是在手動(dòng)打包后Xcode生成的文件,可以在Xcode偏好設(shè)置中找到存放位置,將文件拷貝到工程根目錄。

cd到項(xiàng)目根目錄,再次調(diào)用以上打包命令,就能在工程根目錄的Product文件夾下看到打包成功后的文件。
Tips:
出現(xiàn)錯(cuò)誤:
error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/q_/d_cyw7jd7q70lpcp28m9mqx80000gn/T/ipatool-json-filepath-ZD7JAl}
** EXPORT FAILED **
前面勾選處需要去掉。
參考:
1 Xcode9 xcodebuild export plist 配置
2 打包ipa時(shí)遇到錯(cuò)誤