Expo (managed workflow) の config plugin が生成する iOS の Info.plist / entitlements と Android の権限を、
ビルド前に検査するツール。「app.json に書いていないのに入っている宣言」 を見つけます。
npx expo prebuild は macOS を必要としますが、これは Windows でも動きます。
npx expo-plist-auditApp Store Review Guideline 2.5.4 は、実際に使っていない background mode を宣言しているだけで リジェクト理由になります。
2.5.4 Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc. — App Store Review Guidelines
やっかいなのは、その宣言を書いた覚えがないことがあるという点です。
expo-audioの config plugin はenableBackgroundPlaybackの 既定値がtrue。"plugins": ["expo-audio"]と 1 行書くだけでUIBackgroundModes: ["audio"]が入ります。 効果音を前面で 1 回鳴らすだけのアプリでも入ります。expo-notificationsは@expo/prebuild-configのversionedExpoSDKPackagesに含まれるため、app.jsonのpluginsに書かなくても config plugin が適用され、aps-environmententitlement が無条件に書き込まれます。
app.json を grep しても出てきません。生成後の結果を見る必要があります。
# カレントディレクトリの Expo プロジェクトを検査
npx expo-plist-audit
# 別のディレクトリを検査
npx expo-plist-audit --project ../my-app
# introspect の生の JSON を出す
npx expo-plist-audit --json > introspect.jsonexpo-plist-audit — MyApp / SDK 56.0.0
ios.infoPlist.UIBackgroundModes = ["audio"]
ios.entitlements = {"aps-environment":"development"}
ios.infoPlist.NS*UsageDescription = NSMicrophoneUsageDescription
android.permissions = 4 件
2 件、実装と一致しているか確認してください
▲ UIBackgroundModes: "audio"
App Store Review Guideline 2.5.4
なぜ入るか: expo-audio の config plugin は enableBackgroundPlayback の既定値が true で、
オプション無しで "expo-audio" と書くだけで audio が入る
確認: アプリが画面を閉じた状態で音を鳴らし続けるか? 効果音を前面で鳴らすだけなら不要
消し方: ["expo-audio", { "enableBackgroundPlayback": false, "enableBackgroundRecording": false }]
| コード | 意味 |
|---|---|
0 |
指摘なし |
1 |
要確認の項目あり(CI で落としたい場合に使える) |
2 |
実行エラー(Expo プロジェクトではない等) |
1 は「間違っている」という意味ではありません。 実際にその機能を使っているなら正しい宣言です。
このツールは「実装と宣言が一致しているか、人間が確認すべき箇所」を挙げるだけです。
| 対象 | 内容 |
|---|---|
ios.infoPlist.UIBackgroundModes |
audio / location / remote-notification / voip など。既知の混入源があるものは理由も表示 |
ios.entitlements |
aps-environment / HealthKit / Associated Domains など |
ios.infoPlist.NS*UsageDescription |
権限文言。config plugin の既定文言のままのものを警告 |
android.permissions |
RECORD_AUDIO / FOREGROUND_SERVICE* / ACCESS_BACKGROUND_LOCATION など |
内部でやっているのはこれだけです。
expo config --type introspect --jsonintrospect は config plugin の mod チェーンを実際に評価した結果を返します。
prebuild と違ってネイティブプロジェクトを生成しないので、macOS もXcodeも不要です。
このツールはその出力を読んで、混入しやすい項目に注釈を付けているだけです。
プロジェクトに expo が入っていればそれを直接使い、無ければ npx --yes expo にフォールバックします。
node_modules がインストール済みである必要があります。 introspect は config plugin の実体を
読み込んで評価するため、npm install 前のプロジェクトでは plugin を解決できません。
- Node.js 18 以上
- Expo SDK 50 以降で動作確認(開発時の検証環境: SDK 56 / Windows 11)
- 依存パッケージなし
プッシュ通知を使わずローカル通知だけなら aps-environment は不要です。
Push Notifications capability を App ID に足す方向で直すと、
「使っていない機能を宣言する」ことになり 2.5.4 と同じ穴を踏みます。消す側で直します。
// plugins/with-no-aps-environment.js
const { withEntitlementsPlist } = require('expo/config-plugins');
module.exports = function withNoApsEnvironment(config) {
return withEntitlementsPlist(config, (cfg) => {
delete cfg.modResults['aps-environment'];
return cfg;
});
};"plugins": ["...", "./plugins/with-no-aps-environment"]mod は登録順に評価されるので、plugins 配列の末尾に置きます。
MIT