# ITMS-90683 錯誤：Expo 修正方法

> ITMS-90683 代表 Info.plist 缺少用途說明。在 app.json 的 ios.infoPlist 加上信中指名的鍵，再重新建置即可。

原始頁面：[ITMS-90683 錯誤：Expo 修正方法](https://devoria.fr/zh-hant/blog/itms-90683-missing-purpose-string-expo)
作者：[Mehdi Azizi](https://devoria.fr/zh-hant/mehdi-azizi)
發布日期：2026-10-09
內容最後修訂：2026-10-09


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 在關於[存取受保護資源](https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources)的文件中寫得很清楚：如果 App 的程式碼存取這些資源卻沒有 purpose string，App Review 會退件。

這不是審查員的退件。這項檢查是自動的，在建置交付時、進入審查之前就會觸發，跟隱私權清單的 [ITMS-91053](https://devoria.fr/zh-hant/blog/itms-91053-missing-api-declaration-expo) 一樣。這個建置會被剔除，你必須重新送一個。

## 為什麼你的 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](https://devoria.fr/zh-hant/blog/guideline-5-1-2-third-party-ai-att-data-sharing)）。

Apple 在文件中說明了每個鍵，例如 [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription) 的文件：只要 App 使用會讀寫照片圖庫的 API，就必須提供這個鍵。

## 在 Expo App 中修正 ITMS-90683

1. **記下 Apple 郵件中提到的鍵。**訊息會給出它的確切名稱。
2. **把它加進你的設定**，放在 `ios.infoPlist` 底下，做法參考 [Expo 的權限文件](https://docs.expo.dev/guides/permissions/)：

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solys 不會存取你的照片，也從不請求這項權限。"
      }
    }
  }
}
```

3. **重新建置。**Expo 有特別說明：Info.plist 的修改無法透過遠端更新套用，必須產生新的二進位檔。
4. **把建置重新送給 Apple**，然後在你的版本中選取它。

如果你的 App 有多語系，要注意一個陷阱：語言檔是翻譯某個鍵，而不是宣告它。這個鍵必須先存在於 `ios.infoPlist`（或相關外掛的設定）中。否則 App 可能在第一次呼叫時就當掉。

## 如果 App 沒用到這項資料，該寫什麼說明？

Apple 要求說明要正確、有用且具體。如果你的 App 真的會用到這項資料，就用一句話說明用途：「App 使用相機掃描你票券上的條碼。」

如果這個鍵只是因為某個函式庫才需要，Apple 給了兩種解法：寫上說明，或移除存取該資料的程式碼。當程式碼來自函式庫時，你沒辦法輕易移除。所以在 Solys 上，我就照實寫：「Solys 不會存取你的照片，也從不請求這項權限。」這是務實的選擇：下一個建置在交付時順利通過，但我沒辦法保證 Apple 永遠都會接受這句話。

## 送出前找出缺少的鍵

在專案根目錄執行這個指令，會列出 iOS 程式碼中參照了最受關注 API 的函式庫檔案：

```bash
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 退件](https://devoria.fr/zh-hant/expertise/app-rejected-by-apple)頁面，最常見的原因則整理在 [Apple 為什麼退件你的 App](https://devoria.fr/zh-hant/blog/apple-app-rejection-reasons-real-cases)。

想在送出前檢查你的資料，[Apple Review Kit](https://devoria.fr/zh-hant/kits/review-apple) 收錄了我的檢查清單，以及會幫你審視專案的 Claude Code skills。如果送審卡住、想要有人幫你看，[跟我預約一小時](https://devoria.fr/zh-hant/coaching)：我們用視訊在你的螢幕上一起檢查專案。如果你正在準備第一次上架，[做一下免費診斷](https://devoria.fr/zh-hant/diagnostic)：它會幫你把步驟排好順序，並寄給你我的 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 的名稱。


## 你的專案

[Apple Review Kit](https://devoria.fr/zh-hant/kits/review-apple)：我使用的 App Store 審核檢查清單、我被 Apple 退件後的修正、給審核人員的備註，以及兩個審閱你 App 的 Claude Code skills。29 €。

[iOS Kit](https://devoria.fr/zh-hant/kits/ios)：用 Claude Code 打造你的 iPhone App：我的 App 所用的 Starter Code、檢查成果的 skills，以及 Apple Review Kit、App Store Screenshots Kit 與 ASO Kit。129.99 €。
