mcpField
P
push-notification-best-practices

push-notification-best-practices

github.com/clix-so開発5201 回インストール33 週間前に更新
リポジトリ

push-notification-best-practices について

iOS、Android、React Native、Expo、Flutterを扱うモバイルアプリ開発者向けのプッシュ通知ガイドです。プラットフォーム別の設定、トークン管理、メッセージ処理、ディープリンクを整理し、問題別に参照できるルールを備えています。

主な機能

  1. 015種類のモバイルプラットフォームに対応
  2. 02プラットフォーム別の設定チェックリスト
  3. 03トークン登録と更新の指針
  4. 04ペイロードとバックグラウンド処理の指針
  5. 05ディープリンクのトラブルシューティング

活用シーン

  1. 01モバイルアプリの通知設定
  2. 02通知が届かない・表示されない問題の調査
  3. 03バックグラウンドメッセージ処理の実装
  4. 04トークン管理やディープリンクの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/clix-so/skills --skill push-notification-best-practices

インストール後、Claude Code で/push-notification-best-practicesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

AGENTS.md
LICENSE.txt
metadata.json
rules/
_sections.md
android-google-services.md
android-messaging-service.md
android-notification-channel.md
android-notification-icon.md
android-permission.md
android-priority-high.md
deeplink-navigation-conflict.md
deeplink-terminated-state.md
infra-backup-fid.md
infra-firewall-ports.md
infra-rate-limiting.md
ios-apns-auth-key.md
ios-delegate-setup.md
ios-extension-build.md
ios-foreground-display.md
ios-method-swizzling.md
ios-permission-request.md
ios-token-registration.md
message-background-handler.md
message-data-vs-notification.md
message-foreground-handler.md
permission-timing.md
testing-debugging.md
token-invalidation.md
token-refresh.md
token-registration.md

詳細

プッシュ通知のベストプラクティス

概要

モバイルアプリケーションでプッシュ通知を実装し、トラブルシューティングするための包括的なガイドです。iOS(APNS)、Android(FCM)、React Native、Expo、Flutter の各プラットフォームを対象に、プラットフォーム固有の設定、トークン管理、メッセージ処理、ディープリンクのパターンについて説明します。

プラットフォームのサポート一覧

プラットフォームオフラインプッシュ通知バータップ時のナビゲーションアプリ内トーストバックグラウンドハンドラー
iOSAPNSシステムディープリンクカスタムdata-only payload
AndroidFCMシステムIntentカスタムdata-only payload
React NativeAPNS/FCMシステムReact NavigationカスタムsetBackgroundMessageHandler
ExpoExpo PushシステムLinkingカスタムTaskManager
FlutterAPNS/FCMシステムNavigatorカスタムonBackgroundMessage

判断フローチャート

権限をリクエストするタイミング

通知の権限はいつリクエストすべきですか?

User installing app
        |
        v
  [First launch?] ──Yes──> [Show value proposition first]
        |                          |
        No                         v
        |                  [User action triggers need?]
        v                          |
  [Already granted?]              Yes
        |                          |
       Yes                         v
        |                  [Request permission] ──> 70-80% acceptance rate
        v
  [Notifications ready]
タイミング許可率用途
即時(アプリ起動時)15-20%エンゲージメントの低いアプリ
オンボーディング後40-50%一般的なアプリ
ユーザーが操作を開始したとき70-80%エンゲージメントの高いアプリ

推奨: 利用価値を説明した後、または関連機能をユーザーが有効にしたときにリクエストしてください。

サイレント通知と表示通知

どのペイロードタイプを使用すべきですか?

