# Missing Compliance 解决方法

> Missing Compliance 表示 Apple 在等你的加密声明。先在 App Store Connect 解锁构建，再设好密钥，以后不再出现。

原始页面：[Missing Compliance 解决方法](https://devoria.fr/zh-hans/blog/testflight-missing-compliance-fix)
作者：[Mehdi Azizi](https://devoria.fr/zh-hans/mehdi-azizi)
发布：2026-11-06
内容最后修订：2026-11-06


**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 关于[构建状态](https://developer.apple.com/help/app-store-connect/reference/app-uploads/app-build-statuses/)和[测试版构建出口合规](https://developer.apple.com/help/app-store-connect/test-a-beta-version/provide-export-compliance-information-for-beta-builds/)的页面，于 2026 年 11 月 6 日重新核对。

## Missing Compliance 是什么意思

Apple 的构建状态列表用一句话定义了它：缺少出口合规文档，需要你采取行动。Apple 用黄色显示它，这个颜色表示流程进行中，取决于你或 Apple，而它的说明明确指出需要你来操作。

Apple 为什么要问这个？[加密出口规定页面](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations)解释了：当你把构建发到 TestFlight 或 App Store 时，就是把它发到了美国的服务器上。如果你的应用在美国和加拿大以外分发，它就受美国出口法律管辖，不管你的公司在哪个国家。只要应用使用、包含或集成了加密，Apple 就视其为加密软件的出口。

**结果是：每个新版本，App Store Connect 都会问你合规问题，除非你的 Info.plist 已经给出了答案。** 这就是为什么 Expo 的第一个构建几乎总是卡在 Missing Compliance。

## 解锁正在等待的构建

以下步骤来自 Apple 关于测试版构建出口合规的页面。你需要 Account Holder、Admin 或 App Manager 角色。

1. 在 Apps 中打开你的应用，然后进入 TestFlight 标签页。
2. 在侧边栏的 Builds 下选择平台。
3. 在 Build 列中，点击相应构建的图标或编号。
4. 点击 Provide Export Compliance Information，然后回答问题。
5. 如果 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 没有记录其他原因。如果构建刚上传，等收到处理完成的邮件（详见[构建号与版本号](https://devoria.fr/zh-hans/blog/app-store-connect-build-number-version)指南），再刷新页面。

## 永远不用再回答：在项目里设置这个键

Apple 在测试版构建页面上说得很清楚：你可以在 Info.plist 中声明应用不使用加密，或者属于豁免范围，这样每次提交就不用再回答了。这个键叫 [ITSAppUsesNonExemptEncryption](https://developer.apple.com/documentation/bundleresources/information-property-list/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`，[配置参考](https://docs.expo.dev/versions/latest/config/app/)说明它会把 Apple 的键写入构建的 Info.plist，并且 `ios.config` 只用于构建：它不会出现在生产环境的 manifest 中。

```json
{
  "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://developer.apple.com/help/app-store-connect/manage-app-information/overview-of-export-compliance/)还补充了一个重要提醒：解释由你负责，如果你错误地声称豁免，后果也由你承担。

对于一个通过 HTTPS 调用 API、存储偏好设置、销售订阅的 Expo 应用，`false` 是常见答案。对于一个自己加密消息、文件或保险库的应用，答案是 `true`，Apple 会要求提供文档。

> 别下意识地填 `false`。重新检查你的依赖：一个端到端加密库或自制的加密存储，都会让你落到需要提交文档的那一边。

## 如果你的应用使用了非豁免加密

[加密文档页面](https://developer.apple.com/help/app-store-connect/manage-app-information/determine-and-upload-app-encryption-documentation/)描述了流程。在 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 应用](https://devoria.fr/zh-hans/blog/testflight-guide-test-iphone-app)指南：内部测试员立即可用，外部测试员需要等测试版审核，并且根据构建状态列表，90 天后过期。Expo 上传的其他卡点，比如构建号已被使用或文件被拒，见[EAS 上传到 App Store Connect 的错误](https://devoria.fr/zh-hans/blog/eas-submit-ios-common-errors-fixes)，完整流程见[用 EAS 把 Expo 应用发布到 App Store](https://devoria.fr/zh-hans/blog/eas-submit-ios-publish-expo-app-store)。

[iOS & Android Kit](https://devoria.fr/zh-hans/kits/ios) 包含我的 Expo 起步代码（已经设置好这个键），以及从第一个构建到 App Store 页面的完整路线。如果你想知道还有什么在阻碍你上架，[免费诊断](https://devoria.fr/zh-hans/diagnostic)只需回答几个问题就能告诉你，还会发给你我的 Apple 防拒审清单。完整步骤见[在 App Store 上发布应用](https://devoria.fr/zh-hans/expertise/publish-an-app-on-the-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 提供了文档，则不需要这份报告。


## 你的项目

[Review Kit](https://devoria.fr/zh-hans/kits/app-review)：我的 App Store 审核清单、我被 Apple 拒审后的修正方案、Google Play 审核清单，以及三个 Claude Code skill。¥369。

[iOS & Android Kit](https://devoria.fr/zh-hans/kits/ios)：用 Claude Code 打造你的 iPhone 和 Android 应用：我自己应用的起步代码、上架商店的完整流程，以及全部工具包。¥739。

[诊断：你离自己的 iPhone 应用还差什么](https://devoria.fr/zh-hans/diagnostic)：7 个问题，60 秒：看清真正阻碍你发布 iPhone 应用的原因，拿到你的 4 步路线和适合你的套件。
