场景需求

ios重签名可以把已发布/未发布的包重新签名为自己的证书和签名。

比如我这里有企业开发者账号,某用户想把他们的更改为企业包进行分发,那么就可以通过重签名的方式把他们现有的ipa包替换为企业证书的包,这中间也不需要提供p12或描述文件,就可以完成包的转化。

ios重新签名的核心原理是使用 codesign 命令,当然也许完成一些额外的操作。

大致流程

1、解压ipa

unzip appstore.ipa

2、删除旧的签名

rm -rf Payload/appstore.app/_CodeSignature

3、复制新的描述文件

mv inhouse.mobileprovision Payload/appstore.app/embedded.mobileprovision

4、用新的证书签名

/usr/bin/codesign -f -s "iPhone Distribution: XXXXX (XXX)" --entitlements entitlements.plist Payload/appstore.app/

5、压缩成ipa

zip -r inhouse.ipa Payload/

在这个过程中,最重要是这个 entitlements.plist文件的问题。

entitlements.plist是一个比较重要的文件,涉及到app的权限及签名相关问题。

那么,如何得到这个文件呢?我们可以通过这条命令

usr/bin/codesign -d --entitlements - ./Payload/appstore.app

获取到这个文件的内容,大致格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>application-identifier</key>
     <string>JDL5JS4SKC.com.jason-z.appstore</string>
     <key>aps-environment</key>
     <string>production</string>
     <key>get-task-allow</key>
     <false/>
     <key>keychain-access-groups</key>
     <array>
          <string>JDL5JS4SKC.*</string>
     </array>
</dict>
</plist>

注意:这里我们我么需要把红色的地方替换成新的签名文件的bundleidteamid.

当然,有的朋友可能会问,有没有更简单的操作呢?

实际上是有的。

著名的自动化工具fastlane,就封装了一个resign的工具,专门可以用来对app进行重签名的。具体可看:https://docs.fastlane.tools/actions/sigh/#resign

使用方法也很简单, 一行命令即可。

fastlane sigh resign appstore.ipa --signing_identity "iPhone Distribution: XXX" -p "inhouse.mobileprovision"