oc- IOS開(kāi)發(fā):自動(dòng)化打包

摘要

隨著蘋果手持設(shè)備用戶的不斷增加,ios應(yīng)用也增長(zhǎng)迅速,同時(shí)隨著iphone被越獄越來(lái)越多的app 的渠道也不斷增多,為各個(gè)渠道打包成了一件費(fèi)時(shí)費(fèi)力的工作,本文提供一種比較智能的打包方式來(lái)減少其帶來(lái)的各種不便。

TAG

Ios打包,app打包,iphone打包,iphone自動(dòng)化打包,ios打渠道包,iphone自動(dòng)化打渠道包

自動(dòng)化打包背景介紹

1、背景

隨著ios程序發(fā)布的渠道逐漸的增多,為每個(gè)渠道打包也成為特別耗費(fèi)時(shí)間和體力的一項(xiàng)技術(shù)活了,而這一般大多數(shù)都是由rd來(lái)完成的。這樣就占用了rd很多的開(kāi)發(fā)時(shí)間,何不把這些東西寫成一個(gè)自動(dòng)化的腳本,然后交給qa 或是 pm來(lái)完成這個(gè)打包過(guò)程了。經(jīng)過(guò)一番調(diào)研發(fā)現(xiàn)網(wǎng)上這種腳本還是很少的,不過(guò)xcode 提供了shell編譯工具 xcodebuild 和 ipa打包工具xcrun ,這就有理由讓我們利用這兩個(gè)工具寫一個(gè)自動(dòng)化的打包腳本來(lái)提高我們的工作效率和自動(dòng)化程度。

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

1) 產(chǎn)生多渠道的原因及多渠道帶來(lái)的打包問(wèn)題:隨著iphone、ipad、itouch等手持設(shè)備火熱銷售,而它們上面的應(yīng)用也隨之火爆了起來(lái),而隨之而來(lái)的就是以上設(shè)備被越獄后就可以在越獄的設(shè)備上直接運(yùn)行ipa程序包 而不用通過(guò)appstore去下載,這樣一來(lái)國(guó)內(nèi)就產(chǎn)生了眾多的專門為越獄手機(jī)而開(kāi)設(shè)的渠道提供ipa程序包的下載。隨著越來(lái)越多的渠道,推廣時(shí)為各個(gè)渠道打包就成了一項(xiàng)比較耗費(fèi)時(shí)間和精力的技術(shù)活了,因此我們必須尋找一種自動(dòng)化的方式 讓打包變得高效簡(jiǎn)單。

2) Ios程序包分為appstore二進(jìn)制文件跟渠道包兩種格式

appstore二進(jìn)制文件:通過(guò)xcode工具可以生成一個(gè).app格式的二進(jìn)制文件。

渠道包:格式為.ipa格式,在沒(méi)有自動(dòng)化打包工具之前都是利用xcode來(lái)生成相應(yīng)的渠道包,而且每次只能生成一個(gè)渠道包,每次打包之前都得手動(dòng)該渠道ID,帶來(lái)的問(wèn)題就是耗費(fèi)時(shí)間、效率低下、容易出錯(cuò)、增加風(fēng)險(xiǎn)。

3、傳統(tǒng)的ios打包方式

利用xcode 打包

1) appstore 二進(jìn)制程序包

打開(kāi)你的項(xiàng)目,進(jìn)入“Edit Project Settings”,進(jìn)入Configuration頁(yè)面,選中Release點(diǎn)擊下面的Duplicate,復(fù)制一個(gè)新的配置項(xiàng)出來(lái),命名為Distribution。然后進(jìn)入Build頁(yè)面,頂上的Configuration下拉框選中Distribution,下面的Code Signing Identity里面的Any iPhone OS Device后面對(duì)應(yīng)的值選中你的那個(gè)Distribution的證書。然后點(diǎn)擊“Build”–> “Build” 就可以編譯程序了

編譯成功后,你就可以在相應(yīng)的build目錄下看到一個(gè).app的二進(jìn)制文件。

2) 渠道ipa包

根據(jù)以上步驟同樣配置好Distribution 證書 ,然后點(diǎn)擊 “Build”–> “Build and Archive” 就可以編譯程序了。接著打開(kāi)“Window”?”O(jiān)rganizer” 左邊欄中選擇”ARCHIVED APPLICATIONS” 然后再右側(cè)列表中選中剛才編譯的程序包 再點(diǎn)擊右側(cè)右邊頂部的”Share”按鈕 保存到磁盤即可。就會(huì)生成一個(gè).ipa的文件 即為渠道包。

注意:以上運(yùn)行設(shè)備必須選擇“Deveice“

4、傳統(tǒng)的打包帶來(lái)的問(wèn)題

耗費(fèi)時(shí)間、耗費(fèi)體力、效率低下、只能依賴RD來(lái)完成、容易出錯(cuò)、發(fā)布風(fēng)險(xiǎn)比較高、QA回歸確認(rèn)比較困難、 不智能化。

自動(dòng)化打包具體實(shí)現(xiàn)

1、xcodebuild 介紹:

1xcodebuild[-project

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

3xcodebuild[-version[-sdk |]]

4xcodebuild[-showsdks]

5xcodebuild[-find][-sdk |]

6xcodebuild[-list]

也可以在終端輸入:xcodebuild –help 或 –h查看具體的選項(xiàng)

顯示xcodebuildversion:xcodebuild –version

顯示當(dāng)前系統(tǒng)安裝的sdk:xcodebuild –showsdks

顯示當(dāng)前目錄下project Information:xcodebuild –list

需要注意的是:執(zhí)行以上命令時(shí)必須把位置定位在ios項(xiàng)目文件的根目錄下 否則會(huì)提示找不相關(guān)命令的。

2、xcrun 介紹:

此工具主要用于將app文件打包成ipa格式的程序包。(主要用于已越獄手機(jī))。

具體用法如下:

1/usr/bin/xcrun -sdk iphoneos PackageApplication –v[{TARGET}.app] -o [{TARGET}.ipa] --sign [{Iphone Distribution:xxx}] –embed [{xxx.mobileprovision}]

其中:-v 對(duì)應(yīng)的是app文件的絕對(duì)相對(duì)路徑 –o 對(duì)應(yīng)ipa文件的路徑跟文件名 –sign

對(duì)應(yīng)的是 發(fā)布證書中對(duì)應(yīng)的公司名或是個(gè)人名? –embed 對(duì)應(yīng)的是發(fā)布證書文件

注意如果對(duì)應(yīng)的Distribution 配置中已經(jīng)配置好了相關(guān)證書信息的話 –sign 和 –embed可以忽略

3、具體方案

a) 從源程序一次性打出所有渠道的ipa包 跟appstore的二進(jìn)制包

為了讓自動(dòng)化腳本執(zhí)行一次把所有的渠道包都打好,所以必須有一個(gè)配置文件用來(lái)存儲(chǔ)所有的渠道名跟渠道號(hào),而項(xiàng)目文件中也應(yīng)該有個(gè)對(duì)應(yīng)存儲(chǔ)當(dāng)前渠道號(hào)的文件,每次程序都從這個(gè)存放渠道號(hào)的文件中讀取渠道號(hào)即可,大概的思路就是利用腳本循環(huán)執(zhí)行打包過(guò)程,而每次打包前都通過(guò)腳本修改項(xiàng)目中存放渠道號(hào)的文件為當(dāng)前循環(huán)的最新渠道號(hào),讓后逐個(gè)打包。

注:具體事例見(jiàn)附錄

b) 提供一個(gè)ipa格式的母包 從母包生成其它所有的渠道包跟 appstore 包

qa的一些疑問(wèn),如何確保所有的渠道包就是他們驗(yàn)證過(guò)的那份代碼呢?

的確,以上代碼每次都是重新對(duì)程序進(jìn)行打包,可qa往往測(cè)試驗(yàn)證的只有一個(gè)包,如果個(gè)個(gè)去驗(yàn)證無(wú)意中之中又增加了qa的工作量哈!!而且風(fēng)險(xiǎn)也不可控。因此基于上面的問(wèn)題我們想出了一下辦法:qa只驗(yàn)證一個(gè)程序包(即母包)如果這個(gè)包通過(guò)驗(yàn)證 我們就通過(guò)母包去生成其它渠道的包,這樣一來(lái)qa也不用確認(rèn)那么多的渠道包了,風(fēng)險(xiǎn)也得到了有效的控制。

可能你會(huì)問(wèn):用一個(gè)包生成其他的包可行么??

原因是這樣的:因?yàn)槊總€(gè)渠道只是渠道號(hào)發(fā)生變化,而其他的內(nèi)容又不會(huì)發(fā)生變化,而我們的渠道號(hào)又是存儲(chǔ)在sourceid.dat這個(gè)文件中的,所以只要改變母包中的sourceid.dat文件的內(nèi)容即可,而ipa包又是同zip格式進(jìn)行壓縮,所以基本思路就是通過(guò)zip先對(duì)母包進(jìn)行解壓,然后改變sourceid.dat的內(nèi)容 最后再用zip進(jìn)行壓縮成相應(yīng)的渠道包即可。

Ipa包的目錄:

注:具體事例見(jiàn)附錄

一些問(wèn)題

當(dāng)有些shell命令在mac的終端中運(yùn)行不通過(guò)時(shí),請(qǐng)確保你的shell腳本是在mac環(huán)境下編寫的而不是同xp等其他環(huán)境中copy過(guò)來(lái)的。因?yàn)閙ac跟xp的編碼是不一樣所以會(huì)有問(wèn)題。

總結(jié):

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

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

ii.????????????? 讓測(cè)試發(fā)布程序時(shí)的風(fēng)險(xiǎn)得到了控制。

iii.????????????? 提高了打包發(fā)布工作效率。(幾十個(gè)包 只需短短的幾分鐘)。

iv.????????????? 提高了自動(dòng)化。

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

附錄

