Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

expo-plist-audit

Expo (managed workflow) の config plugin が生成する iOS の Info.plist / entitlements と Android の権限を、 ビルド前に検査するツール。「app.json に書いていないのに入っている宣言」 を見つけます。

npx expo prebuild は macOS を必要としますが、これは Windows でも動きます

npx expo-plist-audit

なぜ必要か

App 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-configversionedExpoSDKPackages に含まれるため、 app.jsonplugins に書かなくても config plugin が適用され、 aps-environment entitlement が無条件に書き込まれます。

app.json を grep しても出てきません。生成後の結果を見る必要があります。

使い方

# カレントディレクトリの Expo プロジェクトを検査
npx expo-plist-audit

# 別のディレクトリを検査
npx expo-plist-audit --project ../my-app

# introspect の生の JSON を出す
npx expo-plist-audit --json > introspect.json

出力例

expo-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 --json

introspect は 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 を消したい場合

プッシュ通知を使わずローカル通知だけなら 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

About

Audit the iOS Info.plist / entitlements and Android permissions that Expo config plugins generate, before you submit. Catches background modes you declare but never use (App Store Guideline 2.5.4). Works on Windows.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages