mac命令行对复杂ipa包从新签名

最近在作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目录,下面是个子目录,其中的内容以下:

  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 ..
相关文章
相关标签/搜索