iOS/Android 应用签名报错对照表:从 provisioning 到 jarsigner
Uniapp先给结论:应用签名报错分两大体系——iOS 是「证书 + 描述文件 + entitlements」三位一体,错一个就签不上;Android 是「keystore + jarsigner / apksigner」体系,最常见的坑是 keystore 密码/别名错和签名方案(v1/v2/v3)不匹配。下面按平台给对照表,对着报错关键词直接定位。
一、iOS 签名报错对照
| 报错 / 现象 | 原因 | 处理 |
|---|---|---|
| No signing certificate 'iOS Distribution' found | 本机没装发布证书或没带私钥 | 重新导入 .cer + p12,确认钥匙串里能展开私钥 |
| Provisioning profile doesn't include signing certificate | 描述文件还绑着旧证书 | 回开发者后台 Edit profile 换证书,重新下载安装 |
| ITMS-90161 / 无效 provisioning profile | 用了 Development / Ad Hoc 包去上架 | 换 App Store 分发证书与描述文件重新打包 |
| ITMS-90704(缺失用途字符串) | 用了相机/定位等权限但 Info.plist 没写用途描述 | 补 NSxxxUsageDescription 描述文案 |
| entitlements 不匹配 | App 用的能力(推送/支付)与 profile 授权不一致 | 核对 Capabilities 与 profile 的 entitlements |
iOS 证书与描述文件的完整更新流程,见站内《iOS 生产证书过期如何更新》;打包完成后怎么传到 App Store,见《Windows 提交 IPA 到 App Store》。
二、Android 签名报错对照
| 报错 / 现象 | 原因 | 处理 |
|---|---|---|
| jarsigner 提示 keystore 被篡改或密码错误 | keystore 密码输错、文件损坏或格式不对 | 确认密码(区分大小写);确认是真正的 .keystore/.jks |
| 别名 <x> 不存在 | alias 名写错 | 先 keytool -list 看真实别名,原样复制 |
| apksigner 校验:missing v2 / v3 signature | 只打了 v1(jarsigner 旧方案),Android 7+ 要求 v2 | 改用 apksigner 同时打 v1+v2(Android 9+ 建议 v3) |
| INSTALL_PARSE_FAILED_NO_CERTIFICATES | APK 完全没签名或签名方案不被支持 | 重新用 apksigner 签名并校验通过 |
| 重签后安装报签名冲突 | 用不同 keystore 重签已发布 APK | 同一 App 必须用同一 keystore;换 key 等于换全新 App |
如何查看 keystore 的 MD5 / SHA1 / SHA256 指纹,见站内《keytool 查看 Keystore 的 MD5 与证书指纹》。
三、重点:Android 签名方案 v1 / v2 / v3 验证链路
这是 Android 签名最容易踩的坑。jarsigner 打的是 v1(JAR 签名),从 Android 7.0 起系统要求 v2(APK 签名方案),Android 9.0 起又引入 v3。只打 v1 的包在 7.0+ 上能装但校验弱,很多渠道和加固平台直接拒收。
# 推荐用 apksigner 同时覆盖 v1+v2+v3(对齐、zipalign 后再签) zipalign -p 4 in.apk aligned.apk apksigner sign --v1-signing-enabled true --v2-signing-enabled true \ --v3-signing-enabled true --ks keystore.jks --out signed.apk aligned.apk # 校验签名方案是否齐全 apksigner verify --print-certs signed.apk
用 verify 能直接看到 V1 / V2 / V3 是否都打上。如果校验报「v2 缺失」,说明上一步签名方案没开全——这也是很多「打包成功但渠道拒收」的根因。
四、iOS 与 Android 签名一句话对比
| 维度 | iOS | Android |
|---|---|---|
| 密钥体系 | Apple 证书 + 描述文件 | keystore / jks |
| 签名工具 | Xcode / 命令行(见 D3) | jarsigner(v1)/ apksigner(v2/v3) |
| 易错点 | 证书/描述文件错配、entitlements | 密码/别名错、签名方案不全 |
| 上架 | App Store Connect | 各应用市场或自有分发 |
五、FAQ
Q:Android 用 jarsigner 还是 apksigner?
新项目一律用 apksigner。jarsigner 只出 v1,7.0+ 设备虽能装但校验弱、易被渠道拒;apksigner 能一次覆盖 v1/v2/v3。
Q:iOS 和 Android 能用同一套签名吗? 不能。两套体系完全独立,iOS 走 Apple 证书,Android 走 keystore,互不通用。
Q:签名密码忘了怎么办? iOS 的 p12 密码忘了可重新导出;Android 的 keystore 密码没有找回机制,忘了只能换新 keystore 重新签名,意味着各平台签名校验要重走一遍。
小结
签名报错记住两条线:iOS 看「证书 + 描述文件 + entitlements」三者是否一致,Android 看「keystore 密码/别名 + 签名方案 v1/v2/v3 是否齐全」。Android 侧最容易被忽略的是 v2/v3 没打全,用 apksigner verify 一眼就能查。如果嫌每次手搓签名麻烦,Android APK 的加固和签名可以交给自建平台一键完成(见《应用加固签名一站式》与站内 IPA-tool2 平台介绍)。