前言
????將 iOS 應(yīng)用程序構(gòu)建分發(fā)或者部署到 iTunes Connect 涉及各種各樣的事情。iOS 開發(fā)人員使用 Xcode 構(gòu)建萝快,測試锻霎,歸檔,導(dǎo)出 ipa 進(jìn)行分發(fā)或者上傳到 iTunes Connect 是非常常見的做法杠巡。
使用 Xcode 構(gòu)建
????在通過 Xcode 構(gòu)建時量窘,往往都是重復(fù)的步驟,大致流程如下:
- 拉取倉庫最新的代碼氢拥;
- 進(jìn)行
pod install
蚌铜; - 修改一些配置項或者代碼,例如:配置指定的證書嫩海,描述文件等等冬殃;
-
Clean
工程; - 使用 Xcode -> Products -> Archive 歸檔工程叁怪,生成
.xcarchive
文件审葬; - 查看 Xcode -> Window -> Organizer 中的 Archives 列表;
- 選擇對應(yīng)的
.xcarchive
文件 Export 進(jìn)行分發(fā)或者上傳 Appstore奕谭。
如何使用命令行構(gòu)建項目
????可以看到通過 Xcode 構(gòu)建涣觉、分發(fā)和部署是非常耗時的事情,幸運的是血柳,Apple 有命令行工具來完成所有這些工作官册,其中一個最受歡迎的實用工具是 xcodebuild。關(guān)于 xcodebuild 的介紹可以查看难捌。
????當(dāng)然膝宁,每次在終端輸入 xcodebuild
命令和直接使用 Xcode 一樣繁瑣鸦难。因此,通常將這些命令保存在 Shell 腳本中员淫,讓我們來看看合蔽,怎樣配置一個 Shell 腳本實現(xiàn)一行命令完成上面的任務(wù)。
prepare
-
配置打包相關(guān)的參數(shù)
-
名稱:
.xcworkspace
或者.xcodeproj
的名字介返、scheme
名稱等等拴事。根據(jù)自己的情況編寫,下面參照示例:# .xcworkspace的名字圣蝎,必填 workspace_name="xxxxx" # 指定項目的scheme名稱(也就是工程的target名稱)挤聘,必填 scheme_name="xxxxx" # 指定 configuration ,一般用Release捅彻。 build_configuration="Release" # displayName appVersion buildVersion 等等
-
-
路徑:
archive
輸出文件路徑组去、導(dǎo)出ipa
文件路徑、ExportOptions.plist
文件路徑步淹。根據(jù)自己的情況編寫从隆,下面參照示例:# 獲取當(dāng)前腳本所在目錄 script_dir="$( cd "$( dirname "$0" )" && pwd )" # 工程根目錄 project_dir=$script_dir # 指定輸出導(dǎo)出文件夾路徑 export_path="$project_dir/Build" # 指定輸出歸檔文件路徑 export_archive_path="$export_path/$scheme_name.xcarchive" # 指定輸出ipa文件夾路徑 export_ipa_path="$export_path/" # 指定導(dǎo)出ipa包需要用到的plist配置文件的路徑 export_options_plist_path="$project_dir/ExportOptions.plist"
-
ExportOptions.plist:配置較多的情況,可以用
PlistBuddy
生成缭裆。根據(jù)自己的情況編寫键闺,下面參照示例:echo "bundle_identifier = ${bundle_identifier}" echo "method = ${method}" echo "mobileprovision_name = ${mobileprovision_name}" /usr/libexec/PlistBuddy -c "Add :method String ${method}" $export_options_plist_path /usr/libexec/PlistBuddy -c "Add :provisioningProfiles:" $export_options_plist_path /usr/libexec/PlistBuddy -c "Add :provisioningProfiles:${bundle_identifier} String ${mobileprovision_name}" $export_options_plist_path /usr/libexec/PlistBuddy -c "Add :compileBitcode bool NO" $export_options_plist_path
-
拉取倉庫代碼,并進(jìn)行
pod install
cd ${project_dir} git pull 或者在一個新的目錄執(zhí)行 git clone pod install --repo-update
-
使用 Plistbuddy澈驼、Python 或者 Shell 修改一些配置項或者代碼辛燥,比如修改
Info.plist
中的版本號/usr/libexec/PlistBuddy -c 'Set :$key string "value" ' info.plist
構(gòu)建
-
使用
xcodebuild clean
清理工程xcrun xcodebuild clean -workspace ${workspace_name}.xcworkspace \ -scheme ${scheme_name} \ -configuration ${build_configuration}
-
使用
xcodebuild archive
歸檔xcrun xcodebuild archive -workspace ${workspace_name}.xcworkspace \ -scheme ${scheme_name} \ -configuration ${build_configuration} \ -archivePath ${export_archive_path}
-
使用
xcodebuild -exportArchive
導(dǎo)出 .ipa 文件ExportOptions.plist
文件可以通過腳本生成,也可以提前準(zhǔn)備好xcrun xcodebuild -exportArchive \ -archivePath ${export_archive_path} \ -exportPath ${export_ipa_path} \ -exportOptionsPlist ${export_options_plist_path} \ -allowProvisioningUpdates
部署
????可以用輸出的 ipa 文件上傳至蒲公英缝其、fir.im 挎塌、私有存儲以及 iTunes Connect 等等
蒲公英
????蒲公英提供上傳 App API,需要 user key
内边、 api key
以及安裝密碼 password
curl -F "file=@/tmp/example.ipa" -F "uKey=" -F "_api_key=" -F "password=" https://upload.pgyer.com/apiv1/app/upload
Fir.im
????Fir.im 同樣提供了發(fā)布 App API榴都,需要 API_Token
。上傳分為兩步:
-
獲取上傳憑證
名稱 類型 必填 說明 type String 是 ios 或者 android(發(fā)布新應(yīng)用時必填) bundle_id String 是 App 的 bundleId(發(fā)布新應(yīng)用時必填) api_token String 是 長度為 32, 用戶在 fir 的 api_token curl -X "POST" "http://api.bq04.com/apps" \ -H "Content-Type: application/json" \ -d "{\"type\":\"ios\", \"bundle_id\":\"xxx.xxx.xx\", \"api_token\":\"xxx\"}"
-
上傳文件
將 ICON 和安裝包文件分別上傳到上一步操作中獲取到的
cert.icon
和cert.binary
中的upload_url
curl -F "key=xxxxxx" \ -F "token=xxxxx" \ -F "file=@aa.ipa" \ -F "x:name=xxxx" \ -F "x:version=a.b.c" \ -F "x:build=1" \ -F "x:release_type=Adhoc" \ -F "x:changelog=first" \ https://up.qbox.me
iTunes Connect
????蘋果提供了 altool
上傳 App 的二進(jìn)制文件漠其,在使用 altool
上傳之前嘴高,需要提前準(zhǔn)備開發(fā)者認(rèn)證信息。
-
驗證 App
xcrun altool --validate-app -f ${ipa_path} -t ios --apiKey ${api_key} --apiIssuer ${issuer_id} --verbose
-
上傳 App
xcrun altool --upload-app -f ${ipa_path} -t ios --apiKey ${api_key} --apiIssuer ${issuer_id} --verbose