最近在作ios的自動化平臺,須要經過命令行安裝卸載ipa包html
好了問題來,別人上傳的ipa包,極可能是開發簽名了只能在特定手機上安裝的測試ipa包,那咱們如何將其安裝在咱們的自動化的iphone上呢?ios
答案看起來顯而易見,將其從新簽名,可是咱們是自動化平臺,總不能手動簽名因此須要使用mac的命令行將其從新簽名segmentfault
這是我初版代碼:bash
#!/bin/bash echo $1 cd uploadfiles unzip $1 rm -rf $1 cd Payload a=`ls|sed 's/[ ][ ]*//g'|grep *.app` echo "a:"$a cd .. rm -rf Payload/$a/_CodeSignature cp embedded.mobileprovision Payload/$a/embedded.mobileprovision security cms -D -i embedded.mobileprovision > t_entitlements_full.plist /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' t_entitlements_full.plist >entitlements.plist /usr/bin/codesign -f -s "iPhone Developer: Wei Sang (4KC7XYF69X)" --entitlements entitlements.plist Payload/$a zip -r $1 Payload rm -rf t_entitlements_full.plist rm -rf entitlements.plist rm -rf Payload cd ..
結果發現,用這個腳本讓有些ipa包簽名了能安裝,而另外的ipa包簽名了不能安裝app
爲何?爲何?爲何?iphone
還好在網上發現一片深度好文章:https://segmentfault.com/a/1190000004144556測試
我這把重點摘抄出來:spa
iOS程序最終都會以.ipa文件導出,先來了解一下ipa文件的結構:命令行
事實上,ipa文件只是一個zip包,可使用以下命令解壓:code
/usr/bin/unzip -q xxx.ipa -d <destination>
解壓後,獲得上圖的Payload目錄,下面是個子目錄,其中的內容以下:
資源文件,例如圖片、html、等等。
_CodeSignature/CodeResources。這是一個plist文件,可用文本查看,其中的內容就是是程序包中(不包括Frameworks)全部文件的簽名。注意這裏是全部文件
。意味着你的程序一旦簽名,就不能更改其中任何的東西,包括資源文件和可執行文件自己。iOS系統會檢查這些簽名。
可執行文件。此文件跟資源文件同樣須要簽名。
一個mobileprovision文件.打包的時候使用的,從MC上生成的。
Frameworks。程序引用的非系統自帶的Frameworks,每一個Frameworks其實就是一個app,其中的結構應該和app差很少,也包含簽名信息CodeResources文件
看到重點沒有Frameworks!!!!!!這貨什麼鬼????
由於沒作過ios開發,我將其理解爲app中的app,具體是個啥,你們baidu,應該都有解釋
簽名的時候,若是存在Frameworks
子目錄,則對.app文件夾下的全部Frameworks進行簽名…………劃重點這題必考
好了我將子目錄下的embedded.mobileprovision跟新了,也從新生成了簽名文件_CodeSignature
而後我一安裝,我去,竟然又失敗
什麼鬼!!!!!!!
而後我苦思冥想,總算猜到一個可能性必須從內層Frameworks開始簽名,爲何呢?由於內層簽名文件的時候,會使其文件夾產生變化。
若是從外往裏籤,外面先簽,簽到裏面的時候,這個Frameworks文件夾變化了,外面的簽名就做廢了…………這也是重點
最後的代碼:
#!/bin/bash echo $1 cd uploadfiles unzip $1 rm -rf $1 find Payload -name _CodeSignature -exec rm -rf {} \; find Payload -name embedded.mobileprovision -exec cp embedded.mobileprovision {} \; security cms -D -i embedded.mobileprovision > t_entitlements_full.plist /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' t_entitlements_full.plist >entitlements.plist a=`find Payload -name embedded.mobileprovision|wc -l` b=`find Payload -name embedded.mobileprovision|sed 's/\/embedded.mobileprovision/\@/g'` echo $b txt[0]="" for (( i=0; i<a; i++)); do let j=i+1 c=`echo $b|cut -d "@" -f$j` echo "$c" d=`echo $c|grep -o '/'| wc -l` echo $d if [ $i -eq 0 ];then num[0]=$d txt[0]=$c num[1]=0 txt[1]="" echo "num0="${num[0]} else let e=0 let l=0 for (( l=0; l<=i; l++)); do if [ ${num[$l]} -gt $d ];then echo "continue" else e=${num[$l]} etxt=${txt[$l]} num[$l]=$d txt[$l]=$c d=$e c=$etxt fi done num[$l]=$d fi echo "XXXXXXXXXXXXXXXXXXXXXXXXXX" for var in ${num[*]} do echo $var; done echo "XXXXXXXXXXXXXXXXXXXXXXXXXX" done for ((o=0;o<a;o++));do txt[o]=`echo ${txt[o]}|sed 's/ Payload/Payload/'` echo ${txt[o]}; /usr/bin/codesign -f -s "iPhone Developer: Wei Sang (4KC7XYF69X)" --entitlements entitlements.plist "${txt[o]}" done #/usr/bin/codesign -f -s "iPhone Developer: Wei Sang (4KC7XYF69X)" --entitlements entitlements.plist Payload/$aa zip -r $1 Payload rm -rf t_entitlements_full.plist rm -rf entitlements.plist rm -rf Payload cd ..