iOS-shell腳本自動化打包

1:背景

同一套代碼,需要修改app啟動圖,圖標等資源文件,app名稱,版本號,bundleID等相應的配置,從而來生成不同的app.如果手動去修改的話,費時費力不說,有時候還有可能會漏改,改錯的情況.所以這里來介紹使用shell腳本工具,去生成不同配置的app工程.

了解需求之后,可以把需要修改的配置項分為三類.

分別是1:icon資源文件替換 2:plist文件中字段修改.

2:以下是介紹滿足以上需要的shell腳本

Shell腳本介紹:

Shell腳本并不能作為正式的編程語言,因為它是在linux的shell中運行的,所以成為shell腳本.

shell是一種腳本語言,可以使用邏輯判斷,循環等語法,可以自定義函數.shell是系統命令的

集合,shell腳本可以實現自動化化運維,能大大增加我們的運維效率.

操作步驟

首先需要創建shell腳本文件,在終端中輸入touch cp_20.sh,直接創建shell腳本文件(cp_20.sh名字可以自己根據實際來命名)

運行腳本時:首先將命令行切換到腳本文件所在的路徑,回車之后,賦予腳本可執行

權限,需要輸入:chmod +x cp_20.sh,然后輸入sh cp_20.sh就可以直接運行腳本了.

Shell腳本開頭需要加#!/bin/sh

以#開頭的行作為解釋說明,腳本以.sh結尾,用于區分這是一個shell腳本

在每個腳本的開頭都使用”#!”,這意味著告訴你的系統這個文件的執行需要指定一個

解釋器.“#!”實際上是一個2 字節的魔法數字,這是指定一個文件類型的特殊標記, 換句

話說, 在這種情況下,指的就是一個可執行的腳本(鍵入man magic 來獲得關于這個迷人話題的

更多詳細信息).在#!之后接著是一個路徑名.這個路徑名指定了一個解釋腳本中命令的程序,這

個程序可以是 shell,程序語言或者是任意一個通用程序.這個指定的程序從頭開始解釋并且執

