利用腳本打包iOS應用

隨著蘋果手持設備用戶的不斷增加粘姜,ios應用也增長迅速,同時隨著iphone被越獄越來越多的app 的渠道也不斷增多澡匪,為各個渠道打包成了一件費時費力的工作蒂秘,本文提供一種比較智能的打包方式來減少其帶來的各種不便。

自動化打包背景介紹
1染突、背景
隨著ios程序發(fā)布的渠道逐漸的增多捻爷,為每個渠道打包也成為特別耗費時間和體力的一項技術活了,而這一般大多數(shù)都是由rd來完成的份企。這樣就占用了 rd很多的開發(fā)時間也榄,何不把這些東西寫成一個自動化的腳本,然后交給qa 或是 pm來完成這個打包過程了司志。經過一番調研發(fā)現(xiàn)網(wǎng)上這種腳本還是很少的手蝎,不過xcode 提供了shell編譯工具 xcodebuild 和 ipa打包工具xcrun 榕莺,這就有理由讓我們利用這兩個工具寫一個自動化的打包腳本來提高我們的工作效率和自動化程度。

2棵介、ios程序包格式钉鸯、渠道包格式

  1. 產生多渠道的原因及多渠道帶來的打包問題:隨著iphone、ipad邮辽、itouch等手持設備火熱銷售唠雕,而它們上面的應用也隨之火爆了起來,而隨之而來的就是以上設備被越獄后就可以在越獄的設備上直接運行ipa程序包 而不用通過appstore去下載吨述,這樣一來國內就產生了眾多的專門為越獄手機而開設的渠道提供ipa程序包的下載岩睁。隨著越來越多的渠道,推廣時為各個渠道打包就成了一項比較耗費時間和精力的技術活了揣云,因此我們必須尋找一種自動化的方式 讓打包變得高效簡單捕儒。
  2. Ios程序包分為appstore二進制文件跟渠道包兩種格式
    appstore二進制文件:通過xcode工具可以生成一個.app格式的二進制文件。
    渠道包:格式為.ipa格式邓夕,在沒有自動化打包工具之前都是利用xcode來生成相應的渠道包刘莹,而且每次只能生成一個渠道包,每次打包之前都得手動該渠道ID焚刚,帶來的問題就是耗費時間点弯、效率低下、容易出錯矿咕、增加風險抢肛。

3、傳統(tǒng)的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包
    根據(jù)以上步驟同樣配置好Distribution 證書 ,然后點擊 “Build”–> “Build and Archive” 就可以編譯程序了慈缔。接著打開“Window”?”O(jiān)rganizer” 左邊欄中選擇”ARCHIVED APPLICATIONS” 然后再右側列表中選中剛才編譯的程序包 再點擊右側右邊頂部的”Share”按鈕 保存到磁盤即可叮称。就會生成一個.ipa的文件 即為渠道包。
    注意:以上運行設備必須選擇“Deveice“

4、傳統(tǒng)的打包帶來的問題
耗費時間瓤檐、耗費體力赂韵、效率低下、只能依賴RD來完成挠蛉、容易出錯祭示、發(fā)布風險比較高、QA回歸確認比較困難谴古、 不智能化质涛。

自動化打包具體實現(xiàn)
Java代碼 收藏代碼
C/C++ Code復制內容到剪貼板
xcodebuild[-project][-activetarget][-alltargets][-target]...[-parallelizeTargets][-activeconfiguration][-configuration][-sdk |][=]...[]...
xcodebuild[-version[-sdk |]]
xcodebuild[-showsdks]
xcodebuild[-find ][-sdk |]
xcodebuild[-list]

1、xcodebuild 介紹:
也可以在終端輸入:xcodebuild –help 或 –h查看具體的選項
顯示xcodebuildversion:xcodebuild –version
顯示當前系統(tǒng)安裝的sdk:xcodebuild –showsdks
顯示當前目錄下project Information:xcodebuild –list
需要注意的是:執(zhí)行以上命令時必須把位置定位在ios項目文件的根目錄下 否則會提示找不相關命令的掰担。