[What's the purpose?]
        |
        +──> Time-sensitive user alert ──> Visible (notification payload)
        |
        +──> Background data sync ──> Silent (data-only payload)
        |
        +──> Custom UI required ──> Silent (data-only payload)
        |
        +──> Need background processing ──> Silent (data-only payload)
シナリオペイロードタイプ理由
新着メッセージの通知表示ユーザーにすぐ確認してもらう必要があります
注文状況の更新表示時間的制約のある情報です
バックグラウンド同期サイレントユーザーの操作を妨げる必要がありません
カスタム通知 UIサイレント表示を完全に制御できます
バッジ数の更新サイレントバックグラウンド処理が必要です
拡張機能の選択(iOS)

Notification Service Extension を使う場合

  • 表示前に通知内容を変更する必要がある
  • メディア(画像、動画)をダウンロードして添付する必要がある
  • エンドツーエンドで暗号化されたペイロードを復号する必要がある
  • アクションボタンを動的に追加する必要がある

Notification Content Extension を使う場合

  • システムテンプレートを超えるカスタム通知 UI が必要
  • 展開時のビューにインタラクティブな要素が必要

アンチパターン(絶対に避けること)

権限の処理
絶対に避けること理由代わりに
理由を説明せずに初回起動時に権限をリクエストする許可率は15-20%ですまず利用価値を説明してからリクエストする
ユーザーが拒否した後に再度リクエストするシステムは繰り返しのリクエストを無視します設定画面への誘導を表示する
暫定的な許可を無視するiOS 12以降のサイレント配信を利用できません.provisional オプションを使用する
トークン管理
絶対に避けること理由代わりに
トークンを長期間キャッシュする再インストールや復元時にトークンが変わることがありますコールバックから取得した最新のトークンを必ず使用する
トークンの形式を決めつける形式はプラットフォームや SDK によって異なります不透明な文字列として扱う
ユーザーとの関連付けなしにトークンを送信する通知の送信先を指定できませんバックエンドで userId と関連付ける
デバイス ID なしでトークンを保存するユーザーごとにトークンが重複します一意のキーとして deviceId を使用する
メッセージの処理
絶対に避けること理由代わりに
バックグラウンド処理に notification ペイロードを使用するバックグラウンドでは onMessageReceived が呼び出されませんdata-only payload を使用する
時間厳守の配信をサイレント通知に頼る配信は保証されません表示通知を使用する
バックグラウンドハンドラーで重い処理を実行するシステムは約30秒後にアプリを終了します処理をキューに入れ、すばやく実行する
両方のペイロードタイプを処理するのを忘れる通知を受け取れなくなりますnotification と data の両方のペイロードを処理する
iOS 固有
禁止事項理由代わりに
デリゲートの設定前に通知を登録するデリゲートメソッドが呼び出されませんregisterForRemoteNotifications() の前にデリゲートを設定します
serviceExtensionTimeWillExpire() の実装を省略するコンテンツの変更に失敗します必ずフォールバックを実装します
.p12 証明書を使用する毎年期限切れになり、非推奨です.p8 認証キーを使用します
Android 固有
禁止事項理由代わりに
NotificationChannel の作成を省略するAndroid 8.0 以降では通知が表示されませんアプリの起動時にチャンネルを作成します
バックグラウンドハンドラーで優先度 normal を使用するDoze モードによって配信がブロックされます優先度 high を使用します
色付きの通知アイコンを使用するAndroid は色を無視し、白い四角形で表示します白色で透明背景のアイコンを使用します

スキルの形式

各ルールファイルは、すばやい参照と深い理解に適したハイブリッド形式に従っています。

  • クイックパターン:すぐにパターンを照合できる、誤ったコードと正しいコードのスニペット
  • 適用する場面:このルールが関係する状況
  • 詳細解説:手順ごとのガイドとプラットフォーム固有の詳細を含む、完全な背景情報
  • よくある落とし穴:よくあるミスとその回避方法
  • 関連ルール:関連するパターンへの相互参照

影響度:CRITICAL(すぐに修正)、HIGH(大幅な改善)、MEDIUM(有益な最適化)

適用する場面

次のような場合に、これらのガイドラインを参照してください。

  • モバイルアプリでプッシュ通知を設定するとき
  • プッシュ通知の配信問題をデバッグするとき
  • バックグラウンド通知ハンドラーを実装するとき
  • ディープリンクをプッシュ通知と統合するとき
  • プッシュトークンとデバイス登録を管理するとき
  • プラットフォーム固有のプッシュ通知の問題をトラブルシューティングするとき
  • 信頼性を確保するためにプッシュ通知コードをレビューするとき

優先度順のガイドライン

優先度カテゴリー影響度プレフィックス
1iOS の設定CRITICALios-
2Android の設定CRITICALandroid-
3トークン管理HIGHtoken-
4メッセージ処理HIGHmessage-
5ディープリンクMEDIUMdeeplink-
6インフラストラクチャMEDIUMinfra-

クイックリファレンス

重大:iOS の設定

設定チェックリスト:

  • Apple Developer で APNs 認証キー(.p8)を生成します
  • キー ID とチーム ID を指定して Firebase Console にアップロードします
  • Xcode で Push Notifications 機能を有効にします
  • didFinishLaunchingWithOptions で UNUserNotificationCenter デリゲートを設定します
  • 登録前に通知の許可をリクエストします
  • フォアグラウンド表示オプションを実装します
重大:Android の設定

設定チェックリスト:

  • google-services.json を app/ ディレクトリに追加します
  • google-services Gradle プラグインを適用します
  • NotificationChannel を作成します(Android 8.0 以降)
  • POST_NOTIFICATIONS 権限をリクエストします(Android 13 以降)
  • FirebaseMessagingService を実装します
  • 通知アイコンを設定します(透明な背景+白色)
  • Doze モードとの互換性のために優先度 'high' を使用します
高:トークン管理

トークンのライフサイクル:

// 1. Register token with server
const token = await getToken();
await registerToken(token, userId);

// 2. Handle token refresh
onTokenRefresh((newToken) => {
  updateTokenOnServer(newToken, userId);
});

// 3. Handle invalidation
if (error.code === 'DeviceNotRegistered') {
  deleteTokenFromDatabase(token);
}
高:メッセージ処理

ペイロードの種類:

  • データのみ:バックグラウンドハンドラーが両方のプラットフォームで実行されます
  • 通知+データ:iOS と Android では動作が異なります
    • iOS:常に通知を表示します
    • Android:バックグラウンド=システムトレイ、フォアグラウンド=onMessageReceived

優先度の設定:

  • 時間的制約のある通知には priority: 'high' を使用します
  • Android の Doze モードでバックグラウンドハンドラーを実行するには必須です

ルール

コード例を含むドキュメント全文は rules/ にあります。

iOS のセットアップ(ios-*)
ファイル影響度説明
ios-apns-auth-key.mdCRITICALAPNs 認証キーのセットアップ
ios-delegate-setup.mdCRITICALUNUserNotificationCenter デリゲートの設定
ios-permission-request.mdCRITICAL通知権限のリクエストフロー
ios-token-registration.mdHIGHAPNS トークンの登録と処理
ios-foreground-display.mdHIGHフォアグラウンドでの通知表示
ios-method-swizzling.mdMEDIUMMethod Swizzling の管理
ios-extension-build.mdMEDIUMNotification Service Extension のセットアップ
Android のセットアップ(android-*)
ファイル影響度説明
android-notification-channel.mdCRITICAL通知チャンネルの作成(Android 8.0 以降)
android-permission.mdCRITICALPOST_NOTIFICATIONS ランタイム権限(Android 13 以降)
android-google-services.mdCRITICALFirebase プロジェクトの設定
android-messaging-service.mdHIGHFirebaseMessagingService の実装
android-notification-icon.mdMEDIUM通知アイコンのアセット要件
android-priority-high.mdHIGHDoze モード用の優先度 high
トークン管理(token-*)
ファイル影響度説明
token-registration.mdHIGHバックエンドへのトークン登録
token-refresh.mdHIGHトークンの更新処理
token-invalidation.mdMEDIUMDeviceNotRegistered エラーの処理
メッセージ処理(message-*)
ファイル影響度説明
message-data-vs-notification.mdCRITICALdata と notification ペイロードの違い
message-background-handler.mdHIGHバックグラウンドでのメッセージ処理
message-foreground-handler.mdHIGHフォアグラウンドでの通知表示
ディープリンク(deeplink-*)
ファイル影響度説明
deeplink-navigation-conflict.mdMEDIUMReact Navigation との競合解決
deeplink-terminated-state.mdMEDIUMアプリ終了時のディープリンク処理
インフラストラクチャ(infra-*)
ファイル影響度説明
infra-firewall-ports.mdMEDIUMネットワークファイアウォールの設定
infra-backup-fid.mdMEDIUMFirebase Installation ID のバックアップ除外
infra-rate-limiting.mdMEDIUMプッシュ通知のレート制限
ベストプラクティス
ファイル影響度説明
permission-timing.mdHIGH権限リクエストのタイミング最適化(承認率 70~80%)
testing-debugging.mdHIGHテストツール、デバッグ手法、ペイロードの検証

検索ルール

# Find rules by keyword
grep -l "apns" rules/
grep -l "fcm" rules/
grep -l "token" rules/
grep -l "background" rules/
grep -l "permission" rules/
grep -l "deeplink" rules/

問題 → ルールの対応表

問題まず確認する項目
iOS でプッシュ通知を受信できないios-apns-auth-key → ios-delegate-setup
Android でプッシュ通知を受信できないandroid-google-services → android-notification-channel
バックグラウンドでプッシュ通知が動作しないandroid-priority-high → message-background-handler
フォアグラウンドでプッシュ通知が表示されないios-foreground-display または message-foreground-handler
トークンがない、または期限切れtoken-registration → token-refresh
ディープリンクの競合エラーdeeplink-navigation-conflict
通知アイコンが壊れている(Android)android-notification-icon
社内ネットワークで失敗するinfra-firewall-ports
バックグラウンドハンドラーが呼び出されない(Android)android-priority-high → message-data-vs-notification
userNotificationCenter が呼び出されない(iOS)ios-delegate-setup
バックアップ復元後に 404 エラーが発生するinfra-backup-fid
送信に失敗する(429 エラー)infra-rate-limiting
権限の承認率が低いpermission-timing → ios-permission-request
プッシュ通知のデバッグ方法、テスト方法testing-debugging
ローカルでテストできないtesting-debugging → ios-apns-auth-key

プラットフォーム固有の注意事項

iOS(APNS)
  • Apple Developer アカウントと APNs 認証キー(.p8)が必要です
  • Development ビルドと Production ビルドでは動作が異なります
  • 他の SDK の初期化より前にデリゲートを設定する必要があります
  • メソッドスウィズリングがデリゲート呼び出しに干渉する場合があります
Android(FCM)
  • Firebase Console から取得した google-services.json が必要です
  • Android 8.0 以降では NotificationChannel が必要です
  • Android 13 以降では実行時の権限が必要です
  • Doze モードでは、バックグラウンドハンドラーに priority: 'high' が必要です
  • 通知アイコンは単色(透明背景に白色)にする必要があります
React Native
  • よくある問題:フォアグラウンド通知には gcm.message_id が必要です
  • ディープリンクが React Navigation と競合します
  • 終了状態ではネイティブから JS へのブリッジパターンが必要です
Expo
  • ExpoPushToken の形式:ExponentPushToken[...]
  • レート制限:プロジェクトあたり毎秒 600 件のプッシュ通知
  • SDK 53 以降では Development ビルドが必要です
  • APNs キーの管理には eas credentials を使用します

コンパイル済みドキュメント全文

すべてのルールを詳しく記載した完全版ガイド:AGENTS.md

クレジット

プッシュ通知のトラブルシューティングガイドと Firebase Cloud Messaging の公式ドキュメントに基づいています。

コメント