行腳本中的命令(從#!行下邊的一行開始),忽略注釋上邊每一個腳本頭的行都指定了一個不同

的命令解釋器,如果是/bin/sh,那么就是默認shell(在Linux 系統中默認是bash.當然”#!”也可以被

忽略,不過這樣你的腳本文件就只能是一些命令的集合,不能夠使用shell 內建的指令了,如果不

能使用變量的話,當然這也就失去了腳本編程的意義了.


腳本說明

appInfosLength=${#appBundleInfos[*]}

獲取數組個數其他寫法 =${#appBundleInfos[@]}

bedinTime=`date +%s` 記錄開始時間,結尾有結束時間,用來計時打出來一個包需要多長時間

mkdir ${ipaPath}/allChannelIpa創建打包目錄 還可以加雙引號寫:mkdir “${ipaPath}/allChannelIpa”

改路徑的意思是在打包素材文件中再創建一個allChannelIpa文件來裝打好的ipa包

allIPAPackPath="${ipaPath}/allChannelIpa”聲明allIPAPackPath方便一下直接獲取ipa路徑

xcodebuild archive -workspace ${projectDir}/${schemeName}.xcworkspace-scheme ${schemeName} -configuration Release -sdkiphoneosclean?-archivePath ${allIPAPackPath}/${schemeName}.xcarchive? Build生成APP

-workspace 項目路徑下面的.xcworkspace

–scheme 項目名稱

-configuration ?配置打包的環境Release或者debug

-archivePath archive 的路徑

if [[$? = 0 ]]; then ([[$? = 0]] 等同于[”$?” != “0”] )

echo "\033[31m 編譯成功\n \033[0m"

else echo "\033[31m

編譯失敗\n \033[0m"

fi???利用if語句判斷build是否成功,成功的話就輸出編譯成功 echo輸出打印

echo

"\033[31m 編譯成功\n

\033[0m"

30--37前景色

40-----47 背景色

\033[0m恢復默認顏色屬性

\033[45;36m設置背景為45前景為36

"\033[y;xH \033[10;25h" 把光標置于10行25列處

\033[K 清除光標行的內容

\033[u 恢復光標位

\033[s 保存當前光標位

//所有顏色和修飾符https://misc.flogisoft.com/bash/tip_colors_and_formatting

//與文件存在與否的判斷-e是否存在

#

----全部打包----開始使用for遍歷數組

for((i=0;i<appInfosLength;i++)); do

Bundle Name (CFBundleName)

appName=${appNameInfos[${i}]}

appDisplayName=${appNameInfos[${i}]}

appIconName=${appIconInfos[${i}]}

appBundleId=${appBundleInfos[${i}]}

mkdir $allIPAPackPath/${appName}創建不同app

ipa目錄(可創建可不創建)

Applications_Path=${allIPAPackPath}/${schemeName}.xcarchive/Products/Applications #將對應的 icon

復制到需要修改的 app的目錄下.xcarchive 文件下對應的Applications文件路徑

rm -rf $Applications_Path/${projectName}.app/icon.png

#先刪除項目中原有的icon,不然直接copy的話,會有icon重用的現象

cp -Rf $iconPath/${appIconName}/icon.png $Applications_Path/${projectName}.app/icon.png

#使用mac自帶的plistbuddy修改plist文件

plist_path=$Applications_Path/${schemeName}.app/info.plist

/usr/libexec/PlistBuddy-c "Set :CFBundleName? $appName"

$plist_path

/usr/libexec/PlistBuddy-c "Set :CFBundleDisplayName? $appDisplayName" $plist_path

/usr/libexec/PlistBuddy-c "Set :CFBundleIdentifier? $appBundleId"

$plist_path

/usr/libexec/PlistBuddy

-c "set CFBundleURLTypes:0:CFBundleURLSchemes:0 ch$appBundleId" ${plist_path}

Mac自帶的一個操作plist文件的工具

路徑:/usr/libexec/PlistBuddy

使用: /usr/libexec/PlistBuddy -c "Set key value" plistUrl

# 生成 ipa

xcodebuild -exportArchive -exportOptionsPlist "$allIPAPackPath/ExportOptions.plist”

?-archivePath ${allIPAPackPath}/${schemeName}.xcarchive

?-exportPath $allIPAPackPath/${appName}/$appBundleId

#移動位置重命名

mv /$allIPAPackPath/${appName}/$appBundleId/Rainbow.ipa /$allIPAPackPath/${appName}/$appBundleId.ipa

# 每打出來一個ipa包都得重簽名,不然app安裝不上 這里使用heyu證書

codesign -f -s "Apple Development: xxxx"? --entitlements"$allIPAPackPath/ExportOptions.plist" $allIPAPackPath/${appName}/$appBundleId.ipa

# 清除無關文件

rm -r $allIPAPackPath/${appName}/$appBundleId

# 結束時間

endTime=`date +%s`

echo

-e "打包時間$[endTime - beginTime ]秒"

輸出打包時間,從而可以更明顯的看出打一個包需要多長時間

done 結束打包進程

知識延伸

1 :

-f是否為普通文件

-d 是否為目錄

-s 是否為非空的文件

-p 是否為管道文件

-b 是否為塊設備文件

-c 是否為字符設備文件

2: 條件分支分三種條件:單分支,雙分支,多分支

單分支:

if[];then

echo

'aa'

fi

雙分支:

if[];then

echo

'aa'

else

echo

'bb'

多分支:

if[];then

echo

'aa'

elif

echo

'bb'

elif

echo

'cc'

fi

3:

$var 引用var變量的值

${var} 引用var變量的值

${var%a*} 引用var變量的值并且截取a左邊的字符串顯示,如果字符串有多個a,則按從左向右最后一個a截取

${var%%a*} 引用var變量的值并且截取a左邊的字符串顯示,如果字符串有多個a,則按從左向右第一個a截取

${var#*a} 引用var變量的值并且截取a右邊的字符串顯示,如果字符串有多個a,則按從左向右第一個a截取

${var##*a} 引用var變量的值并且截取a右邊的字符串顯示,如果字符串有多個a,則按從左向右最后一個a截取

${var:3} 引用var變量的值并且從第3個字符開始截取

${var:3:6} 引用var變量的值并且從第3個字符開始截取,截取6個字符顯示

${#var} 返回var變量值的長度

${var/a/b} 替換變量值的字符串,這里是把var變量值里的a換成b,如果有多個a也只能換一次

${var//a/b} 替換變量值的字符串,這里把var變量值里的a全換成b

4: 循環語句:

分為三種:while do循環,until do循環,for循環

while do循環i=10

while

[ $i

-eq

5 ];do

echo

$i;

((i--));

[ $i

-eq

5 ]可以換成(($i==5))這樣寫

until do循環:知道xx才執行

i=10

until (($a<0));do

echo $i;

((i--));

done;

for循環

for((i=1;i<=10;i++));do

echo $i

done;

5: PlistBuddy的幾個關鍵點:

如何定義嵌套的鍵: 每個鍵之間使用":"符號分隔

如果鍵值的名稱包含空格等特殊字符的時候,如同命令行的轉義字符一樣,使用"/"來轉義,比如:

":Software:Gallery:Online/ Marketplace".

PlistBuddy如果不使用"-c"參數,則進入人機交互模式, "-c"的意思就是執行它后面的命令列表,而命令如果有參數,需要把它們包含在引號中。

需要注意的是scheme的修改:scheme

的數據結構為 數組元素可能是字典,字典key對應的value可能是數組,因此需要事先知道要修改的值的數據結構和位置,在使用plist工具時指定字典對應的key /usr/libexec/PlistBuddy

-c "set CFBundleURLTypes:0:CFBundleURLSchemes:0 ch$appBundleId" ${plist_path}

該意思是取?CFBundleURLTypes?數組下的第一個元素 X,再取

X 下?CFBundleURLSchemes?數組下的第一個元素 Y,并更新Y的值為chappBundleId.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379