2汇陆、xcrun 介紹:
此工具主要用于將app文件打包成ipa格式的程序包。(主要用于已越獄手機)带饱。
具體用法如下:

其中:-v 對應的是app文件的絕對相對路徑 –o 對應ipa文件的路徑跟文件名 –sign
對應的是 發(fā)布證書中對應的公司名或是個人名 –embed 對應的是發(fā)布證書文件
注意如果對應的Distribution 配置中已經配置好了相關證書信息的話 –sign 和 –embed可以忽略

3毡代、具體方案
a) 從源程序一次性打出所有渠道的ipa包 跟appstore的二進制包
為了讓自動化腳本執(zhí)行一次把所有的渠道包都打好,所以必須有一個配置文件用來存儲所有的渠道名跟渠道號勺疼,而項目文件中也應該有個對應存儲當前渠道號的文件教寂,每次程序都從這個存放渠道號的文件中讀取渠道號即可,大概的思路就是利用腳本循環(huán)執(zhí)行打包過程恢口,而每次打包前都通過腳本修改項目中存放渠道號的文件為當前循環(huán)的最新渠道號孝宗,讓后逐個打包穷躁。
注:具體事例見附錄
b) 提供一個ipa格式的母包 從母包生成其它所有的渠道包跟 appstore 包
qa的一些疑問耕肩,如何確保所有的渠道包就是他們驗證過的那份代碼呢?
的確问潭,以上代碼每次都是重新對程序進行打包猿诸,可qa往往測試驗證的只有一個包,如果個個去驗證無意中之中又增加了qa的工作量哈=泼Α梳虽!而且風險也不可控。因此基于上面的問題我們想出了一下辦法:qa只驗證一個程序包(即母包)如果這個包通過驗證 我們就通過母包去生成其它渠道的包灾茁,這樣一來qa也不用確認那么多的渠道包了窜觉,風險也得到了有效的控制。
可能你會問:用一個包生成其他的包可行么北专?禀挫?
原因是這樣的:因為每個渠道只是渠道號發(fā)生變化,而其他的內容又不會發(fā)生變化拓颓,而我們的渠道號又是存儲在sourceid.dat這個文件中的语婴,所以只要改變母包中的sourceid.dat文件的內容即可,而ipa包又是同zip格式進行壓縮,所以基本思路就是通過zip先對母包進行解壓砰左,然后改變sourceid.dat的內容 最后再用zip進行壓縮成相應的渠道包即可匿醒。
Ipa包的目錄:
注:具體事例見附錄

一些問題
當有些shell命令在mac的終端中運行不通過時,請確保你的shell腳本是在mac環(huán)境下編寫的而不是同xp等其他環(huán)境中copy過來的缠导。因為mac跟xp的編碼是不一樣所以會有問題廉羔。

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

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

ii. 讓測試發(fā)布程序時的風險得到了控制蜜另。

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

iv. 提高了自動化举瑰。

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

附錄
利用xcode環(huán)境一次生成所有包的shell 腳本代碼:
C/C++ Code復制內容到剪貼板
Java代碼 收藏代碼

!/bin/sh

xcodebuild clean -configuration Distribution //clean項目

distDir="/Users/xxxx/dist"
releaseDir="build/Distribution-iphoneos"
version="1_0_0"
rm -rdf "$distDir"
mkdir "$distDir"
for line in $(cat data.dat) //讀取所有渠道號data.dat文件
do
ipafilename=echo $line|cut -f1 -d':' //渠道名
sourceid=echo $line|cut -f2 -d':' //渠道號
echo "ipafilename=$ipaname"
echo "sourceid=$sourceid"
targetName="youtargename" //項目名稱(xcode左邊列表中顯示的項目名稱)
echo "sourceid=$sourceid"
echo "ipafilename=$ipafilename"
echo "$sourceid" > sourceid.dat
echo "sourceid.dat: "
cat sourceid.dat
rm -rdf "$releaseDir"

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

