摘要
随着蘋果手持裝置使用者的不斷增加,ios應用也增長迅速,同時随着iphone被越獄越來越多的app 的管道也不斷增多,為各個管道打包成了一件費時費力的工作,本文提供一種比較智能的打包方式來減少其帶來的各種不便。
TAG
Ios打包,app打包,iphone打包,iphone自動化打包,ios打管道包,iphone自動化打管道包
自動化打包背景介紹
1、背景
随着ios程式釋出的管道逐漸的增多,為每個管道打包也成為特别耗費時間和體力的一項技術活了,而這一般大多數都是由rd來完成的。這樣就占用了rd很多的開發時間,何不把這些東西寫成一個自動化的腳本,然後交給qa 或是 pm來完成這個打包過程了。經過一番調研發現網上這種腳本還是很少的,不過xcode 提供了shell編譯工具 xcodebuild 和 ipa打包工具xcrun ,這就有理由讓我們利用這兩個工具寫一個自動化的打包腳本來提高我們的工作效率和自動化程度。
2、ios程式包格式、管道包格式
1) 産生多管道的原因及多管道帶來的打包問題:随着iphone、ipad、itouch等手持裝置火熱銷售,而它們上面的應用也随之火爆了起來,而随之而來的就是以上裝置被越獄後就可以在越獄的裝置上直接運作ipa程式包 而不用通過appstore去下載下傳,這樣一來國内就産生了衆多的專門為越獄手機而開設的管道提供ipa程式包的下載下傳。随着越來越多的管道,推廣時為各個管道打包就成了一項比較耗費時間和精力的技術活了,是以我們必須尋找一種自動化的方式 讓打包變得高效簡單。
2) Ios程式包分為appstore二進制檔案跟管道包兩種格式
appstore二進制檔案:通過xcode工具可以生成一個.app格式的二進制檔案。
管道包:格式為.ipa格式,在沒有自動化打包工具之前都是利用xcode來生成相應的管道包,而且每次隻能生成一個管道包,每次打包之前都得手動該管道ID,帶來的問題就是耗費時間、效率低下、容易出錯、增加風險。
3、傳統的ios打包方式
利用xcode 打包
1) appstore 二進制程式包
打開你的項目,進入“Edit Project Settings”,進入Configuration頁面,選中Release點選下面的Duplicate,複制一個新的配置項出來,命名為Distribution。然後進入Build頁面,頂上的Configuration下拉框選中Distribution,下面的Code Signing Identity裡面的Any iPhone OS Device後面對應的值選中你的那個Distribution的證書。然後點選“Build”–> “Build” 就可以編譯程式了
編譯成功後,你就可以在相應的build目錄下看到一個.app的二進制檔案。
2) 管道ipa包
根據以上步驟同樣配置好Distribution 證書 ,然後點選 “Build”–> “Build and Archive” 就可以編譯程式了。接着打開“Window””Organizer” 左邊欄中選擇”ARCHIVED APPLICATIONS” 然後再右側清單中選中剛才編譯的程式包 再點選右側右邊頂部的”Share”按鈕 儲存到磁盤即可。就會生成一個.ipa的檔案 即為管道包。
注意:以上運作裝置必須選擇“Deveice“
4、傳統的打包帶來的問題
耗費時間、耗費體力、效率低下、隻能依賴RD來完成、容易出錯、釋出風險比較高、QA回歸确認比較困難、 不智能化。
自動化打包具體實作
1、xcodebuild 介紹:
2 | ][-activetarget][-alltargets][-target]...[-parallelizeTargets][-activeconfiguration][-configuration][-sdk |][=]...[]... |
3 | xcodebuild[-version[-sdk |]] |
5 | xcodebuild[- find ][-sdk |] |
也可以在終端輸入:xcodebuild –help 或 –h檢視具體的選項
顯示xcodebuildversion:xcodebuild –version
顯示目前系統安裝的sdk:xcodebuild –showsdks
顯示目前目錄下project Information:xcodebuild –list
需要注意的是:執行以上指令時必須把位置定位在ios項目檔案的根目錄下 否則會提示找不相關指令的。
2、xcrun 介紹:
此工具主要用于将app檔案打包成ipa格式的程式包。(主要用于已越獄手機)。
具體用法如下:
1 | /usr/bin/xcrun -sdk iphoneos PackageApplication – v [{TARGET}.app] -o [{TARGET}.ipa] --sign [{Iphone Distribution:xxx}] –embed [{xxx.mobileprovision}] |
其中:-v 對應的是app檔案的絕對相對路徑 –o 對應ipa檔案的路徑跟檔案名 –sign
對應的是 釋出證書中對應的公司名或是個人名 –embed 對應的是釋出證書檔案
注意如果對應的Distribution 配置中已經配置好了相關證書資訊的話 –sign 和 –embed可以忽略
3、具體方案
a) 從源程式一次性打出所有管道的ipa包 跟appstore的二進制包
為了讓自動化腳本執行一次把所有的管道包都打好,是以必須有一個配置檔案用來存儲所有的管道名跟管道号,而項目檔案中也應該有個對應存儲目前管道号的檔案,每次程式都從這個存放管道号的檔案中讀取管道号即可,大概的思路就是利用腳本循環執行打包過程,而每次打包前都通過腳本修改項目中存放管道号的檔案為目前循環的最新管道号,讓後逐個打包。
注:具體事例見附錄
b) 提供一個ipa格式的母包 從母包生成其它所有的管道包跟 appstore 包
qa的一些疑問,如何確定所有的管道包就是他們驗證過的那份代碼呢?
的确,以上代碼每次都是重新對程式進行打包,可qa往往測試驗證的隻有一個包,如果個個去驗證無意中之中又增加了qa的工作量哈!!而且風險也不可控。是以基于上面的問題我們想出了一下辦法:qa隻驗證一個程式包(即母包)如果這個包通過驗證 我們就通過母包去生成其它管道的包,這樣一來qa也不用确認那麼多的管道包了,風險也得到了有效的控制。
可能你會問:用一個包生成其他的包可行麼??
原因是這樣的:因為每個管道隻是管道号發生變化,而其他的内容又不會發生變化,而我們的管道号又是存儲在sourceid.dat這個檔案中的,是以隻要改變母包中的sourceid.dat檔案的内容即可,而ipa包又是同zip格式進行壓縮,是以基本思路就是通過zip先對母包進行解壓,然後改變sourceid.dat的内容 最後再用zip進行壓縮成相應的管道包即可。
Ipa包的目錄:
注:具體事例見附錄
一些問題
當有些shell指令在mac的終端中運作不通過時,請確定你的shell腳本是在mac環境下編寫的而不是同xp等其他環境中copy過來的。因為mac跟xp的編碼是不一樣是以會有問題。
總結:
通過從母包打出其他管道的包這種方法:得到以下好處
i. 降低了rd的工作量,一起qa的工作量。
ii. 讓測試釋出程式時的風險得到了控制。
iii. 提高了打包釋出工作效率。(幾十個包 隻需短短的幾分鐘)。
iv. 提高了自動化。
v. 不依賴mac 以及xcode環境 直接在linux 下即可完成 從母包生成其它包
附錄
利用xcode環境一次生成所有包的shell 腳本代碼:
03 | xcodebuild clean -configuration Distribution //clean項目 |
05 | distDir= "/Users/xxxx/dist" |
06 | releaseDir= "build/Distribution-iphoneos" |
10 | for line in $( cat data.dat) //讀取所有管道号data.dat檔案 |
12 | ipafilename=` echo $line| cut -f1 -d ':' ` //管道名 |
13 | sourceid=` echo $line| cut -f2 -d ':' ` //管道号 |
14 | echo "ipafilename=$ipaname" |
15 | echo "sourceid=$sourceid" |
16 | targetName= "youtargename" //項目名稱(xcode左邊清單中顯示的項目名稱) |
17 | echo "sourceid=$sourceid" |
18 | echo "ipafilename=$ipafilename" |
19 | echo "$sourceid" > sourceid.dat |
24 | ipapath= "${distDir}/${targetName}_${version}_from_${sourceid}.ipa" |
26 | echo "***開始build app檔案***" |
27 | xcodebuild -target "$targetName" -configuration Distribution -sdk iphoneos build |
28 | appfile= "${releaseDir}/${targetName}.app" |
29 | if [ $sourceid == "appstore" ] |
32 | zip -r "${targetName}_${ipafilename}_${version}.zip" "${targetName}.app" |
33 | mv "${targetName}_${ipafilename}.zip" $distDir 2> /dev/null |
36 | echo "***開始打ipa管道包****" |
37 | /usr/bin/xcrun -sdk iphoneos PackageApplication - v "$appfile" -o "$ipapath" --sign "iPhone Distribution:xxxxxx" |
注:以上的data.dat檔案為存放管道号清單的檔案 其格式為:3g:1001b 即 (管道名:管道号) sourceid.dat 為項目檔案中存放管道号的檔案(内容隻有一個管道号)。當然了上面腳本隻是說明了下如何利用xcodebuild 和 xcrun 進行打包 以及自動打包的一個邏輯,shell腳本好的同學可以自由發揮哈。。。
從ipa格式的母包生成其它管道包的shell腳本執行個體:
02 | sourceipaname= "母包名.ipa" |
03 | appname=”app檔案名.app” //加壓後Pauload目錄項.app檔案名需要根據自己的項目修改 |
04 | distDir= "/Users/lxxx/Qa" //打包後檔案存儲目錄 |
07 | mkdir "$distDir" unzip $sourceipaname //解壓母封包件 |
08 | for line in $( cat data.dat) //讀取管道号檔案并進行循環 |
10 | ipafilename=` echo $line| cut -f1 -d ':' ` |
11 | sourceid=` echo $line| cut -f2 -d ':' ` |
12 | echo "ipafilename=$ipaname" |
13 | echo "sourceid=$sourceid" |
15 | echo "sourceid=$sourceid" |
16 | echo "ipafilename=$ipafilename" |
19 | echo "replace sourceid.dat before: " |
21 | echo "$sourceid" > sourceid.dat |
22 | echo "replace sourceid.dat after: " |
24 | if [ $sourceid == "appstroe" ] |
27 | zip -r "${targetName}_${version}_from_${sourceid}.zip" $appname //appstore二進制檔案 |
29 | mv "${targetName}_${version}_from_${sourceid}.zip" $distDir |
33 | zip -r "${targetName}_${version}_from_${sourceid}.ipa" Payload //打成其他管道的包 |
34 | mv "${targetName}_${version}_from_${sourceid}.ipa" $distDir |
注:以上data.dat也是用來存儲所有管道号的,sourceipaname就是通過qa驗證的母包,appname為ipa包加壓後Payload 目錄下的app檔案名并且以上所有檔案必須與腳本檔案保持在同一目錄下以及在mac環境中執行。