ITMS-90683 錯誤:Expo 修正方法
作者:Mehdi Azizi
發布於 ,6 分鐘
ITMS-90683 代表 Info.plist 缺少用途說明。在 app.json 的 ios.infoPlist 加上信中指名的鍵,再重新建置即可。
ITMS-90683 是 Apple 的自動退件:你送出建置後不久就會收到電子郵件,那時還沒有任何真人審查。它的意思是,你的 Info.plist 檔案裡少了一句話,用來說明 App 為什麼要存取某項敏感資料。修正只要兩步:把訊息中提到的鍵加進 ios.infoPlist,然後重新建置。
我在 Solys(我那款附小遊戲的鬧鐘)上就碰過,而且是為了一項 App 根本沒用到的資料。下面說明這則訊息的意思、它為什麼會出現,以及怎麼避免。
ITMS-90683 錯誤是什麼意思?
完整訊息的標題是「ITMS-90683: Missing purpose string in Info.plist」。它表示你的 App 程式碼參照了某個會碰到敏感資料的 API(照片、相機、麥克風、位置、聯絡人),但你的 Info.plist 裡沒有對應的說明鍵。訊息會指出這個鍵的名稱,例如 NSPhotoLibraryUsageDescription。
這句說明叫做「purpose string」。它就是 iOS 在請求權限的視窗裡顯示的文字。Apple 在關於存取受保護資源的文件中寫得很清楚:如果 App 的程式碼存取這些資源卻沒有 purpose string,App Review 會退件。
這不是審查員的退件。這項檢查是自動的,在建置交付時、進入審查之前就會觸發,跟隱私權清單的 ITMS-91053 一樣。這個建置會被剔除,你必須重新送一個。
為什麼你的 App 沒用到這項資料,Apple 還是退件
這是最讓人意外的地方。**Apple 分析的是你建置裡的程式碼,不是 App 實際做了什麼。**只要你打包進去的某個函式庫參照了照片圖庫,這個鍵就是必要的,即使沒有任何畫面會請求照片權限。Apple 的訊息自己也講明了:外部函式庫或 SDK 可能會參照這些 API,purpose string 仍然是必填。
我的情況發生在 2026 年 9 月 26 日。整理 Solys 的設定時,我把 NSPhotoLibraryUsageDescription 這個鍵拿掉了,因為 App 完全不碰照片。下一個建置就被以 ITMS-90683 退件。原因是:App 用到的兩個 Expo 函式庫 expo-image 和 expo-file-system,裡面有參照照片圖庫的程式碼。之前的建置能過,是因為那個鍵還在。
教訓:說明鍵不能「因為沒用到」就拿掉。只有當建置裡已經沒有任何函式庫參照該 API 時,才能移除。
最常見的鍵
NSPhotoLibraryUsageDescription:讀取或寫入照片。NSPhotoLibraryAddUsageDescription:只新增照片,不讀取。NSCameraUsageDescription:相機。NSMicrophoneUsageDescription:麥克風。NSLocationWhenInUseUsageDescription:使用期間的位置。NSContactsUsageDescription:聯絡人。NSUserTrackingUsageDescription:廣告追蹤(App Tracking Transparency)。
Apple 在文件中說明了每個鍵,例如 NSPhotoLibraryUsageDescription 的文件:只要 App 使用會讀寫照片圖庫的 API,就必須提供這個鍵。
在 Expo App 中修正 ITMS-90683
- **記下 Apple 郵件中提到的鍵。**訊息會給出它的確切名稱。
- 把它加進你的設定,放在
ios.infoPlist底下,做法參考 Expo 的權限文件:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys 不會存取你的照片,也從不請求這項權限。"
}
}
}
}
- **重新建置。**Expo 有特別說明:Info.plist 的修改無法透過遠端更新套用,必須產生新的二進位檔。
- 把建置重新送給 Apple,然後在你的版本中選取它。
如果你的 App 有多語系,要注意一個陷阱:語言檔是翻譯某個鍵,而不是宣告它。這個鍵必須先存在於 ios.infoPlist(或相關外掛的設定)中。否則 App 可能在第一次呼叫時就當掉。
如果 App 沒用到這項資料,該寫什麼說明?
Apple 要求說明要正確、有用且具體。如果你的 App 真的會用到這項資料,就用一句話說明用途:「App 使用相機掃描你票券上的條碼。」
如果這個鍵只是因為某個函式庫才需要,Apple 給了兩種解法:寫上說明,或移除存取該資料的程式碼。當程式碼來自函式庫時,你沒辦法輕易移除。所以在 Solys 上,我就照實寫:「Solys 不會存取你的照片,也從不請求這項權限。」這是務實的選擇:下一個建置在交付時順利通過,但我沒辦法保證 Apple 永遠都會接受這句話。
送出前找出缺少的鍵
在專案根目錄執行這個指令,會列出 iOS 程式碼中參照了最受關注 API 的函式庫檔案:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
每個名稱對應一種資料:PHPhotoLibrary 是照片,AVCaptureDevice 是相機與麥克風,CLLocationManager 是位置,CNContactStore 是聯絡人,EKEventStore 是行事曆,ATTrackingManager 是追蹤。對每個結果,確認你的設定裡有對應的說明鍵。
這張安全網能抓到我遇過的情況。但它無法取代閱讀 Apple 的郵件,那仍是唯一可靠的清單,就像 ITMS-90338 的非公開 API 一樣。從那次退件之後,我每次建置前都會先做這項檢查:只要幾秒鐘,而一次 ITMS-90683 退件的代價是一個建置,加上重做的時間。
順利送出你的建置
ITMS-90683 只要看懂了就能很快修好,跟針對 Xcode 版本的 ITMS-90725 一樣。之後來自審查員的退件就需要多花點心思:處理方式在 App 被 Apple 退件頁面,最常見的原因則整理在 Apple 為什麼退件你的 App。
想在送出前檢查你的資料,Apple Review Kit 收錄了我的檢查清單,以及會幫你審視專案的 Claude Code skills。如果送審卡住、想要有人幫你看,跟我預約一小時:我們用視訊在你的螢幕上一起檢查專案。如果你正在準備第一次上架,做一下免費診斷:它會幫你把步驟排好順序,並寄給你我的 Apple 防退件檢查清單。
常見問題
ITMS-90683 是 App Review 的退件嗎?
不是真人審查員的那種退件。這是建置交付時、進入審查前的自動檢查,跟圖示相關的 ITMS-90717 一樣。沒有人打開過你的 App。建置會被剔除:你必須修正 Info.plist,再送一個新的。
為什麼我的 App 沒用到某項資料,Apple 還要求對應的鍵?
因為 Apple 分析的是建置裡的程式碼,而不是 App 的行為。只要打包進去的函式庫參照了照片圖庫或相機,就必須提供說明鍵,即使沒有任何畫面會請求這項權限。
可以用遠端更新修正 ITMS-90683 嗎?
不行。缺少的鍵位於 Info.plist,而它是二進位檔的一部分。遠端更新不會修改這個檔案:你必須重新建置,再送給 Apple。
在 Expo 專案中,NSPhotoLibraryUsageDescription 要加在哪裡?
加在你的 App 設定中的 ios.infoPlist 底下,並附上一句描述用途的說明。有些函式庫也在外掛中提供專屬設定,可能會一併加入其他鍵,例如背景模式。不論哪種方式,這個鍵都必須存在於基本設定中,而不只是在翻譯檔裡。
沒用到的說明鍵應該移除嗎?
只有在建置裡已經沒有任何函式庫參照該 API 時才移除。否則下一次送出就會以 ITMS-90683 被退件。移除鍵之前,先在相依套件的 iOS 程式碼中搜尋該 API 的名稱。