关于ios:ipa重签名

54次阅读

共计 2048 个字符,预计需要花费 6 分钟才能阅读完成。

文章写于 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 也须要对应。

正文完
 0