iOS ipa重签名 、resign

iOS ipa重签名 (个人版、企业版APP均可)

下面是个人之前使用过的方式,介绍比较详细

注意: 在开始重签之前你先要有一个企业证书或者个人开发者证书(个人或者公司均可)(苹果开发证书)

重签名:可以让用个人开发者账号打出来的包,不用上架Appstore即可将其安装到iOS设备上(前提条件是你得有一个开发者证书)。
风险提示:这种重签名方法仅供个人有兴趣的开发者去玩玩,不提倡用于商用,提倡使用Appstore上传发布到你的应用,重签名只能算是黑科技,苹果所不提倡的东西,如果APP使用量过大的话,企业证书有被封停的风险。当然,如果你使用的是个人开发者账号,则只能在添加了UUID的设备上面安装

苹果在iOS8.1.3系统以后加强了对ipa安装包签名的验证,主要区别在于ipa唯一标识在原有Bundle Identifier的基础上增加了证书ID,也就说安装包和手机上已安装APP的Bundle Identifier即使一致,如果两者签名的证书ID不相同,那么安装包也无法正常安装。

钥匙串中的证书列表

图中方框里字符串就是证书ID(钥匙串中我的证书),升级后的ipa标识就是证书ID+BundleID,只有两者完全匹配,安装包才能覆盖安装,否则就会提示安装失败。解决办法就是卸载安装包,重新安装!
如果这个地方找不到证书ID,可登录到苹果开发者中心https://developer.apple.com,memberCenter,点击certificates,identifier&Profiles,再点击identifier中的App IDs点击某个AppId(因为证书ID是唯一的,所以选哪个APPID都是一样的)

证书ID
其中Prefix就是证书ID

目前,重签名主要用于企业证书重签名个人证书发布的ipa包,包括各种助手及企业内测包的发布等。在重签名前,让我们先看看一个完整的ipa包有哪些与证书相关的东西!将ipa包后缀名改为zip,解压之后,会发现一个文件夹Payload(如果是个人证书打包还会包含Symbols文件夹),payload文件夹下面的XXX.app文件夹中有_CodeSignature签名文件夹和embedded.mobileprovision证书配置文件以及其他资源文件。重签名只关注这两个文件即可。

重要文件

_CodeSignature -> ipa包签名文件
embedded.mobileprovision -> 证书配置文件
so,替换上面两个文件就解决了ipa重签名的主要问题。
替换_CodeSignature里面的签名文件需要用到一个文件entitlements.plist的授权文件。所以我们要创建一个entitlements.plist文件,具体格式如下:

plist文件如图所示

xml格式如下:

<?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>xxxxxxxxxx.com.xxx.xxx</string>
        <key>com.apple.developer.team-identifier</key>
        <string>xxxxxxxxxx</string>
        <key>get-task-allow</key>
        <false/>
        <key>keychain-access-groups</key>
        <array>
            <string>xxxxxxxxxx.com.xxx.xxx</string>
        </array>
    </dict>
</plist>

其中xxxxxxxxxx.com.xxx.xxx要换成ipa标识(就是证书ID+BundleID),其中xxxxxxxxxx就是你的证书ID,后面部分是bundleID
注意:get-task-allow一定要填NO(false)(否则安装一定失败),还有bundleID一定要与新的embedded.mobileprovision相对应,不然会导致签名失败。
准备工作都做好了 ,是开始我们重签名的真正的步骤了:
1、解压你所要签名的ipa包(解压后里面包含Payload(如果是个人证书打包还会包含Symbols文件夹))
unzip xxx.ipa
2、删除Payload中xxx.app里面的_CodeSignature文件夹
rm -rf Payload/xxx.app/_CodeSignature
3、拷贝embedded.mobileprovision(新的必须改名为embedded)到Payloadxxx.app里面
cp embedded.mobileprovision Payload/xxx.app
4、创建entitlements.plist,并用该文件进行重签名
codesign -f -s "iPhone Distribution: xxxxxxxxxx" --entitlements entitlements.plist Payload/xxx.app
其中"iPhone Distribution: xxxxxxxxxx"是证书名, 在钥匙串中能找到
5、修改xxx.app下面的info.plist里面的bundleIdentifier为你自己的bundleIdentifier
6、打包
zip -r xxx.ipa Payload(如果之前文件夹包含Symbols文件夹,该文件夹与Payload文件夹一起打包)
7、安装到手机进行验证
xcode、iTunes、各种手机助手、或者一些第三方托管平台(比如蒲公英等)

codesign命令
1. 重签名
    codesign -f -s "iPhone Distribution: xxxxxxxxxx" --entitlements entitlements.plist Payload/xxx.app
2. 查看当前MAC电脑中的安装的开发者证书:
     security find-identity -v -p codesigning
3. 查看签名信息
     codesign -vv -d Payload/xxx.app
     可以看到如下信息:

查看签名信息


    identifier                   ———>bundleID
    iPhone Distribution :XXX     ———>证书名
    TeamIdentifier               ———>证书ID(即 App ID Prefix4. 验证签名是否成功
     codesign —verify Payload/xxx.app

验证签名成功与否

我自己这边看到的结果是这样的,重签名是成功的。

PS: !!!
如果你的APP中使用到了keychains的存取,APP在写入keychains时报错并导致APP奔溃日志:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.
导致crash的原因是keychains的数据仅共享于同公司(企业账号),别的公司(账号)访问不了你公司产品的keychain,所以重签名的bundeID必须与原来的一致。即你重签名所用的entitlements.plist中的bundleID要与原待签名的APP的bundleID一致。
下面两种做法均可以避免改问题
1、直接在Payload/xxx.app/info.plist中修改bundle identifier为与entitlements.plist中配置的bundleID一致
2、如果你不想改变你的bundleID,在你重签名所用到的企业证书需要去配置一个新的AppID,对该AppID配置App ID Suffix(Bundle ID)为待签名的App的bundleID,根据这个appID重新创建发布文件.mobileProversion文件。

如有疑问,可联系m12860gyh@gmail.com或者在下面留言
参考:
点击查看参考1
点击查看参考2

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值