
很多人第一次把构建传到 App Store Connect,会看到 TestFlight 里的构建状态是 Missing Compliance(缺少合规证明),测试员收不到新版本。原因来自 Apple 的加密出口合规说明:
所以每次提交新版本,App Store Connect 都会问你一组加密相关问题。没回答之前,构建就停在「缺少合规证明」。这和你的 App 是不是做安全产品无关,几乎所有 App 都会碰到。
| 方式 | 做法 | 适合 |
|---|---|---|
| 手动回答 | 在 App Store Connect → TestFlight → 点击该构建旁的「管理」,按提示回答加密问题 | 偶尔上传、临时处理 |
| 写进 Info.plist | 添加 ITSAppUsesNonExemptEncryption 键,之后上传的构建不再询问 | 长期维护、CI 自动上传 |
手动回答只对当前构建有效,下一次上传还得再答。推荐直接写进 Info.plist。
Apple 对 ITSAppUsesNonExemptEncryption 的说明很明确:
| 你的情况 | 取值 |
|---|---|
| App(包括它链接的所有第三方库)完全不使用加密 | NO |
| 只使用豁免于出口合规文档要求的加密形式 | NO |
| 使用了非豁免加密 | YES,通常还要提供合规文档 |
Apple 举的典型例子:使用操作系统内置的加密,比如通过 URLSession 发起 HTTPS 连接,通常豁免上传出口文档;而自研或专有加密算法则不属于豁免。很多普通 App 只是用 HTTPS 调接口、用系统 Keychain 存凭据,大多落在「豁免」一侧,但最终以你对照 Apple 的出口合规概览判断为准。
注意一条容易漏的:Apple 文档提到,使用豁免加密的 App 可能仍需要向美国政府提交年度自我分类报告;而使用非豁免加密并已向 Apple 提供文档的,则不需要该报告。是否适用请自行核实,必要时咨询专业人士。
在 Target → Info 标签页的「Custom iOS Target Properties」里新增一项:
App Uses Non-Exempt Encryption(即 ITSAppUsesNonExemptEncryption)直接编辑 Info.plist 源码时写成:
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
编辑 ios/Runner/Info.plist,加入上面那两行即可。
裸 React Native 项目同样改 ios/<项目名>/Info.plist。Expo 托管项目可以在 app.json 的 ios.config.usesNonExemptEncryption 里设置为 false,由构建流程写入 Info.plist。
加完后重新打包并上传新构建,已经上传的旧构建不会因此改变状态,旧构建仍需手动回答一次。
如果 App 使用非豁免加密(例如自研加密协议),流程是:
ITSEncryptionExportComplianceCode 键中;ITSAppUsesNonExemptEncryption 为 YES。若 App 计划在法国上架并使用了加密,App Store Connect 的问题流程里还可能询问与法国相关的加密申报,按提示准备即可。
用 fastlane、Xcode Cloud 或其他 CI 自动上传构建时,「缺少合规证明」会让流水线最后一步卡住:构建传上去了,却没法自动分发给测试组。把 ITSAppUsesNonExemptEncryption 写进 Info.plist 后,新构建处理完成即可直接进入 TestFlight 分发,不再需要有人登录后台点「管理」。
建议在上传前做一次快速检查:
.app 包里的 Info.plist 中查一下这个键,避免被构建脚本或多环境配置覆盖;| 问题 | 解答 |
|---|---|
| 加了键还是显示缺少合规证明 | 确认是新上传的构建;检查键写在主 App Target 的 Info.plist,而不是某个扩展或测试 Target |
| 扩展(Widget、通知扩展)也要加吗 | 合规信息以 App 构建为单位回答,主 App 的 Info.plist 设置好即可;如果审核界面仍询问,按提示回答 |
| 用了 Firebase、支付 SDK 怎么办 | 键的取值要把第三方库算进去;大多数 SDK 只用系统 HTTPS,但请以 SDK 文档和你的判断为准 |
| 选错了会怎样 | 出口合规是法律责任,不只是审核问题;不确定时宁可查清楚再填 |
| 国内上架有类似要求吗 | 这是 Apple 针对美国出口法规的流程;国内上架另有 App 备案 等要求,两者互不替代 |
「缺少合规证明」不是被拒,只是 App Store Connect 在等你回答加密问题。弄清楚 App 属于不加密、豁免加密还是非豁免加密,在 Info.plist 里写好 ITSAppUsesNonExemptEncryption,以后每次上传都能直接进入 TestFlight。等构建跑通、要准备正式上架素材时,可以用 appshotmaker.com 把商店截图一起做好。