iOS IPA文件的自動化生成和無線分發
iOS應用開發測試過程中,通過無線網絡進行IPA包的分發將是非常便捷的,于是也就有了類似testflightapp之類的平臺(該公司近日已被蘋果收購)。對于這一功能,我們也可以自己實現,只需要一個簡單的http server,并部署三個文件:
- index.htm
- AppName.plist
- AppName.ipa
AppName.plist 和 AppName.ipa 文件的生成方式會在后面講述,而 index.htm的內容如下:
- <a href="itms-services://?action=download-manifest&url=http://192.168.1.***ppName/AppName.plist">Click to Install AppName</a>
可以猜測,該index.htm頁面的功能是下載plist文件,并進行觸發ipa文件的下載和安裝。
注:
iOS Developer Program 類賬號可注冊的測試設備上限為100臺,只有注冊了其UDID的設備才可以安裝該賬號開發的App;
iOS developer Enterprise Program 類賬號則對設備數 量不做限制,相對iOS Developer Program來講,企業賬號支持“in-house”應用,但不能提交應用到AppStore。該賬號可創建"in-house"類型的 Provisioning Profile,使用該Profile的App則可以安裝到任何設備上,無須注冊設備的UDID。
2. IPA文件的自動化生成
手動生成(Xcode 5):
點擊 Xcode->Product->Archive 菜單項,會打開 Organizer-Archives 窗口,點擊 Distribute...,然后選擇 Save for Enterprise or Ad Hoc Deployment,之后要選擇相應的Provisioning Profile文件,點擊 Export 按鈕會彈出保存ipa文件的窗口,勾選窗體下方的 Save for Enterprise Distribution 選項
其中"Application URL"為IPA文件的鏈接地址,如 http://192.168.1.***ppName/AppName.ipa,然后填寫Title后,其它內容 都可不填。這樣,保存后將會生成AppName.ipa 和 AppName.plist 兩個文件。
自動生成:
上面講到的生成ipa包的過程,需要點擊、選擇、填寫等多個步驟。這里利用Xcode提供的命令行工具可以自動化完成,其關鍵命令為
xcodebuild -exportArchive -exportFormat IPA -archivePath AppName.xcarchive -exportPath AppName.ipa -exportProvisioningProfile 'MyApp Distribution Profile'
意為,使用provisionging profile 'MyApp Distribution Profile' 將歸檔文件 AppName.xcarchive 導出為IPA文件 AppName.ipa
其中 AppName.xcarvhive 文件在使用上面提到的Xcode->Product->Archive菜單項即可生成(這里要講到的自動化生成,即在點擊該菜單項后自動化生 成IPA文件),此時生成的archive文件名都遵循按Xcode自定的命名規則,并統一生成到一個既定目錄下(~/Library /Developer/Xcode/Archives)
在Archive Scheme中添加Post-actions
在Product > Scheme > Edit Scheme 的 Archive 項中添加Post-actions,并在其Run Script中添加如下腳本
archive=`bash ~/tools/newest_archive.sh` ipa_path=~/ipa/AppName.ipa rm "${ipa_path}" xcodebuild -exportArchive -exportFormat IPA -archivePath "${archive}" -exportPath "${ipa_path}" -exportProvisioningProfile "MyApp Distribution Profile"
該腳本將在Archive菜單項的操作完成后自動執行。
獲取***的archive歸檔文件
上面的shell腳本中的 newest_archive.sh 是一個簡單的bash腳本,用以獲取***的archive文件,即剛剛由Archive菜單項生成的,其內容如下
- //! newest_archive.sh
- newest=
- backIFS=$IFS
- IFS=$(echo -en '\n\b')
- for f in `find ~/Library/Developer/Xcode/Archives -name *.xcarchive`
- do
- if [ -z $newest ]
- then
- newest=$f
- elif [ $f -nt $newest ]
- then
- newest=$f
- fi
- done
- echo "${f}"
- FS=$backIFS
如此,在每次點擊Archive菜單項時,都會將***生成的archive歸檔文件自動導出為AppName.ipa文件,并將其存到~/ipa目錄之下。
注:
1. 也許Xcode有提供更方便的訪問相應archive文件的方法,如有請指教
2. plist文件手工生成一次即可,所以也就沒有plist文件的自動化生成...
參考資料:
1. Wireless AdHoc Distribution http://gknops.github.io/adHocGenerate/
2. 頒發用于iOS設備的企業級應用程序 http://help.apple.com/iosdeployment-apps/mac/1.1/?lang=zh-cn
3. Xcode命令行工具之xcodebuild說明 https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html