TestFlight Missing Compliance 怎麼解決
作者:Mehdi Azizi
發布於 ,9 分鐘
Missing Compliance 代表 Apple 在等你申報加密使用情況。先在 App Store Connect 解除這個 build,再設定金鑰,之後就不會再出現。
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 狀態和 Beta build 出口合規的頁面,我在 2026 年 11 月 6 日重新讀過。
Missing Compliance 是什麼意思
Apple 的 build 狀態列表用一句話定義它:缺少出口合規文件,需要你採取行動。Apple 用黃色顯示它,這個顏色代表一個進行中的流程,取決於你或 Apple,而它的說明也寫明需要你採取行動。
Apple 為什麼要問這個?加密出口法規頁面有解釋:當你把 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 角色。
- 在 Apps 裡打開你的 app,再進入 TestFlight 分頁。
- 在側邊欄的 Builds 底下,選擇平台。
- 在 Build 欄位中,點擊相關 build 的圖示或編號。
- 點擊 Provide Export Compliance Information,然後回答問題。
- 如果 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 編號與版本這篇指南),再重新整理頁面。
再也不用回答:在專案裡設定金鑰
Apple 在 Beta build 頁面寫得很清楚:你可以在 Info.plist 中表明 app 沒有使用加密,或屬於豁免範圍,這樣就不必每次提交都回答。這個鍵叫做 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 的鍵寫進 build 的 Info.plist,而且 ios.config 只在 build 時使用:它不會出現在正式環境的 manifest 中。
{
"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 呼叫 API、儲存偏好設定、販售訂閱的 Expo app,false 是常見的答案。如果 app 自己加密訊息、檔案或保險箱,答案就是 true,Apple 會要求提供文件。
不要反射性地填
false。重新檢查你的依賴套件:一個端對端加密函式庫,或是自製的加密儲存,都會讓你落到需要提供文件的那一邊。
如果你的 app 使用非豁免加密
加密文件頁面描述了流程。在 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 這篇指南:內部測試人員立刻可用,外部測試人員要等 Beta 審查通過,而根據 build 狀態列表,90 天後到期。Expo 上傳的其他可能卡關,例如 build 編號已被使用或檔案被拒,請看 EAS 上傳到 App Store Connect 的錯誤,完整流程則在 用 EAS 把 Expo app 發佈到 App Store。
iOS & Android Kit 包含我的 Expo Starter Code,這個鍵已經設好,還有從第一個 build 到 App Store 頁面的完整路線。如果你想知道還有什麼卡住你的上架,免費診斷只要回答幾個問題就會告訴你,還會寄給你我的 Apple 防退件檢查清單。完整步驟在 在 App Store 發佈 app。
常見問題
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 提供文件,就不需要這份報告。

