公司的设备升级到 iOS 15 后,在安装 developerment 签名的 ipa 时失败。使用助手安装报错“安装包验证失败或设备未越狱”。命令行安装报错:
1 | [ 70%] VerifyingApplication |
检查了证书中的设备号确实存在。将设备降级到 iOS 14 后安装成功。
原因是苹果在新系统(iOS 15,iPadOS 15,tvOS 15 和 watchOS 8)中采用了新的签名校验方式,会验证签名中是否包含一种称为 DER(Distinguished Encoding Rules)的规则。如果操作系统是 macOS 10.14 ~ 10.15.x,则系统支持了新的签名格式,但是没有添加 DER。操作系统是 macOS 11.0 以后的会默认包含 DER。
下面操作在 macOS 11.4 的机器上进行。
查看 ipa 的签名格式
将 ipa 解压,
1 | 将 test.ipa 解压到 test 文件夹下 |
查看签名信息
使用命令查看签名信息,
1 | test.app 为 解压出的路径 |
在输出内容查找 CodeDirectory v=20400
这样的信息。如果 v
小于 20400
,则应用是旧签名格式,需要重签名。
如果 v
大于等于 20400
,但是无法在 iOS 15 等设备上安装,则需要确认签名是否包含 DER。
查看 DER
使用命令查看签名信息,
1 | d 后面有 5 个 v |
查看 PageSize
后面的内容,例如:
1 | Page size=4096 |
如果没有 -7
后面的值或者 -7
的值为 0
,则表示没有 DER,需要重签名。
重签名
查看本机所有的签名
使用命令行,
1 | security find-identity -v -p codesigning |
会列出本机上所有的签名,例如下图
1 | 1) ABCABCABCABC "iPhone Developer: XXXXXX (XXXXX)" |
其中就有签名所需要的证书,使用前面的签名标识(Codesign Identity)ABCABCABCABC
来进行重签名,命令行如下,
1 | codesign -s "ABCABCABCABC" -f --preserve-metadata --generate-entitlement-der test/Payload/test.app --verbose |
签名之后再生成 ipa 文件,使用命令行,
1 | zip -r new_test.ipa test/Payload |
可以重新安装 ipa 文件。
总结
- 生成包时使用操作系统为 macOS 11.0 以上,Xcode 版本 13.0 以上的机器。
- 如果签名格式有问题,需要使用 macOS 11.0 以上的机器进行重签名。
参考链接
- 解决ios15企业版以及adhoc包无法安装问题,derkin102527。
- Using the Latest Code Signature Format,developer.apple.com。