mac命令行對復雜ipa包重新簽名


最近在做ios的自動化平台,需要通過命令行安裝卸載ipa包

好了問題來,別人上傳的ipa包,很可能是開發簽名了只能在特定手機上安裝的測試ipa包,那我們如何將其安裝在我們的自動化的iphone上呢?

答案看起來顯而易見,將其重新簽名,但是我們是自動化平台,總不能手動簽名所以需要使用mac的命令行將其重新簽名

這是我第一版代碼:

#!/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包簽名了不能安裝

為什么?為什么?為什么?

還好在網上發現一片深度好文章:https://segmentfault.com/a/1190000004144556

我這把重點摘抄出來:

iOS程序最終都會以.ipa文件導出,先來了解一下ipa文件的結構:

事實上,ipa文件只是一個zip包,可以使用如下命令解壓:

/usr/bin/unzip -q xxx.ipa -d <destination> 

解壓后,得到上圖的Payload目錄,下面是個子目錄,其中的內容如下:

  1. 資源文件,例如圖片、html、等等。

  2. _CodeSignature/CodeResources。這是一個plist文件,可用文本查看,其中的內容就是是程序包中(不包括Frameworks)所有文件的簽名。注意這里是所有文件。意味着你的程序一旦簽名,就不能更改其中任何的東西,包括資源文件和可執行文件本身。iOS系統會檢查這些簽名。

  3. 可執行文件。此文件跟資源文件一樣需要簽名。

  4. 一個mobileprovision文件.打包的時候使用的,從MC上生成的。

  5. 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 ..

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM