设为首页 收藏本站
查看: 1609|回复: 0

[经验分享] mac命令行对复杂ipa包重新签名

[复制链接]

尚未签到

发表于 2017-7-6 14:40:14 | 显示全部楼层 |阅读模式
  最近在做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包签名了不能安装
DSC0000.jpg

  为什么?为什么?为什么?
  还好在网上发现一片深度好文章:https://segmentfault.com/a/1190000004144556
  我这把重点摘抄出来:
  iOS程序最终都会以.ipa文件导出,先来了解一下ipa文件的结构:

  事实上,ipa文件只是一个zip包,可以使用如下命令解压:

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

  解压后,得到上图的Payload目录,下面是个子目录,其中的内容如下:


  •   资源文件,例如图片、html、等等。

  •   _CodeSignature/CodeResources。这是一个plist文件,可用文本查看,其中的内容就是是程序包中(不包括Frameworks)所有文件的签名。注意这里是所有文件。意味着你的程序一旦签名,就不能更改其中任何的东西,包括资源文件和可执行文件本身。iOS系统会检查这些签名。

  •   可执行文件。此文件跟资源文件一样需要签名。

  •   一个mobileprovision文件.打包的时候使用的,从MC上生成的。

  •   Frameworks。程序引用的非系统自带的Frameworks,每个Frameworks其实就是一个app,其中的结构应该和app差不多,也包含签名信息CodeResources文件

  看到重点没有 DSC0001.jpg Frameworks!!!!!!这货什么鬼????
  因为没做过ios开发,我将其理解为app中的app,具体是个啥,大家baidu,应该都有解释
  签名的时候,如果存在Frameworks子目录,则对.app文件夹下的所有Frameworks进行签名…………划重点这题必考 DSC0002.jpg

  好了我将子目录下的embedded.mobileprovision跟新了,也重新生成了签名文件_CodeSignature
  然后我一安装,我去,居然又失败
   DSC0003.jpg
  什么鬼!!!!!!!
  然后我苦思冥想,总算猜到一个可能性必须从内层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 ..

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-391035-1-1.html 上篇帖子: Mac安装V8Js 下篇帖子: Myeclipse for Mac快捷键
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表