# ITMS-90683の直し方：Expoで対処

> ITMS-90683はInfo.plistの用途説明不足です。Expoではios.infoPlistにキーを追加して再ビルドします。

元のページ：[ITMS-90683の直し方：Expoで対処](https://devoria.fr/ja/blog/itms-90683-missing-purpose-string-expo)
著者：[Mehdi Azizi](https://devoria.fr/ja/mehdi-azizi)
公開日：2026-10-09
内容の最終更新：2026-10-09


ITMS-90683は、Appleによる自動リジェクトです。ビルドを送信した少し後、人間によるレビューが始まる前にメールで届きます。意味は、アプリが機密性の高いデータにアクセスする理由を説明する一文が、Info.plistファイルに入っていないということです。**修正は2ステップで済みます。メッセージに書かれたキーを`ios.infoPlist`に追加して、ビルドし直すだけです。**

私はミニゲーム付き目覚ましアプリのSolysで、このエラーを受けました。しかもアプリが使ってすらいないデータについてです。この記事では、メッセージの意味、なぜ届くのか、どうすれば防げるのかを説明します。

## ITMS-90683エラーとは？

メッセージのタイトルは「ITMS-90683: Missing purpose string in Info.plist」です。アプリのコードが機密性の高いデータ（写真、カメラ、マイク、位置情報、連絡先）に触れるAPIを参照しているのに、Info.plistに対応する説明キーがない、という内容です。メッセージには、たとえば`NSPhotoLibraryUsageDescription`のようにキーの名前が書かれています。

この説明文は「purpose string」と呼ばれます。iOSが許可を求めるダイアログに表示するテキストです。Appleは[保護されたリソースへのアクセス](https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources)に関するドキュメントで、purpose stringなしでこれらのリソースにアクセスするコードを含むアプリはApp Reviewでリジェクトされると明記しています。

これはレビュアーによるリジェクトではありません。チェックは自動で、ビルドの配信時、審査に入る前に行われます。プライバシーマニフェストの[ITMS-91053](https://devoria.fr/ja/blog/itms-91053-missing-api-declaration-expo)と同じです。そのビルドは除外されるので、新しいビルドを送り直す必要があります。

## アプリがそのデータを使っていないのにリジェクトされる理由

ここが意外なところです。**Appleが解析するのはビルドに含まれるコードであって、アプリが実際に何をするかではありません。**組み込んだライブラリがフォトライブラリを参照していれば、写真へのアクセスを求める画面が一つもなくても、キーは必須になります。Appleのメッセージ自体にも、外部のライブラリやSDKがこれらのAPIを参照している場合でもpurpose stringは必須だと書かれています。

私のケースは2026年9月26日です。Solysの設定を整理したとき、アプリは写真を一切扱わないので`NSPhotoLibraryUsageDescription`キーを削除しました。次のビルドはITMS-90683でリジェクトされました。原因は、アプリが使っているExpoのライブラリ2つ、`expo-image`と`expo-file-system`に、フォトライブラリを参照するコードが含まれていたことです。前のビルドが通っていたのは、まだキーが残っていたからでした。

**教訓**：説明キーは「使っていないから」という理由で消してはいけません。消してよいのは、ビルド内のどのライブラリもそのAPIを参照しなくなったときだけです。

## よく出てくるキー

- `NSPhotoLibraryUsageDescription`：写真の読み取りまたは書き込み。
- `NSPhotoLibraryAddUsageDescription`：写真の追加のみ（読み取りなし）。
- `NSCameraUsageDescription`：カメラ。
- `NSMicrophoneUsageDescription`：マイク。
- `NSLocationWhenInUseUsageDescription`：使用中の位置情報。
- `NSContactsUsageDescription`：連絡先。
- `NSUserTrackingUsageDescription`：広告トラッキング（[App Tracking Transparency](https://devoria.fr/ja/blog/guideline-5-1-2-third-party-ai-att-data-sharing)）。

Appleはキーごとにドキュメントを用意しています。たとえば[NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription)のページでは、フォトライブラリを読み書きするAPIをアプリが使う時点で必須だと説明されています。

## ExpoアプリでITMS-90683を直す

1. **Appleのメールに書かれたキーを確認します。**メッセージに正確な名前が載っています。
2. **設定に追加します。**[Expoの権限に関するドキュメント](https://docs.expo.dev/guides/permissions/)のとおり、`ios.infoPlist`の下に書きます。

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solysはあなたの写真にアクセスしません。この許可が求められることはありません。"
      }
    }
  }
}
```

3. **ビルドし直します。**Expoのドキュメントにもあるとおり、Info.plistの変更はリモートアップデートでは反映されず、新しいバイナリが必要です。
4. **ビルドをAppleに送り直し**、バージョンでそのビルドを選択します。

アプリを多言語対応している場合の落とし穴があります。言語ファイルはキーを翻訳するだけで、キーを宣言するわけではありません。キーはまず`ios.infoPlist`（または該当するプラグインの設定）に存在している必要があります。そうでないと、最初の呼び出しでアプリがクラッシュすることがあります。

## アプリがデータを使っていない場合、どんな文を書けばいい？

Appleは正確で、役に立ち、具体的な説明を求めています。アプリが本当にそのデータを使うなら、何に使うのかを一文で書きます。たとえば「チケットのバーコードを読み取るためにカメラを使用します。」です。

ライブラリのせいでキーが必要なだけなら、Appleが示す対処は2つです。説明文を書くか、データにアクセスするコードを取り除くかです。そのコードがライブラリ由来なら、簡単には取り除けません。そこで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のリジェクトを受けるとビルド1回分と作り直す時間を失います。

## 余計なトラブルなくビルドを送信する

ITMS-90683は、読み方さえわかればすぐ直せます。Xcodeのバージョンに関するITMS-90725も同じです。その後に来るレビュアーによるリジェクトは、もう少し冷静な対応が必要です。進め方は[Appleにアプリをリジェクトされたとき](https://devoria.fr/ja/expertise/app-rejected-by-apple)のページに、よくある理由は[Appleがアプリをリジェクトする理由](https://devoria.fr/ja/blog/apple-app-rejection-reasons-fixes)にまとめています。

送信前に準備をチェックしたいなら、[Apple Review Kit](https://devoria.fr/ja/kits/review-apple)に私のチェックリストと、プロジェクトを見直すClaude Codeのスキルをまとめています。送信で行き詰まって人の目で見てほしいときは、[私と1時間のセッションを予約してください](https://devoria.fr/ja/coaching)。ビデオ通話で、あなたの画面を見ながらプロジェクトを一緒に確認します。初めてのリリースを準備しているなら、[無料の診断を受けてください](https://devoria.fr/ja/diagnostic)。やるべきステップを順番に整理し、Appleのリジェクト対策チェックリストをお送りします。

## よくある質問

### ITMS-90683はApp Reviewによるリジェクトですか？

人間のレビュアーによるもの、という意味では違います。アイコンのITMS-90717と同じく、ビルドの配信時、審査前に行われる自動チェックです。誰もアプリを開いていません。ビルドは除外されるので、Info.plistを修正して新しいビルドを送る必要があります。

### アプリが使っていないデータのキーをAppleが求めるのはなぜですか？

Appleが解析するのはビルドに含まれるコードで、アプリの動作ではないからです。組み込んだライブラリがフォトライブラリやカメラを参照していれば、アクセスを求める画面が一つもなくても説明キーが必須になります。

### ITMS-90683はリモートアップデートで直せますか？

いいえ。足りないキーはバイナリの一部であるInfo.plistにあります。リモートアップデートではこのファイルは変更されないため、ビルドし直してAppleに送り直す必要があります。

### ExpoプロジェクトではNSPhotoLibraryUsageDescriptionをどこに追加しますか？

アプリの設定の`ios.infoPlist`の下に、用途を説明する一文と一緒に追加します。ライブラリによってはプラグインに専用の設定があり、バックグラウンドモードなど別のキーを追加することもあります。どちらの場合も、キーは翻訳ファイルだけでなく基本設定に存在している必要があります。

### 使っていない説明キーは削除すべきですか？

ビルド内のどのライブラリも該当APIを参照していない場合に限ります。そうでなければ、次の送信はITMS-90683でリジェクトされます。キーを削除する前に、依存ライブラリのiOSコードでAPI名を検索してください。


## あなたのプロジェクト

[Apple Review Kit](https://devoria.fr/ja/kits/review-apple)：僕が使っているApp Store審査チェックリスト、修正済みのリジェクト事例、審査担当者へのメモ、アプリを確認する2つのClaude Codeスキル。29 €。

[iOS Kit](https://devoria.fr/ja/kits/ios)：Claude CodeでiPhoneアプリを作りましょう。僕のアプリのStarter Code、作業を確認するスキル、Apple Review Kit、App Store Screenshots Kit、ASO Kit付き。129,99 €。
