# TestFlight Missing Compliance 怎麼解決

> Missing Compliance 代表 Apple 在等你申報加密使用情況。先在 App Store Connect 解除這個 build，再設定金鑰，之後就不會再出現。

原始頁面：[TestFlight Missing Compliance 怎麼解決](https://devoria.fr/zh-hant/blog/testflight-missing-compliance-fix)
作者：[Mehdi Azizi](https://devoria.fr/zh-hant/mehdi-azizi)
發布日期：2026-11-06
內容最後修訂：2026-11-06


**Missing Compliance 不是錯誤：它代表這個 build 在等你回答加密相關的問題。**只要你還沒回答，測試人員就拿不到這個 build。針對這個 build，你要在 App Store Connect 的 TestFlight 分頁回答問題。之後的 build，只要在 Info.plist 加上 ITSAppUsesNonExemptEncryption 這個鍵，或是用 Expo 的話在 app.json 設定 `ios.config.usesNonExemptEncryption`，這個狀態就不會再出現。

我的 iOS app 都是用 Expo 做的。在 Solys 的 app.json 裡，這個鍵的值是 `false`，而且設了兩次：一次在 `ios.config`，一次在 `ios.infoPlist`。這篇指南依據的是 Apple 關於 [build 狀態](https://developer.apple.com/help/app-store-connect/reference/app-uploads/app-build-statuses/)和 [Beta build 出口合規](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 的 build 狀態列表用一句話定義它：缺少出口合規文件，需要你採取行動。Apple 用黃色顯示它，這個顏色代表一個進行中的流程，取決於你或 Apple，而它的說明也寫明需要你採取行動。

Apple 為什麼要問這個？[加密出口法規頁面](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations)有解釋：當你把 build 傳到 TestFlight 或 App Store，其實是傳到一台位於美國的伺服器。如果你的 app 在美國和加拿大以外的地方發行，就受美國出口法規管轄，不管你的公司在哪個國家。而只要 app 使用、包含或整合了加密，Apple 就視為加密軟體的出口。

**結果就是：每個新版本，App Store Connect 都會問你合規問題，除非你的 Info.plist 已經回答了。**這也是為什麼 Expo 的第一個 build 幾乎都會卡在 Missing Compliance。

## 解除正在等待的 build

以下步驟來自 Apple 的 Beta build 出口合規頁面。你需要 Account Holder、Admin 或 App Manager 角色。

1. 在 Apps 裡打開你的 app，再進入 TestFlight 分頁。
2. 在側邊欄的 Builds 底下，選擇平台。
3. 在 Build 欄位中，點擊相關 build 的圖示或編號。
4. 點擊 Provide Export Compliance Information，然後回答問題。
5. 如果 Apple 要求你提供文件，點擊 Go to App Encryption Page 上傳。否則就點擊 Save。

Apple 也說明了捷徑：build 旁邊的 Manage 連結會打開同樣的問題，而 Choose File 可以附上已經核准的文件。儲存之後，build 會變成 Ready to Submit，如果是發給內部群組則會直接變成 Testing。Ready to Test 要等外部測試人員的 Beta 審查通過後才會出現。

**Manage 連結點不了？**先檢查你在團隊中的角色：Apple 只讓 Account Holder、Admin 和 App Manager 角色回答，Developer 或 Marketing 帳號無法回答。Apple 沒有記載其他原因。如果 build 剛上傳，先等處理完成的 e-mail（詳見[build 編號與版本](https://devoria.fr/zh-hant/blog/app-store-connect-build-number-version)這篇指南），再重新整理頁面。

## 再也不用回答：在專案裡設定金鑰

Apple 在 Beta build 頁面寫得很清楚：你可以在 Info.plist 中表明 app 沒有使用加密，或屬於豁免範圍，這樣就不必每次提交都回答。這個鍵叫做 [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 的鍵寫進 build 的 Info.plist，而且 `ios.config` 只在 build 時使用：它不會出現在正式環境的 manifest 中。

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

在 Expo 裡，`ios.infoPlist` 也接受用 Apple 的原始鍵名，值相同：這就是 Solys 的 app.json 裡第二行設定。在原生專案中，同樣的宣告在 Info.plist 只要一行：鍵是 App Uses Non-Exempt Encryption（Xcode 顯示的名稱），值為 NO。這個值是布林值，不是字串。

**這個鍵從下一個 build 開始生效。**已經上傳的 build 會一直停在 Missing Compliance，直到你在 App Store Connect 回答為止：這兩個動作不能互相取代，而是互補。

## false 還是 true：怎麼決定

Apple 對 NO 的定義是：你的 app（包含第三方函式庫）完全沒有使用加密，或只使用豁免文件義務的加密。否則就是 YES。

根據出口法規頁面，通常豁免的是系統內建的加密，例如透過 URLSession 的 HTTPS 連線。不豁免的是：專有加密，也就是你自己寫的或打包進去的。[出口合規總覽](https://developer.apple.com/help/app-store-connect/manage-app-information/overview-of-export-compliance/)還補充了一個重要提醒：解讀的責任在你，如果錯誤主張豁免，後果也由你承擔。

一個用 HTTPS 呼叫 API、儲存偏好設定、販售訂閱的 Expo app，`false` 是常見的答案。如果 app 自己加密訊息、檔案或保險箱，答案就是 `true`，Apple 會要求提供文件。

> 不要反射性地填 `false`。重新檢查你的依賴套件：一個端對端加密函式庫，或是自製的加密儲存，都會讓你落到需要提供文件的那一邊。

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

[加密文件頁面](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 要求你事先填好 app 說明並設定好供應範圍，以便判斷文件是否足夠。資料齊全時，Apple 的目標是大約兩個工作天。

文件核准後，Apple 會提供一個值，讓你填進 Info.plist 的 `ITSEncryptionExportComplianceCode` 鍵。有了它，每次上傳就不會再問問題。審查期間，你的 build 會顯示 Waiting for Export Compliance Review 或 In Compliance Review：你不需要做任何事。

Apple 提醒的兩點，一點在出口法規頁面，另一點在合規總覽：

- **即使使用豁免加密，仍可能需要向美國政府提交年度自我分類報告。**如果你使用非豁免加密，而且已經向 Apple 提供文件，就不需要。
- **法國也管制加密 app 的進出口。**Apple 的總覽列出安全儲存、安全通訊和防毒軟體為相關領域，銀行和醫療 app 則有豁免，並引導至 ANSSI。

## 接下來在 TestFlight 會發生什麼

解除後的 build 會走 TestFlight build 的正常流程，詳見 [用 TestFlight 測試你的 iPhone app](https://devoria.fr/zh-hant/blog/testflight-test-iphone-app-before-review) 這篇指南：內部測試人員立刻可用，外部測試人員要等 Beta 審查通過，而根據 build 狀態列表，90 天後到期。Expo 上傳的其他可能卡關，例如 build 編號已被使用或檔案被拒，請看 [EAS 上傳到 App Store Connect 的錯誤](https://devoria.fr/zh-hant/blog/eas-submit-ios-common-errors-fixes)，完整流程則在 [用 EAS 把 Expo app 發佈到 App Store](https://devoria.fr/zh-hant/blog/eas-submit-ios-expo-app-store)。

[iOS & Android Kit](https://devoria.fr/zh-hant/kits/ios) 包含我的 Expo Starter Code，這個鍵已經設好，還有從第一個 build 到 App Store 頁面的完整路線。如果你想知道還有什麼卡住你的上架，[免費診斷](https://devoria.fr/zh-hant/diagnostic)只要回答幾個問題就會告訴你，還會寄給你我的 Apple 防退件檢查清單。完整步驟在 [在 App Store 發佈 app](https://devoria.fr/zh-hant/expertise/publish-app-on-app-store)。

## 常見問題

### TestFlight 上的 Missing Compliance 是什麼意思？

這個 build 在等你的出口合規聲明，也就是你對加密使用情況的回答。Apple 把它歸類為需要你採取行動的狀態。在你回答之前，build 不會發給測試人員。

### 為什麼 Missing Compliance 的 Manage 連結點不了？

檢查你的角色：Apple 只讓 Account Holder、Admin 和 App Manager 角色回答。Apple 沒有記載其他原因。如果 build 剛上傳，等收到處理完成的 e-mail 後再重新整理頁面。

### 我的 app 只用 HTTPS，加密問題要回答「是」嗎？

Apple 表示，系統內建的加密，例如透過 URLSession 的 HTTPS 連線，通常豁免文件義務。這種情況下，ITSAppUsesNonExemptEncryption 鍵的值是 NO，前提是沒有任何第三方函式庫加入專有加密。

### 每個 build 都要回答加密問題嗎？

是的，只要你的 Info.plist 沒有 ITSAppUsesNonExemptEncryption 這個鍵。有了它，App Store Connect 就不會再問。用 Expo 的話，在 app.json 透過 `ios.config.usesNonExemptEncryption` 設定。

### 用 Expo 時，要在 app.json 的哪裡宣告加密？

在 app.json 的 `expo.ios.config` 底下，如果你的 app 沒有使用任何非豁免加密，就設定 `"usesNonExemptEncryption": false`。EAS Build 會把這個鍵寫進 build 的 Info.plist。它從下一個 build 開始生效，對已經上傳的 build 無效。

### Missing Compliance 也會擋住 App Store 提交嗎？

每個新版本都會問出口合規問題，不管是 Beta 還是 App Store。沒有回答的 build 無法發行。Info.plist 裡的鍵可以一次解決這兩種情況。

### 我需要提交年度自我分類報告嗎？

Apple 指出，使用豁免加密仍可能需要向美國政府提交年度自我分類報告，並引導至官方程序。如果你的 app 使用非豁免加密，而且已經向 Apple 提供文件，就不需要這份報告。


## 你的專案

[Review Kit](https://devoria.fr/zh-hant/kits/app-review)：我的 App Store 審查檢查清單、我被 Apple 退件後的修正、Google Play 檢查清單，以及三個 Claude Code skill。$1,749。

[iOS & Android Kit](https://devoria.fr/zh-hant/kits/ios)：用 Claude Code 打造你的 iPhone 和 Android App：我自己 App 的起始程式碼、上架商店的完整流程，以及所有套件。$3,599。

[診斷：你離自己的 iPhone App 還差什麼](https://devoria.fr/zh-hant/diagnostic)：7 個問題，60 秒：找出真正卡住你發布 iPhone App 的原因，拿到你的 4 步驟路線，以及最適合你的套件。
