iOS自動化打包實現(在線生成APP需要的技術)

自動化打包背景介紹

1、背景

隨着ios程序發佈的渠道逐漸的增多,爲每個渠道打包也成爲特別耗費時間和體力的一項技術活了,而這一般大多數都是由rd來完成的。這樣就佔用了rd很多的開發時間,何不把這些東西寫成一個自動化的腳本,然後交給qa 或是 pm來完成這個打包過程了。經過一番調研發現網上這種腳本還是很少的,不過xcode 提供了shell編譯工具 xcodebuildipa打包工具xcrun ,這就有理由讓我們利用這兩個工具寫一個自動化的打包腳本來提高我們的工作效率和自動化程度。

2ios程序包格式、渠道包格式

1) 產生多渠道的原因及多渠道帶來的打包問題:隨着iphoneipaditouch等手持設備火熱銷售,而它們上面的應用也隨之火爆了起來,而隨之而來的就是以上設備被越獄後就可以在越獄的設備上直接運行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迴歸確認比較困難、 不智能化。

自動化打包具體實現

1xcodebuild 介紹:

1

xcodebuild[-project

2

][-activetarget][-alltargets][-target]...[-parallelizeTargets][-activeconfiguration][-configuration][-sdk |][=]...[]...

3

xcodebuild[-version[-sdk |]]

4

xcodebuild[-showsdks]

5

xcodebuild[-find ][-sdk |]

6

xcodebuild[-list]

也可以在終端輸入:xcodebuild –help –h查看具體的選項
顯示xcodebuildversionxcodebuild –version
顯示當前系統安裝的sdkxcodebuild –showsdks
顯示當前目錄下project Informationxcodebuild –list
需要注意的是:執行以上命令時必須把位置定位在ios項目文件的根目錄下 否則會提示找不相關命令的。

2xcrun 介紹:

此工具主要用於將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過來的。因爲macxp的編碼是不一樣所以會有問題。

總結:

通過從母包打出其他渠道的包這種方法:得到以下好處

i.              降低了rd的工作量,一起qa的工作量。

ii.              讓測試發佈程序時的風險得到了控制。

iii.              提高了打包發佈工作效率。(幾十個包 只需短短的幾分鐘)。

iv.              提高了自動化。

v.              不依賴mac 以及xcode環境 直接在linux 下即可完成 從母包生成其它包

附錄

利用xcode環境一次生成所有包的shell 腳本代碼:

01

#!/bin/sh

02

 

03

xcodebuild clean -configuration Distribution      //clean項目

04

 

05

distDir="/Users/xxxx/dist"

06

releaseDir="build/Distribution-iphoneos"

07

version="1_0_0"

08

rm -rdf "$distDir"

09

mkdir "$distDir"

10

for line in $(cat data.dat)        //讀取所有渠道號data.dat文件

11

do

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

20

echo "sourceid.dat: "

21

cat sourceid.dat

22

rm -rdf "$releaseDir"

23

 

24

ipapath="${distDir}/${targetName}_${version}_from_${sourceid}.ipa"

25

 

26

echo "***開始build app文件***"

27

xcodebuild -target "$targetName" -configuration Distribution  -sdk iphoneos build

28

appfile="${releaseDir}/${targetName}.app"

29

if [ $sourceid == "appstore" ]

30

then

31

cd $releaseDir

32

zip -r "${targetName}_${ipafilename}_${version}.zip" "${targetName}.app"

33

mv "${targetName}_${ipafilename}.zip" $distDir 2> /dev/null

34

cd ../..

35

else

36

echo "***開始打ipa渠道包****"

37

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$appfile" -o "$ipapath" --sign "iPhone Distribution:xxxxxx"

38

fi

39

done

注:以上的data.dat文件爲存放渠道號列表的文件其格式爲:3g:1001b 即 (渠道名:渠道號) sourceid.dat 爲項目文件中存放渠道號的文件(內容只有一個渠道號)。當然了上面腳本只是說明了下如何利用xcodebuildxcrun 進行打包 以及自動打包的一個邏輯,shell腳本好的同學可以自由發揮哈。。。

ipa格式的母包生成其它渠道包的shell腳本實例:

01

#!/bin/sh

02

sourceipaname="母包名.ipa"

03

appname=”app文件名.app”  //加壓後Pauload目錄項.app文件名需要根據自己的項目修改

04

distDir="/Users/lxxx/Qa"   //打包後文件存儲目錄

05

version="1.0.0"

06

rm -rdf "$distDir "

07

mkdir "$distDir" unzip $sourceipaname     //解壓母包文件

08

for line in $(cat data.dat)   //讀取渠道號文件並進行循環

09

 do

10

ipafilename=`echo $line|cut -f1 -d':'`

11

    sourceid=`echo $line|cut -f2 -d':'`

12

    echo "ipafilename=$ipaname"

13

    echo "sourceid=$sourceid"

14

    targetName="ipa包名"

15

    echo "sourceid=$sourceid"

16

    echo "ipafilename=$ipafilename"

17

    cd Payload

18

    cd $appname

19

    echo "replace sourceid.dat before: "

20

    cat sourceid.dat

21

    echo "$sourceid" > sourceid.dat

22

    echo "replace sourceid.dat after: "

23

 cat sourceid.dat

24

 if [ $sourceid == "appstroe" ]

25

then

26

 cd ..

27

zip -r "${targetName}_${version}_from_${sourceid}.zip" $appname //appstore二進制文件

28

 

29

    mv "${targetName}_${version}_from_${sourceid}.zip" $distDir

30

    cd ..

31

    else

32

    cd ../..

33

    zip -r "${targetName}_${version}_from_${sourceid}.ipa" Payload   //打成其他渠道的包

34

mv "${targetName}_${version}_from_${sourceid}.ipa" $distDir

35

    fi

36

 done rm -rdf Payload

注:以上data.dat也是用來存儲所有渠道號的,sourceipaname就是通過qa驗證的母包,appnameipa包加壓後Payload 目錄下的app文件名並且以上所有文件必須與腳本文件保持在同一目錄下以及在mac環境中執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章