ipa重签名

文章写于2016/07/13 19:34,搬家到思否。

将一个ipa文件解压后,显示包内容,可以看到app文件目录下包含了这2个文件:_CodeSignature(ipa的签署文件)和embedded.mobileprovision(证书配置文件),另外还有一个自己配置的entitlements.plist授权文件,它们就是重签名的关键。

为了方便描述,先定义一些文件名(请根据自己的情况修改):

假设你的证书名为 myInhouse. mobileprovision

假设你的inhouse签署名为 iPhone Distribution: ABCD technology co., LTD.

假设你的ipa包名为 efg.ipa

一、查看证书信息、配置权限

首先,查看myInhouse. mobileprovision的信息,在终端输入命令:

security cms -D -i myInhouse.mobileprovision

执行后输出信息中的内容,得到一个 XML 格式信息,找到Entitlements字段;

然后,创建一个 entitlements.plist 文件,按照上图中Entitlements的信息配置,如下图:

二、编写resign.sh脚本

编写脚本,命名为 resign.sh

#!/bin/sh

if ! ([ -f "$1" ]); then
echo ----- \"${1}\"文件不存在
exit
fi
ipaName=${1%.ipa}
if [ "$ipaName" = "$1" ]; then
echo ----- \"${1}\"error 不是ipa文件
exit
fi

## step 1 解压ipa
unzip ${ipaName}.ipa

## step 2 删除旧签名文件 
rm -rf Payload/*.app/_CodeSignature/

## step 3 拷贝证书配置和权限文件
cp myInhouse.mobileprovision Payload/*.app/embedded.mobileprovision
cp entitlements.plist Payload/*.app/

## step 4 重签名
(
/usr/bin/codesign -f -s "iPhone Distribution: ABCD technology co., LTD." --entitlements Payload/*.app/entitlements.plist Payload/*.app/
) || { 
rm -rf Payload/ 
rm -rf __MACOSX/
exit 
}

## step 5 打包
zip -r ${ipaName}_resign.ipa Payload/
rm -rf Payload/
rm -rf __MACOSX/

三、签名

脚本写完后,将 entitlements.plist 、myInhouse.mobileprovision 、resign.sh 、efg.ipa 放到同一目录ipaResign下,

然后打开终端,cd至ipaResig目录,再执行如下命令运行脚本:

sh resign.sh efg.ipa

稍稍等候,efg_resign.ipa 就OK啦。

安装完efg_resign.ipa不要忘记信任企业证书,不然进不了应用。

上述工作完成后,如果以后还有需要用同一个证书重签名的,直接将ipa丢到ipaResign,运行脚本就可以了,是不是很方便 😊。

--2016-8-10--补-充--------------我---是---分---割---线----------------

补充一下签名成development和distribution的不同之处。

四、重签成development

虽然很少有需求要这么做,但是最近碰到一个朋友就遇到了。(我能说什么呢..... -.-!)

首先,需要知道应用的唯一标识(application-identifier)是:证书ID+Bundle Identifier;

证书ID可以在钥匙串中看到,如图,图里括号中的7N2275G95N就是证书ID。

签成development的时候,上面脚本中 step 4 的签署名要与钥匙串中的对应,包括括号和证书ID,所以脚本中第4步应该改成:

## step 4 
(
/usr/bin/codesign -f -s "iPhone Developer: developerName (7N2275G95N)" --entitlements Payload/*.app/entitlements.plist Payload/*.app/
) || { 
rm -rf Payload/ 
rm -rf __MACOSX/
exit 
}

这里要特别注意:第4步写developer的证书ID,但是在授权文件 entitlements.plist 中,前缀不能是developer的,而应该与mobileprovision文件中的证书ID一致(查看mobileprovision文件信息参考第一步)。

其余参考第二步。

五、签成distribution

参考第四步,唯一的不同是脚本 step 4 中的签署名要改成发布的签署,证书ID也需要对应。

47 声望
4 粉丝
0 条评论
推荐阅读
Swift 中的类与结构体
我们都知道,内存分配可以分为堆区(Heap)和栈区(Stack)。由于栈区内存是连续的,内存的分配和销毁是通过入栈和出栈操作进行的,速度远高于堆区。堆区存储高级数据类型,在数据初始化时,查找没有使用的内存,...

Jerod2阅读 1.3k

iOSer 年度总结|晋升的逻辑是什么
2022年是疫情3年的一个“小尾巴”,但它一点也不小,因为它是3年内大家感受最深的一年,也是影响最大的一年。身边同事们换工作、周围见闻都可以印证这个结论。

杭城小刘6阅读 1.8k

封面图
这一次,解决Flutter Dialog的各种痛点!
4.0版本做了重大调整,迁移请参照: SmartDialog 3.x 迁移 4.0本文内容已更新,文中内容及其代码皆为4.0用法前言Q:你一生中闻过最臭的东西,是什么?A:我那早已腐烂的梦。兄弟萌!!!我又来了!这次,我能自信...

小呆呆6661阅读 3.5k

封面图
iOS 健康共享失败如何解决
您要开始与之共享的对象必须已经连同他们的 iCloud 账户邮箱一起保存在您的“通讯录”中(iCloud 账户邮箱即 iCloud 账户绑定的邮箱信息,不是强制要求 @iCloud.com 邮箱)。

岚哲阅读 7.2k

网易云音乐开源全链路埋点方案-曙光埋点(dawn)
网易云音乐开源了曙光埋点 dawn,一个跨多端的全链路埋点解决方案,旨在构造一个完美的数据理想国。曙光埋点创造性的提出了埋点虚拟树(VTree),并在此基础上实现了诸多能力,解决大前端侧埋点困难、精度差、不...

云音乐技术团队2阅读 340

封面图
Flutter 让你的Dialog脱胎换骨吧!(Attach,Dialog,Loading,Toast)
4.0版本做了重大调整,迁移请参照: SmartDialog 3.x 迁移 4.0本文内容已更新,文中内容及其代码皆为4.0用法前言Q:你一生中闻过最臭的东西,是什么?A:我那早已腐烂的梦。兄弟萌!!!我又来了!这次,我能自信...

小呆呆6662阅读 2.3k

封面图
探究 iOS 内存问题
本文从 Tagged Pointer、objc 源码、dealloc 原理、AutoreleasePool 原理、野指针探究等技术点展开聊了聊 iOS 内存相关问题。

杭城小刘1阅读 1.8k

封面图
47 声望
4 粉丝
宣传栏