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都是一样的)
其中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文件,具体格式如下:
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)到Payload
中xxx.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 Prefix )
4. 验证签名是否成功
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
文件。