[iOS-Release] 自動打包分發(fā)

在 iOS 的日常開發(fā)中,需要不斷的向測試人員提供最新的測試版本。這一過程的手動操作分為3步:

  1. 對應用 target 執(zhí)行 archive 操作。
  2. 用 archive 產(chǎn)生的內(nèi)容導出 Ad Hoc 包。
  3. 將導出的.ipa包上傳至應用分發(fā)平臺,以供測試人員安裝。

這是一個重復性的且很耗時的操作,另外,通常都需要提供不止一種環(huán)境的測試版本,例如開發(fā)環(huán)境和生產(chǎn)環(huán)境等,這樣就成倍增加了打包分發(fā)的時間。如果在 Xcode 中已設置好對應的簽名文件后,使用腳本自動執(zhí)行整個過程,則可以節(jié)省大量時間,提高工作效率。

整個操作過程用到兩部分命令。一個是蘋果公司提供的自動構建命令 xcodebuild,使用該命令來進行 archive 與導出.ipa包的操作。另一部分是通過curl命令調(diào)用 API 來上傳導出的.ipa包,具體的 API 使用方式需要查看你所使用的分發(fā)平臺的 API 文檔。

Archive 操作

因為大部分的應用都是在 workspace 中搭建的,所以以對 workspace 中的應用執(zhí)行 archive 操作的命令為例,對于其他的構建方式,可以參考手冊進行修改。

xcodebuild archive -workspace ApplicationName.xcworkspace -scheme ApplicationName -archivePath ./build/ApplicationName.xcarchive

命令中使用 -archivePath 將產(chǎn)生的 .xcarchive 文件指定到項目目錄的 build 的路徑下,以便后續(xù)的導出.ipa包的操作。另外,如果是對 project 中的應用打包,要在 ProjectName.xcodeproj 所在的目錄執(zhí)行命令,如果該目錄下有多個 .xcodeproj,那么需要使用 -project 指定。

導出 Ad Hoc 包

使用xcodebuild -exportArchive命令從上一步產(chǎn)生的 .xcarchive 文件中導出.ipa包,完整的命令如下:

xcodebuild -exportArchive -archivePath ./build/ApplicationName.xcarchive -exportPath ./build -exportOptionsPlist ad_hoc_options.plist

-archivePath指明了上一步產(chǎn)生的 .xcarchive 文件所在目錄,-exportPath則是代表了導出的.ipa包存放的路徑,同樣放在項目目錄的 build 的路徑下,方便最后的清理刪除。注意最后一個參數(shù)-exportOptionsPlist,指明了一個 .plist 文件的路徑,該文件設置了導出.ipa包相關的一些參數(shù),如 method=ad-hoc 指明了導出的.ipa包是通過Ad-Hoc方式進行分發(fā)的,可配置的參數(shù)可使用xcodebuild --help命令查看。ad_hoc_options.plist 文件中的內(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>method</key>
    <string>ad-hoc</string>
</dict>
</plist>

上傳.ipa包至分發(fā)平臺

以蒲公英平臺為例,根據(jù)文檔,可直接使用curl命令將導出的.ipa包上傳至分發(fā)平臺:

curl -F "file=@./build/ApplicationName.ipa" -F "uKey=your_user_key" -F "_api_key=your_api_key" -F "updateDescription=your_description" http://www.pgyer.com/apiv1/app/upload

處理多個測試環(huán)境

通常情況下,開發(fā)中都有不止一種的測試環(huán)境,針對不同環(huán)境,可能有不同的域名或其他區(qū)別,最簡單的可以分為開發(fā)和生產(chǎn)環(huán)境。對于不同的環(huán)境,我們可以對應設置不同的 Configuration,比如 Debug 對應開發(fā)環(huán)境,Release 對應生產(chǎn)環(huán)境。因為開始的 archive 操作是針對 scheme 的,所以我推薦針對每一種 Configuration 建立一個 scheme,這樣就相當于每一種開發(fā)環(huán)境都有一個對應的 scheme。之后在腳本中初始化所有環(huán)境的 scheme,然后循環(huán)執(zhí)行相關操作,就可以完成所有測試環(huán)境的打包分發(fā)工作了。

schemes=(ApplicationName-debug ApplicationName-release)

for scheme in ${schemes[@]}; do
# do something
done

腳本

最終的 shell 腳本如下,配合構建號的自動修改,可以很好的完成自動打包分發(fā)的工作。

cd ~/ApplicationName
schemes=(ApplicationName-debug ApplicationName-release)

for scheme in ${schemes[@]}; do
    xcodebuild archive -workspace ApplicationName.xcworkspace -scheme ${scheme} -archivePath ./build/${scheme}.xcarchive

    if [ $? -ne 0 ]; then
        continue
    fi

    xcodebuild -exportArchive -archivePath ./build/${scheme}.xcarchive -exportPath ./build -exportOptionsPlist ad_hoc_options.plist
    
    if [ $? -ne 0 ]; then
        continue
    fi

    if [ ${scheme} = "ApplicationName-debug" ]; then
        description="Develop Environment"
    elif [ ${scheme} = "ApplicationName-release" ]; then
        description="Production Environment"
    fi

    curl -F "file=@./build/${scheme}.ipa" -F "uKey=your_user_key" -F "_api_key=your_api_key" -F "updateDescription=${description}" http://www.pgyer.com/apiv1/app/upload
done

rm -rf ./build

注意 scheme 數(shù)組,先執(zhí)行開發(fā)環(huán)境,再執(zhí)行生產(chǎn)環(huán)境。這樣上傳 ipa 包后,生產(chǎn)環(huán)境會是最新上傳的版本,即下載頁頂部的當前版本,而開發(fā)環(huán)境則在下方歷史版本列表里的最上面。這樣更符合測試人員的使用習慣,因為更多的時候是要安裝生產(chǎn)環(huán)境,如果需要安裝測試環(huán)境,則從下方歷史版本列表里選擇。

ToDo

因為目前在工作中是一個人單獨負責應用開發(fā),且沒有多余的機器作為 CI 的服務器,所以這種半自動化的方式已經(jīng)滿足需求了,后續(xù)再研究持續(xù)集成的內(nèi)容。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容