利用xcode環(huán)境一次生成所有包的shell 腳本代碼:

01#!/bin/sh

02

03xcodebuild clean -configuration Distribution????? //clean項(xiàng)目

04

05distDir="/Users/xxxx/dist"

06releaseDir="build/Distribution-iphoneos"

07version="1_0_0"

08rm-rdf"$distDir"

09mkdir"$distDir"

10forlinein$(catdata.dat)??????? //讀取所有渠道號(hào)data.dat文件

11do

12ipafilename=`echo$line|cut-f1 -d':'` //渠道名

13sourceid=`echo$line|cut-f2 -d':'`??? //渠道號(hào)

14echo"ipafilename=$ipaname"

15echo"sourceid=$sourceid"

16targetName="youtargename"http://項(xiàng)目名稱(xcode左邊列表中顯示的項(xiàng)目名稱)

17echo"sourceid=$sourceid"

18echo"ipafilename=$ipafilename"

19echo"$sourceid"> sourceid.dat

20echo"sourceid.dat: "

21catsourceid.dat

22rm-rdf"$releaseDir"

23

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

25

26echo"***開(kāi)始build app文件***"

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

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

29if[ $sourceid =="appstore"]

30then

31cd$releaseDir

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

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

34cd../..

35else

36echo"***開(kāi)始打ipa渠道包****"

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

38fi

39done

注:以上的data.dat文件為存放渠道號(hào)列表的文件 其格式為:3g:1001b 即 (渠道名:渠道號(hào)) sourceid.dat 為項(xiàng)目文件中存放渠道號(hào)的文件(內(nèi)容只有一個(gè)渠道號(hào))。當(dāng)然了上面腳本只是說(shuō)明了下如何利用xcodebuild 和 xcrun 進(jìn)行打包 以及自動(dòng)打包的一個(gè)邏輯,shell腳本好的同學(xué)可以自由發(fā)揮哈。。。

從ipa格式的母包生成其它渠道包的shell腳本實(shí)例:

01#!/bin/sh

02sourceipaname="母包名.ipa"

03appname=”app文件名.app”? //加壓后Pauload目錄項(xiàng).app文件名需要根據(jù)自己的項(xiàng)目修改

04distDir="/Users/lxxx/Qa"http://打包后文件存儲(chǔ)目錄

05version="1.0.0"

06rm-rdf"$distDir "

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

08forlinein$(catdata.dat)?? //讀取渠道號(hào)文件并進(jìn)行循環(huán)

09do

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

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

12echo"ipafilename=$ipaname"

13echo"sourceid=$sourceid"

14targetName="ipa包名"

15echo"sourceid=$sourceid"

16echo"ipafilename=$ipafilename"

17cdPayload

18cd$appname

19echo"replace sourceid.dat before: "

20catsourceid.dat

21echo"$sourceid"> sourceid.dat

22echo"replace sourceid.dat after: "

23catsourceid.dat

24if[ $sourceid =="appstroe"]

25then

26cd..

27zip -r"${targetName}_${version}_from_${sourceid}.zip"$appname //appstore二進(jìn)制文件

28

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

30cd..

31else

32cd../..

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

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

35fi

36donerm-rdf Payload

注:以上data.dat也是用來(lái)存儲(chǔ)所有渠道號(hào)的,sourceipaname就是通過(guò)qa驗(yàn)證的母包,appname為ipa包加壓后Payload 目錄下的app文件名并且以上所有文件必須與腳本文件保持在同一目錄下以及在mac環(huán)境中執(zhí)行。

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

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

  • 隨著蘋果手持設(shè)備用戶的不斷增加,ios應(yīng)用也增長(zhǎng)迅速,同時(shí)隨著iphone被越獄越來(lái)越多的app 的渠道也不斷增多...
    rogerwu1228閱讀 914評(píng)論 0 1
  • 起初想法: 基于公司原有的Jenkins服務(wù)的基礎(chǔ)上,最近在公司自動(dòng)化打包的時(shí),遇到一個(gè)尷尬的問(wèn)題?為什么不能直接...
    Evans_Xiao閱讀 3,935評(píng)論 0 3
  • 前言 眾所周知,現(xiàn)在App的競(jìng)爭(zhēng)已經(jīng)到了用戶體驗(yàn)為王,質(zhì)量為上的白熱化階段。用戶們都是很挑剔的。如果一個(gè)公司的推廣...
    偏偏就是禰閱讀 9,324評(píng)論 34 59
  • 本文轉(zhuǎn)自CaryaLiu's Blog。 本文最終實(shí)現(xiàn)的是使用腳本打 Ad-hoc 包,并發(fā)布測(cè)試,當(dāng)然稍微修改一...
    M_Baron閱讀 1,109評(píng)論 1 0
  • 文,冷月秋風(fēng) 那年那月 畫押一紙契約 許十里紅妝,長(zhǎng)亭柳依依 從此,左邊是你,右邊是我 一方庭院,愛(ài)的37度不溫不...
    冷月秋風(fēng)qin閱讀 396評(píng)論 0 3

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