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.