Missing Compliance 解决方法
作者:Mehdi Azizi
发布于 ,9分钟
Missing Compliance 表示 Apple 在等你的加密声明。先在 App Store Connect 解锁构建,再设好密钥,以后不再出现。
Missing Compliance 不是错误,而是一个在等你回答加密问题的构建。 只要你还没回答,这个构建就一直对测试员不可用。对于当前这个构建,你在 App Store Connect 的 TestFlight 标签页里回答问题。对于之后的构建,你在 Info.plist 里加上 ITSAppUsesNonExemptEncryption 这个键,或者用 Expo 的话在 app.json 里设置 ios.config.usesNonExemptEncryption,这个状态就不会再出现。
我的 iOS 应用都是用 Expo 做的。在 Solys 的 app.json 里,这个键的值是 false,而且写了两次:一次在 ios.config,一次在 ios.infoPlist。本文依据 Apple 关于构建状态和测试版构建出口合规的页面,于 2026 年 11 月 6 日重新核对。
Missing Compliance 是什么意思
Apple 的构建状态列表用一句话定义了它:缺少出口合规文档,需要你采取行动。Apple 用黄色显示它,这个颜色表示流程进行中,取决于你或 Apple,而它的说明明确指出需要你来操作。
Apple 为什么要问这个?加密出口规定页面解释了:当你把构建发到 TestFlight 或 App Store 时,就是把它发到了美国的服务器上。如果你的应用在美国和加拿大以外分发,它就受美国出口法律管辖,不管你的公司在哪个国家。只要应用使用、包含或集成了加密,Apple 就视其为加密软件的出口。
结果是:每个新版本,App Store Connect 都会问你合规问题,除非你的 Info.plist 已经给出了答案。 这就是为什么 Expo 的第一个构建几乎总是卡在 Missing Compliance。
解锁正在等待的构建
以下步骤来自 Apple 关于测试版构建出口合规的页面。你需要 Account Holder、Admin 或 App Manager 角色。
- 在 Apps 中打开你的应用,然后进入 TestFlight 标签页。
- 在侧边栏的 Builds 下选择平台。
- 在 Build 列中,点击相应构建的图标或编号。
- 点击 Provide Export Compliance Information,然后回答问题。
- 如果 Apple 要求提供文档,点击 Go to App Encryption Page 上传。否则点击 Save。
Apple 还介绍了一个快捷方式:构建旁边的 Manage 链接会打开同样的问题,Choose File 可以附上已获批准的文档。保存后,构建会变成 Ready to Submit,如果是发给内部群组,则直接变成 Testing。Ready to Test 只会在外部测试员的测试版审核之后出现。
Manage 链接点不了? 先检查你在团队中的角色:Apple 只允许 Account Holder、Admin 和 App Manager 角色回答,Developer 或 Marketing 账号无法回答。Apple 没有记录其他原因。如果构建刚上传,等收到处理完成的邮件(详见构建号与版本号指南),再刷新页面。
永远不用再回答:在项目里设置这个键
Apple 在测试版构建页面上说得很清楚:你可以在 Info.plist 中声明应用不使用加密,或者属于豁免范围,这样每次提交就不用再回答了。这个键叫 ITSAppUsesNonExemptEncryption。Xcode 里显示的名字是 App Uses Non-Exempt Encryption。
| 你的工具 | 文件 | 位置 | 值 |
|---|---|---|---|
| Expo(EAS Build) | app.json | expo.ios.config | false |
| Expo,另一种方式 | app.json | expo.ios.infoPlist | false |
| 纯 React Native | Info.plist | App Uses Non-Exempt Encryption | NO |
| Xcode,Swift | Info.plist | App Uses Non-Exempt Encryption | NO |
在 Expo 中,这个键叫 usesNonExemptEncryption,配置参考说明它会把 Apple 的键写入构建的 Info.plist,并且 ios.config 只用于构建:它不会出现在生产环境的 manifest 中。
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
在 Expo 中,ios.infoPlist 也接受这个键的 Apple 原名,值相同:这就是 Solys 的 app.json 里的第二行。在原生项目中,同样的声明在 Info.plist 里只占一行:键 App Uses Non-Exempt Encryption(这是 Xcode 显示的名字),值为 NO。这个值是布尔值,不是字符串。
这个键从下一个构建开始生效。 已经上传的构建会一直处于 Missing Compliance,直到你在 App Store Connect 里回答:这两个操作不能互相替代,而是互相补充。
false 还是 true:怎么判断
Apple 对 NO 的定义是:你的应用(包括第三方库)不使用任何加密,或者只使用豁免文档要求的加密。否则就是 YES。
根据出口规定页面,通常豁免的是系统内置的加密,比如通过 URLSession 建立的 HTTPS 连接。不豁免的是:你自己编写或嵌入的专有加密。出口合规概览还补充了一个重要提醒:解释由你负责,如果你错误地声称豁免,后果也由你承担。
对于一个通过 HTTPS 调用 API、存储偏好设置、销售订阅的 Expo 应用,false 是常见答案。对于一个自己加密消息、文件或保险库的应用,答案是 true,Apple 会要求提供文档。
别下意识地填
false。重新检查你的依赖:一个端到端加密库或自制的加密存储,都会让你落到需要提交文档的那一边。
如果你的应用使用了非豁免加密
加密文档页面描述了流程。在 App Information 中,App Encryption Documentation 旁边的添加按钮会打开问题,然后用 Choose File 上传文档,再点 Save。Apple 要求你事先填好应用描述并设置好上架范围,以便判断文档是否充分。资料齐全时,Apple 的目标是大约两个工作日完成。
文档获批后,Apple 会给你一个值,填到 Info.plist 的 ITSEncryptionExportComplianceCode 键中。有了它,每次上传就不再提问。审核期间,你的构建会显示 Waiting for Export Compliance Review 或 In Compliance Review:不需要你做任何操作。
Apple 指出的两点,一点在出口规定页面,另一点在合规概览中:
- 即使使用的是豁免加密,也可能需要向美国政府提交年度自我分类报告。 如果你使用非豁免加密并已向 Apple 提供了文档,则不需要。
- 法国同样管控加密应用的进出口。 Apple 的概览列出了安全存储、安全通信和杀毒软件等相关领域,银行和医疗应用有豁免,并指向 ANSSI。
TestFlight 接下来会发生什么
解锁后的构建会走正常的 TestFlight 流程,详见用 TestFlight 测试 iPhone 应用指南:内部测试员立即可用,外部测试员需要等测试版审核,并且根据构建状态列表,90 天后过期。Expo 上传的其他卡点,比如构建号已被使用或文件被拒,见EAS 上传到 App Store Connect 的错误,完整流程见用 EAS 把 Expo 应用发布到 App Store。
iOS & Android Kit 包含我的 Expo 起步代码(已经设置好这个键),以及从第一个构建到 App Store 页面的完整路线。如果你想知道还有什么在阻碍你上架,免费诊断只需回答几个问题就能告诉你,还会发给你我的 Apple 防拒审清单。完整步骤见在 App Store 上发布应用。
常见问题
TestFlight 上的 Missing Compliance 是什么意思?
构建在等你的出口合规声明,也就是你对加密使用情况的回答。Apple 把它归为需要你采取行动的状态。在你回答之前,构建不会发给测试员。
为什么 Missing Compliance 的 Manage 链接点不了?
检查你的角色:Apple 只允许 Account Holder、Admin 和 App Manager 角色回答。Apple 没有记录其他原因。如果构建刚到,收到处理完成的邮件后再刷新页面。
我的应用只用了 HTTPS,加密问题要回答“是”吗?
Apple 指出,系统内置的加密(比如通过 URLSession 的 HTTPS 连接)通常豁免文档要求。这种情况下,ITSAppUsesNonExemptEncryption 的值为 NO,前提是没有第三方库加入专有加密。
每个构建都要回答加密问题吗?
是的,只要你的 Info.plist 里没有 ITSAppUsesNonExemptEncryption 这个键。有了它,App Store Connect 就不再提问。在 Expo 中,通过 app.json 的 ios.config.usesNonExemptEncryption 设置。
在 Expo 的 app.json 里哪里声明加密?
在 app.json 的 expo.ios.config 下,如果你的应用不使用任何非豁免加密,就写 "usesNonExemptEncryption": false。EAS Build 会把这个键写入构建的 Info.plist。它从下一个构建开始生效,对已上传的构建无效。
Missing Compliance 也会阻止提交到 App Store 吗?
出口合规问题适用于每个新版本,不论是测试版还是 App Store 版本。没有回答的构建无法分发。Info.plist 里的这个键能同时解决这两种情况。
我需要提交年度自我分类报告吗?
Apple 指出,即使使用豁免加密,也可能需要向美国政府提交年度自我分类报告,并指向官方流程。如果你的应用使用非豁免加密,并且已向 Apple 提供了文档,则不需要这份报告。

