• 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 ..
  • 相关阅读:
    【4N魔方阵】
    【2(2N+1)魔方阵 】
    【二分查找法(折半查找法)】
    【循环搜寻法(使用卫兵)】
    【合并排序法】
    【快速排序法一】
    【快速排序二】
    【快速排序三】
    【数据结构】之 线性表详解
    【计算机网络基础】
  • 原文地址:https://www.cnblogs.com/thecuriousdog/p/6293650.html
Copyright © 2020-2023  润新知