最近在做ios的自动化平台,需要通过命令行安装卸载ipa包

好了问题来,别人上传的ipa包,很可能是开发签名了只能在特定手机上安装的测试ipa包,那我们如何将其安装在我们的自动化的iphone上呢?

答案看起来显而易见,将其重新签名,但是我们是自动化平台,总不能手动签名所以需要使用mac的命令行将其重新签名

这是我第一版代码:

#!/bin/bash
echo $
cd uploadfiles
unzip $
rm -rf $
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 $ 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 $
cd uploadfiles
unzip $
rm -rf $
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[]=""
for (( i=; i<a; i++)); do
let j=i+
c=`echo $b|cut -d "@" -f$j`
echo "$c"
d=`echo $c|grep -o '/'| wc -l`
echo $d
if [ $i -eq ];then
num[]=$d
txt[]=$c
num[]=
txt[]=""
echo "num0="${num[]}
else let e=
let l=
for (( l=; 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=;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 $ Payload
rm -rf t_entitlements_full.plist
rm -rf entitlements.plist rm -rf Payload
cd ..

mac命令行对复杂ipa包重新签名的更多相关文章

  1. MAC使用命令行打包出ipa包-通过xcodeproj

    参考 : https://www.jianshu.com/p/32af2f71b4e5--老了,里面的一些命令现在都没有了,但可以借鉴思路 https://www.jianshu.com/p/004c ...

  2. 命令行下打WAR包

    命令行下打WAR包: jar -cvf TestMem.war *

  3. 利用命令行引用外部jar包以使程序正常执行的4种方法

    声明:本博客为原创博客.未经同意.不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/30976069 平时写一些小的Java Demo ...

  4. mac命令行配置网络

    mac命令行配置网络今天终于找到了Mac OS X通过命令行修改ip的方式了,记录如下: 修改mac地址,重启后失效sudo ifconfig en0 lladdr d0:67:e5:2e:07:f1 ...

  5. Mac命令行

    参考:http://www.cnblogs.com/-ios/p/4949923.html 必读 涵盖范围: 这篇文章对刚接触命令行的新手以及具有命令行使用经验的人都有用处.本文致力于做到覆盖面广(尽 ...

  6. xcodebuild命令行打包发布ipa

    配置好证书,然后在命令行转到项目目录 1.清除 EthantekiiMac:CTest ethan$ xcodebuild clean 2.编译 EthantekiiMac:CTest ethan$ ...

  7. 命令行创建Android应用,生成签名,对APK包签名并编译运行

    一.命令行创建Android应用 android create project -n HelloWorld -t android-22 -p HelloWorld1 -k org.crazyit.he ...

  8. Appium Mac 命令行安装

    试过很多方法都失败,打算用命令行方式安装. 准备工作: 从 https://github.com/appium/appium下载appium版本的源码(.tar) 详见github_Appium1.6 ...

  9. mac 命令行安装软件

    第一步需要在mac上安装brew工具 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mas ...

随机推荐

  1. js学习之函数

    1/.js中函数就是对象. 2/以表达式方式定义的函数一般不要函数名以使代码紧凑. 3/js中函数声明的方式会被默认提到外部脚本或最前面,所以在其定义前的代码也可调用. 然而以表达式方式的则不行. 4 ...

  2. POJ 1696 Space Ant

    极角排序 每次选择一个最外围的没选过的点,选择的时候需要利用极角排序进行选择 #include<cstdio> #include<cstring> #include<ve ...

  3. Xcode模拟网络状态

    http://www.it165.net/pro/html/201508/50571.html

  4. EM 期望最大化算法

    (EM算法)The EM Algorithm EM是我一直想深入学习的算法之一,第一次听说是在NLP课中的HMM那一节,为了解决HMM的参数估计问题,使用了EM算法.在之后的MT中的词对齐中也用到了. ...

  5. 一、Hbase的安装

    一.Hbase配置 这个是我从网上找的一个版本,网上说配置成功. 先决条件: (1)hadoop的版本与hbase的版本要对应,主要是hadoop目录下的hadoop-core-1.0.4.jar的版 ...

  6. Android studio中添加外部的jar包

    1.下载相关的jar包, 2,将jar包复制到当前module的lib中 3.选择新添加的jar包.右键.add as library 就好啦

  7. linux命令学习5-pssh命令

    pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...

  8. 微信小程序之----组件

    1.view 把文档分割为独立的.不同的部分. view组件类似于html中的div标签,默认为块级元素,独占一行,可以通过设置display:inline-block改为行级元素. view.wxm ...

  9. cordova环境搭建

    首先,需要了解一下cordova 和 phonegap 的关系.phoneGap是原先的名字,Cordova是phoneGap被捐给apache之后 用的项目名,phoneGap的名字也被保留了. 1 ...

  10. 4、安卓数据存储——sqlite

    朋友圈里的每一个消息体里面的数据,当下拉刷新从服务器下载数据包后,存入sqlite:用户名.图片url.点赞.评论等等.上拉加载的时候,从数据库里取出最近的5条数据加载到朋友圈上. Android通过 ...