echo "開始build app文件"
xcodebuild -target "$targetName" -configuration Distribution -sdk iphoneos build
appfile="${releaseDir}/${targetName}.app"
if [ $sourceid == "appstore" ]
then
cd $releaseDir
zip -r "${targetName}${ipafilename}${version}.zip" "${targetName}.app"
mv "${targetName}_${ipafilename}.zip" $distDir 2> /dev/null
cd ../..
else
echo "***開始打ipa渠道包****"
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$appfile" -o "$ipapath" --sign "iPhone Distribution:xxxxxx"
fi
done

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

從ipa格式的母包生成其它渠道包的shell腳本實例:
復制內容到剪貼板
Java代碼 收藏代碼

!/bin/sh

sourceipaname="母包名.ipa"
appname=”app文件名.app” //加壓后Pauload目錄項.app文件名需要根據(jù)自己的項目修改
distDir="/Users/lxxx/Qa" //打包后文件存儲目錄
version="1.0.0"
rm -rdf "$distDir "
mkdir "$distDir" unzip $sourceipaname //解壓母包文件
for line in $(cat data.dat) //讀取渠道號文件并進行循環(huán)
do
ipafilename=echo $line|cut -f1 -d':'
sourceid=echo $line|cut -f2 -d':'
echo "ipafilename=$ipaname"
echo "sourceid=$sourceid"
targetName="ipa包名"
echo "sourceid=$sourceid"
echo "ipafilename=$ipafilename"
cd Payload
cd $appname
echo "replace sourceid.dat before: "
cat sourceid.dat
echo "$sourceid" > sourceid.dat
echo "replace sourceid.dat after: "
cat sourceid.dat
if [ $sourceid == "appstroe" ]
then
cd ..
zip -r "${targetName}_${version}from${sourceid}.zip" $appname //appstore二進制文件

mv "${targetName}${version}from${sourceid}.zip" $distDir
cd ..
else
cd ../..
zip -r "${targetName}
${version}from${sourceid}.ipa" Payload //打成其他渠道的包
mv "${targetName}_${version}from${sourceid}.ipa" $distDir
fi
done rm -rdf Payload

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

擴展閱讀:http://www.cnblogs.com/qq78292959/archive/2011/06/10/2077323.html

原文:http://stblog.baidu-tech.com/?p=1295

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末坎怪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子廓握,更是在濱河造成了極大的恐慌搅窿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隙券,死亡現(xiàn)場離奇詭異男应,居然都是意外死亡,警方通過查閱死者的電腦和手機娱仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門沐飘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牲迫,“玉大人,你說我怎么就攤上這事盹憎。” “怎么了脚乡?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵蜒滩,是天一觀的道長滨达。 經常有香客問我俯艰,道長捡遍,這世上最難降的妖魔是什么竹握? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任画株,我火速辦了婚禮,結果婚禮上啦辐,老公的妹妹穿的比我還像新娘谓传。我一直安慰自己芹关,他們只是感情好续挟,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布诗祸。 她就那樣靜靜地躺著,像睡著了一般直颅。 火紅的嫁衣襯著肌膚如雪怀樟。 梳的紋絲不亂的頭發(fā)上功偿,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天往堡,我揣著相機與錄音,去河邊找鬼养葵。 笑死征堪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的庸娱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼熟尉,長吁一口氣:“原來是場噩夢啊……” “哼洲脂!你這毒婦竟也來了剧包?” 一聲冷哼從身側響起往果,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陕贮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肮之,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年眶明,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赘来。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡凯傲,死狀恐怖犬辰,靈堂內的尸體忽然破棺而出冰单,到底是詐尸還是另有隱情,我是刑警寧澤诫欠,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站轿偎,受9級特大地震影響,放射性物質發(fā)生泄漏坏晦。R本人自食惡果不足惜嫁乘,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜓斧。 院中可真熱鬧,春花似錦挎春、人聲如沸豆拨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽相味。三九已至,卻和暖如春丰涉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背一死。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工投慈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留承耿,地道東北人伪煤。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像职烧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚀之,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容