Guideline 2.5.4 バックグラウンドモード却下
著者:Mehdi Azizi
公開・9 分
使う機能がないバックグラウンドモードを宣言するとリジェクトされます。キーを削除するか、その機能を審査員に見せましょう。
Guideline 2.5.4 は、バックグラウンドモードを本来の用途に限定するルールです。対象はサウンド、位置情報、VoIP 通話、タスクの完了、ローカル通知です。Info.plist でこれらのモードのどれかを宣言しているのに、それを必要とする機能を審査員が見つけられないとリジェクトされます。何も使っていないならキーを削除し、使っているなら審査員が30秒で確認できるように機能を見せましょう。
僕は自分の iOS アプリを Expo で公開しています。ミニゲーム付き目覚ましアプリの Solys は audio モードを宣言しています。一度削除して、別の理由でまた戻しました。このガイドは、Apple の公式文書、ほかの開発者が公開したリジェクト事例、そして僕自身のプロジェクトをもとにしています。リジェクト理由の全体像は Apple がアプリをリジェクトする理由 をご覧ください。
Guideline 2.5.4 には何が書かれている?
ルールは1文だけです。App Review Guidelines のセクション2「Performance」、2.5「Software Requirements」にあります。「Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.」
つまり、バックグラウンドサービスは本来の目的のためだけに使えるということです。だからリジェクトのタイトルは「Guideline 2.5.4 - Performance - Software Requirements」になります。
デフォルトでは、バックグラウンドに移ったアプリは一時停止されます。動き続けるには、Info.plist の UIBackgroundModes キーに1つ以上のモードを宣言する必要があります。Apple のバックグラウンドモードに関するドキュメント は、バッテリーへの影響があるので控えめに使い、別の方法があればそちらを選ぶよう求めています。宣言したモードは1つ1つが、審査員が確認できる約束です。
バックグラウンドモードと本来の用途
| モード | キー | 本来の用途 |
|---|---|---|
| Audio、AirPlay、PiP | audio | バックグラウンドで聞こえる音 |
| 位置情報 | location | 継続的な位置取得 |
| Voice over IP | voip | CallKit を使った通話 |
| バックグラウンド取得 | fetch | 定期的なネットワーク取得 |
| バックグラウンド処理 | processing | スケジュールされたタスク |
| リモート通知 | remote-notification | 新しいコンテンツのプッシュ |
この表は Apple のページの要約です。フォーラムで公開されたリジェクト事例では、audio、location、voip が特によく出てきます。
リジェクトメッセージ 2.5.4 の意味は?
メッセージには問題のモードが書かれています。Apple のフォーラムで開発者が公開した例を2つ紹介します。
- Audio:「Your app still declares support for audio in the UIBackgroundModes key in your Info.plist but did not include features that require persistent audio.」続けて、
audioキーは音楽プレーヤーのようにバックグラウンドでコンテンツを聞かせるアプリのためのものだと説明しています。そのうえで、そのコンテンツを追加するか、キーを削除するかの2択を提示しています(フォーラムのスレッド)。 - 位置情報:2024年12月のスレッド では、従業員の追跡以外に常時位置情報を必要とする機能が見つからず、その用途だけでは適切ではないと Apple が書いています。
僕の解釈はこうです。審査員はコードを読むのではなく、機能を探しています。 機能を起動し、アプリをバックグラウンドに移して、動き続けることを確認できなければいけません。
逆のケースもあります。2026年5月のスレッド では、本当に audio モードを使っていた読み上げアプリが何度もリジェクトされました。審査員が音を鳴らせなかったのが原因です。別の開発者は、動画を添付したことで自分のケースは通ったと思う、と書いています。これは体験談であって、Apple のルールではありません。
自分で追加していないキーはどこから来る?
Expo では、prebuild のときに config plugin が Info.plist を書き込みます。つまり、自分で決めていないバックグラウンドモードがバイナリに入ることがあります。
デフォルト設定の expo-audio プラグイン
expo-audio のドキュメント にこう書かれています。enableBackgroundPlayback オプションはデフォルトで true で、iOS では audio モードを追加します。つまり、プラグインを短い形式 "expo-audio" で宣言するだけで、モードが宣言されてしまいます。
TradaZen の初回申請前に見直したとき、まさにこれを見つけました。フォアグラウンドで短い UI 効果音を鳴らすだけなのに、プラグインは短い形式で宣言していました。修正は app.json だけで済みます。
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
ほかのパッケージも独自の方法でモードを追加します。expo-location の isIosBackgroundLocationEnabled オプションは、有効にしたときだけ location を追加します。一方 expo-background-task は、インストールした時点で prebuild 時に processing を追加します。
古いキーが残る ios/ フォルダ
2つ目の落とし穴は、2026年7月に Solys で経験しました。app.json から audio を削除したのに、以前に生成された ios/Solys/Info.plist にキーが残っていました。--clean なしの prebuild はプロジェクトを作り直さずに変更するだけで、プラグインはキーを追加しても削除はしません。ローカルビルドならキーが入っていたはずです。EAS のクラウドビルドは、ios/ が git で無視されていれば新しい prebuild から始まります。僕の場合はそうでした。
ビルド前には毎回、実際に何が出ていくかを確認しています。
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
1つ目は、prebuild が Info.plist に書き込むモードを一覧表示します。2つ目は、ios/ フォルダを消してネイティブプロジェクトをローカルビルド用に作り直します。Solys では1つ目が "UIBackgroundModes":["audio"] を表示し、TradaZen では何も表示しません。どちらも意図どおりです。
モードの追加や削除は Info.plist、つまりバイナリを変更します。新しいビルドが必要で、リモートアップデートでは足りません。 EAS Update のドキュメント でも、こうした変更は新しいバイナリが必要なものに分類されています。ITMS-90683 と同じです。
Solys:本当の理由がある audio モード
Solys は目覚ましアプリですが、audio モードはアラームを鳴らすためのものではありません。アラーム音は AlarmKit で鳴らしています。 iOS 26 から使える Apple のアラームサービスです(AlarmKit のドキュメント)。鳴らすのはアプリではなくシステムで、マナーモードでも鳴ります。
キーの経緯を紹介します。1行の設定より、その背景の考え方のほうが大事だからです。
- 2026年7月末、削除しました。 バックグラウンドで音を鳴らすものは何もありませんでした。ミニゲームの効果音はフォアグラウンドだけで、アラームはアプリに依存しません。
- 2日後、夜間の録音機能のために戻しました。 このオプションは、夜の間の音をマイクで録音し、iPhone 上で分析します。画面ロック中も録音を続ける必要があります。expo-audio のドキュメントによれば、バックグラウンド録音のオプションも
audioモードを追加します。
正当化の中身が変わりました。このモードは再生ではなく録音のためのものです。 アプリ内で確認できる安全策が3つあります。
- 録音はデフォルトでオフのオプションで、設定画面か夜のルーティンから有効にします。
- すべての録音に求められる ルール 2.5.14 どおり、専用の同意画面があります。データは端末から一切出ません。
- 録音とアラームがぶつからないよう、マイクはアラームの10分前に閉じます。
審査員がこの宣言を必ず受け入れてくれるとは保証できません。ただ、それぞれの要素が何のためにあり、どこで確認できるかは説明できます。
アプリを起こしたままにしていた目覚ましアプリ
AlarmKit 以前は、サードパーティの目覚ましアプリが Apple のアラームのように鳴ることはできませんでした。そのため、アプリを起こしたままにするライブラリもありました。Flutter パッケージ alarm2 のドキュメントには、アラームまで無音のオーディオプレーヤーを動かし続ける方法が書かれています。でも、無音の音は何も聞こえません。iOS 26 以降は、AlarmKit のおかげでこの回り道は不要です。
モードを残すか削除するか:判断表
| 状況 | どうするか |
|---|---|
| フォアグラウンドの短い効果音 | audio を削除 |
| 音楽やオーディオブック | 残して、機能を見せる |
| 長時間の録音 | 残す+同意を取る |
| 目覚ましやタイマー | AlarmKit(iOS 26) |
| ときどき位置情報を使う | 大幅な位置変更の監視 |
| 急ぎではない同期 | fetch または processing |
| 音声通話やビデオ通話 | CallKit と voip |
位置情報について、Apple のページは location モードの代わりに大幅な位置変更の監視サービスを挙げています。
2.5 のほかの項目:2.5.1 と 2.5.2
2.5.1:公開 API と、用途どおりのフレームワーク
「Apps may only use public APIs and must run on the currently shipping OS.」アプリは公開 API だけを使い、現行の OS で動作し、非推奨のものは使わないようにします。2.5.4 と同じく、各フレームワークは本来の用途で使い、説明文にも書きます。ヘルスケアなら HealthKit、スマートホームなら HomeKit です。ライブラリがプライベート API を呼んでいたら、リジェクトされるのはあなたのアプリです。
2.5.2:アプリを変えるコードをダウンロードしない
アプリはパッケージ内で完結している必要があります。「download, install, or execute code which introduces or changes features or functionality of the app」はできません。例外はプログラミングを教える教育アプリだけで、それも限定的です。コードはすべてユーザーが見て編集できる必要があります。
Expo では EAS Update が関係します。ドキュメントでも、アップデートは App Store のルールを守る必要があると書かれています。リモートアップデートは修正のために使い、審査員が見ていない機能を届けるためには絶対に使わないでください。 審査に関わる修正は新しいビルドで出します。詳しくは Guideline 2.1 のガイドで説明しています。
リジェクト 2.5.4 にどう返信する?
やり取りはアプリの App Review セクションで行い、そこで App Review のメッセージに返信 します。ケースは2つです。
- モードを何にも使っていない場合:削除してビルドし直し、introspect で確認してから、2文で返信します。
- モードが本当の機能に使われている場合:正確な操作手順と短い動画を添えて返信し、その文章を毎バージョンの審査メモにも入れます。
僕が使うテンプレートです。状況に合わせて調整してください(アラームがないアプリならアラームの文は削除します)。
Hello,
The "audio" background mode is used only by [feature], an
optional feature that [records / plays] audio while the
device is locked. It is off by default.
How to test:
1. Open [screen] and turn on [feature].
2. Accept the microphone permission if asked.
3. Tap [button], then lock the device.
[What the reviewer will hear or see.]
Our alarm does not use this mode: it is scheduled with
AlarmKit and rings through the system.
Attached: a short screen recording of these steps.
Best regards,
申請前の 2.5.4 チェックリスト
- Expo の introspect に意図したモードだけが表示され、それぞれの機能を説明できる。
- expo-audio のようにデフォルトでモードを追加するプラグインを、短い形式で宣言していない。
- ローカルの
ios/フォルダに古いキーが残っていない、またはクリーンな prebuild からビルドしている。 - 機能が隠れた設定なしですぐ起動でき、審査メモにどのモードが何に使われ、どうテストするかが書いてある。
- 録音はすべて明示的な同意を求め、目に見えるインジケーターを表示している。許可リクエストのルールは Guideline 5.1.1 のガイドにあります。
- 目覚ましアプリなら、アラーム音はアプリから再生する音ではなく AlarmKit で鳴らしている。
申請前に確認する
Review Kit には、申請前のチェックリスト、審査員向けメモのテンプレート、プロジェクトを見直す Claude Code のスキルが入っています。人の目で確認したいなら、僕と1時間のセッションを予約 してください。Apple のメッセージと Info.plist をビデオ通話で一緒に読みます。全体の進め方は Apple にリジェクトされたアプリ のページにあります。
初めてのリリースを準備中ですか? 無料の診断を受けてみてください。手順を正しい順番に並べ、僕の Apple リジェクト対策チェックリストをお送りします。
Apple がアプリを承認すると保証できる人はいません。でも、きちんと正当化されたバックグラウンドモードなら、30秒で説明できます。
よくある質問
「Guideline 2.5.4 - Performance - Software Requirements」とはどういう意味?
Info.plist のバックグラウンドモードが本来の用途で使われていないと Apple が判断したときのリジェクトのタイトルです。メッセージにはモードが書かれていて、それを使う機能を見せるか、キーを削除するよう求められます。
リジェクト 2.5.4 の後は新しいビルドが必要?
モードを削除または変更するなら必要です。キーは Info.plist、つまりバイナリに入っているからです。モードが正当なものなら、正確な操作手順と動画を添えた返信だけで済むこともあります。
いくつかの UI 効果音のために audio モードを残してもいい?
いいえ。フォアグラウンドで鳴らす短い効果音には不要です。Expo では、expo-audio プラグインで enableBackgroundPlayback を false に設定してください。
目覚ましアプリに audio モードは必要?
iOS 26 から使える AlarmKit を使うなら、鳴らすためには不要です。アラームはシステムが鳴らします。Solys では、audio モードは画面ロック中に録音する夜間の録音機能のために使っています。
何も宣言していないのに Apple が 2.5.4 を挙げるのはなぜ?
プラグインが代わりに宣言したのかもしれません。expo-audio はデフォルトで audio モードを追加しますし、古い ios/ フォルダには設定から削除したキーが残っていることがあります。npx expo config --type introspect で確認してください。

