> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# モバイルプッシュ：通知が表示されないまたは遅延する

> OneSignalで「配信済み」と表示されているのにAndroidおよびiOSデバイスに表示されないまたは遅延するモバイルプッシュ通知をトラブルシューティングします。

OneSignalダッシュボードの[プッシュメッセージレポート](./push-notification-message-reports)では：

* **配信済み**は、OneSignalが通知をプッシュサービス（FCM、APNs、またはHMS）に正常に引き渡し、成功レスポンスを受け取ったことを意味します。
* **確認済み**は、デバイス上のOneSignal SDKが通知を受信したことを意味します。

通知が「配信済み」だが「確認済み」でなく、デバイスに表示されなかった場合は、以下の手順から開始してください。

***

## 始める前に

トラブルシューティングに役立てるために、以下の情報を収集してください。正しいサブスクリプションを特定し、配信状態を確認するために必要です。

* [OneSignal App ID](./keys-and-ids)
* 表示されなかった通知の[メッセージID](./push-notification-message-reports)
* 影響を受けたユーザーの[サブスクリプションID](./test-users)

<Note>
  External IDしかない場合は、**Audience > Subscriptions**でDevice Type、Last Session、IPアドレスでフィルタリングしてサブスクリプションを検索してください。
</Note>

***

## デバイス設定

このセクションはすべてのプラットフォームに適用されます。プラットフォーム固有またはコードレベルの原因を調査する前に、まずこれらを確認してください。

### 権限とサブスクリプションの状態

デバイスで：

1. **設定 > 通知**に移動し、アプリの通知設定を開きます。
2. 通知権限が有効になっていることを確認します。
3. 次にアプリを開きます。SDKが初期化されると、サブスクリプションの状態がOneSignalに同期されます。

OneSignalダッシュボードで：

1. **Audience > Subscriptions**に移動します。
2. サブスクリプションIDまたはExternal IDで検索するか、Device Type、Last Session、IPアドレスで並べ替えます。
3. プッシュ状態が**Subscribed**と表示されていることを確認します。未購読と表示されるか表示されない場合、何を送っても通知は届きません。状態が予期しない場合は、下の[トラブルシューティング](#トラブルシューティング)を参照してください。

### おやすみモードと集中モード

AndroidとiOSのおやすみモードと集中モードは、通知を完全に抑制したり、モードが解除されるまで不可視になる方法でグループ化したりすることがあります。

テスト前にこれらのモードを無効にしてください：

* **iOS：** 設定 > 集中モード > おやすみ > オフ
* **Android：** 設定 > 通知 > おやすみモード > オフ

無効にした後にテスト通知を送信します。通知が表示された場合、そのモードが原因でした。

<Note>
  iOSでは、集中モード中に通知が届き、ユーザーがグループ化された通知サマリーをスワイプして消した場合、それらの通知は後から個別に再表示されません。
</Note>

### 低電力モードとバッテリー最適化

**iOS**：テスト前に設定 > バッテリーで低電力モードを無効にします。

**Androidデバイス**：バッテリー設定でアプリを「無制限」または「最適化なし」に設定します。その設定が見つからない場合は、**バッテリー最適化**、**省電力モード**、**節電**、**バックグラウンド使用制限**、または**適応型バッテリー設定**を検索し、アプリに対して無効にします。

### ネットワークと接続

プッシュ通知を受信するには、デバイスがオンラインである必要があります。デバイスがオフ、機内モード、不安定またはインターネット接続がない場合、適切な接続が確立されるまでプッシュは表示されません。FCMとAPNsが接続を待機する期間はTime To Live (TTL)パラメータで設定できます（デフォルトは3日間）。

ファイアウォールやVPNがあるWiFiネットワークに接続しているデバイスは、AppleやGoogleサーバーへの接続がブロックされる場合があります。モバイルデータに切り替えてテストしてください。

ファイアウォールでネットワークトラフィックを管理している場合は、以下を許可するよう設定してください：

* **FCM（Android）：** アウトバウンドTCPポート5228、5229、5230。完全な要件は[FCMドキュメント](https://firebase.google.com/docs/cloud-messaging/concept-options)を参照してください。
* **APNs（iOS）：** アウトバウンドTCPポート5223およびTCPポート443または2197。完全な要件は[Appleのドキュメント](https://support.apple.com/en-us/HT203609)を参照してください。

### 通知グループ化の動作

AndroidとiOSの異なるバージョンには、それぞれの通知グループ化動作があります。通知グループ化とは、同じアプリまたは複数のアプリのいくつかの通知が通知センターにまとめられることです。グループ化された通知がまとめて閉じられることで、ユーザーが個別の通知を見逃すことがよくあります。

***

## Androidの問題

このセクションはAndroidデバイスのみに適用されます。iOSのトラブルシューティングをしている場合は、[iOSの問題](#iosの問題)にスキップしてください。

### Android 強制停止

Androidアプリが強制停止されると、OSはユーザーが手動で再起動するまでプッシュ通知の受信を阻止します。これはAndroidで通知が届かない最も一般的な原因の一つです。

Samsung、Xiaomi、Huaweiなどの一部のメーカーは、ユーザーが最近使用したアプリリストからアプリをスワイプして消した際にアプリを積極的に強制停止しますが、GmailやWhatsAppなどの大手アプリは対象外です。デバイス固有の動作については[dontkillmyapp.com](https://dontkillmyapp.com/)を参照してください。

影響を受けたデバイスでの強制停止の動作を軽減するには、以下の手順を順番に試してください：

1. **バックグラウンドアクティビティを許可**：設定 > アプリ > あなたのアプリ > バッテリー > バックグラウンドアクティビティを許可。
2. **スリープ中のアプリを無効化**：設定 > バッテリーとデバイスケア > バッテリー > バックグラウンド使用制限 > スリープ中のアプリ > このリストからアプリを削除。
3. **最近のアプリでアプリをロック**：アプリを開き、最近のアプリボタンをタップして、アプリウィンドウを長押しし、**このアプリをロック**を選択（一部のSamsungモデルで利用可能）。
4. **自動起動を有効化**（一部のデバイス）：設定 > アプリ > あなたのアプリ > 権限 > 自動起動 > 有効化。
5. **適応型バッテリー最適化を無効化**：設定 > バッテリーとデバイスケア > バッテリー > その他のバッテリー設定 > 適応型バッテリー > オフ（またはアプリを除外）。

アプリが強制停止されているかどうかを確認するには、以下のコマンドを実行します。`com.company.appname`をあなたのパッケージ名に置き換えてください：

```bash theme={null}
adb shell dumpsys package com.company.appname | grep stopped
```

`stopped=false`はアプリが強制停止されていないことを意味します。`stopped=true`は強制停止されていることを意味します。

いくつかの通知を送信して、logcatで以下のエントリを確認することもできます：

```text theme={null}
W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent {
   act=com.google.android.c2dm.intent.RECEIVE pkg=com.onesignal.example (has extras)
}
```

このキャンセルされたインテントが表示された場合、アプリは通知を処理するために起動できませんでした。

<Note>
  FCMは、デバイスがFCMサーバーに最後に接続した時刻を確認するAPIを提供しています。これによりデバイスがそもそも到達可能かどうかを確認できます。詳細は[アプリインスタンス情報に関するGoogleのドキュメント](https://developers.google.com/instance-id/reference/server#get_information_about_app_instances)を参照してください。

  ユーザーが自分で解決できるようにするには、アプリ内メッセージを使用して既知のAndroidデバイスユーザーにバックグラウンドアクティビティを有効化する方法を案内してください。[例：特定のAndroidメーカーとデバイスをターゲットにする](./example-target-certain-android-manufacturers-and-devices)を参照してください。
</Note>

### Android 通知カテゴリが無効

Android通知カテゴリ（チャンネルとも呼ばれます）を使用すると、ユーザーはアプリの特定の種類の通知を無効化できます。カテゴリが無効化されている場合、そのカテゴリで送信された通知はデバイスに表示されません——アプリが通知権限を持っていても同様です。

デバイスでカテゴリの状態を確認します：**設定 > 通知 > あなたのアプリ**。「通知を表示」が有効になっており、すべてのカテゴリがオンになっていることを確認します。

<Frame caption="「Abandoned Cart - Urgent」カテゴリがオフになっているAndroidアプリの通知設定。このカテゴリの通知がデバイスに表示されなくなります。">
  <img src="https://mintcdn.com/onesignal/jFWn5xzleD8du3j6/images/docs/5a83479-Screen_Shot_2021-07-29_at_7.47.11_AM.png?fit=max&auto=format&n=jFWn5xzleD8du3j6&q=85&s=7f6d3cc24cda04f807e1c9840895c22b" alt="「Abandoned Cart - Urgent」カテゴリがオフになっているAndroidアプリの通知設定。このカテゴリの通知がデバイスに表示されなくなります。" width="800" height="650" data-path="images/docs/5a83479-Screen_Shot_2021-07-29_at_7.47.11_AM.png" />
</Frame>

通知にカテゴリが設定されていない場合、OneSignalはデフォルトのMiscellaneousカテゴリを使用します。カスタムカテゴリを使用していない場合は、このカテゴリが有効になっていることを確認してください。設定の詳細は[Android通知カテゴリ](./android-notification-categories)を参照してください。

<Warning>
  Samsung One UI 6.1は多くのアプリの通知カテゴリを自動的に無効化します。ユーザーがSamsungデバイスを使用していて最近特定の通知を受信できなくなった場合、これが原因である可能性が高いです。詳細は[Android Policeの記事](https://www.androidpolice.com/one-ui-61-disables-notification-channels/)を参照してください。
</Warning>

<Note>
  アプリ内メッセージを使用してSamsungユーザーにカテゴリの再有効化方法を案内できます。[例：特定のAndroidメーカーとデバイスをターゲットにする](./example-target-certain-android-manufacturers-and-devices)を参照してください。
</Note>

### Android Dozeモード、優先度、および優先度が下げられたメッセージ

Androidの[Dozeモード](https://developer.android.com/training/monitoring-device-state/doze-standby)と[App Standby](https://developer.android.com/training/monitoring-device-state/doze-standby#understand_app_standby)機能は、デバイスがプラグを抜いて静止しているときにバックグラウンドプロセス（プッシュ配信を含む）を遅延させます。これらのモードは自動的に有効化され、ユーザーには表示されません。

[高優先度](./push#priority)メッセージを送信するとデバイスが起動し、Dozeモードをバイパスします。ただし、可視通知を生成しない高優先度メッセージを多数送信すると、FCMがメッセージを通常優先度に自動的に降格させる場合があります。[FCMドキュメント](https://firebase.google.com/docs/cloud-messaging/android/message-priority)より：

> Android上の高優先度メッセージは、時間に敏感なユーザー向けコンテンツを対象としています。FCMがメッセージがユーザー向け通知につながらないパターンを検出した場合、メッセージは通常優先度に降格される可能性があります。

降格が疑われる場合は、高優先度の使用を時間に敏感なメッセージのみに制限してください。

### Androidエミュレーターの設定

AndroidエミュレーターでのプッシュにはGoogle Play Servicesが必要です。エミュレーターでテストしているのに通知が届かない場合は、以下を確認してください：

1. エミュレーターイメージにGoogle Play Storeが含まれていること
2. エミュレーターがコールドブートを使用するように設定されていること

コールドブートの設定：Android Studio Device Managerを開く > デバイスを選択 > 編集 > 追加設定 > ブートオプションをCold Bootに設定 > 保存して再起動。

***

## iOSの問題

このセクションはiOSデバイスのみに適用されます。Androidのトラブルシューティングをしている場合は、[Androidの問題](#androidの問題)を参照してください。

### APNs通知の統合

iOSデバイスがオフラインまたは到達不能な間に複数の通知が送信された場合、デバイスが再接続した際に最新の通知のみが表示されることがあります。APNsはデバイスがオフラインの間、アプリごとに1つの通知のみを保存し、それ以前の通知は破棄します。これは想定された[APNsの動作](https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns)であり、OneSignalやアプリ側で変更することはできません。

### iOSフォアグラウンドブロック

[iOS UNUserNotificationCenterDelegate](https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate)を設定している場合、アプリがフォアグラウンドにある間に通知の表示をブロックするコードがある可能性があります。

このカスタムコードを削除し、代わりにSDKの[フォアグラウンドイベントリスナー](./mobile-sdk-reference#addforegroundlifecyclelistener-push)を使用してください。

### iOSバッジクリア

アプリがバッジカウントをクリアすると、iOSはそのアプリのすべての通知を通知センターから削除します。OneSignal SDKはアプリが開かれたときに自動的にバッジをクリアするため、以前に配信された通知がユーザーが次回アプリを開いたときに消える可能性があります。

テスト中にこれが混乱を引き起こしている場合は、この動作を制御する方法について[バッジ](./badges)を参照してください。

***

## メッセージの設定

このセクションでは、デバイスではなくOneSignalでの通知の設定方法によって引き起こされる問題を取り上げます。

### サブスクリプションがターゲットオーディエンスに含まれていない

メッセージのオーディエンスを確認して、モバイルサブスクリプションが含まれていることを確認します：

* **[セグメント](./segmentation)**：サブスクリプションがすべてのオーディエンスフィルタ条件を満たしていることを確認します。
* **ダイレクト送信**：ターゲットにしているIDが正しいことを確認します：
  * サブスクリプションがまだプッシュを購読していること。
  * 最近の最終セッション日付があること——古いまたは非アクティブなサブスクリプションに送信している可能性があります。

### Collapse IDによる通知の置き換え

メッセージにCollapse IDを設定している場合、同じCollapse IDを持つ新しい通知は未読の同IDの通知を静かに置き換えます。ユーザーが以前の通知を開いていない場合、最新の通知のみが表示されます。Collapse IDの仕組みについては[通知の削除とTTL](./push)を参照してください。

***

## コードレベルの原因

このセクションではアプリのソースコードへのアクセスが必要です。コードへのアクセス権がない場合は、これらのチェック項目を開発チームと共有してください。

### OneSignalフォアグラウンド通知防止

OneSignal SDKの[フォアグラウンドイベントリスナー](./mobile-sdk-reference#addforegroundlifecyclelistener-push)には、アプリがフォアグラウンドにある間に通知を抑制する`event.preventDefault()`メソッドが含まれています。このメソッドがコード内で無条件に呼び出されている場合、すべてのフォアグラウンド通知が静かにブロックされます。

テスト中は、フォアグラウンド抑制を原因として除外するため、アプリをバックグラウンドまたは完全に閉じた状態に保ってください。

### Android Notification Service Extension

[Android Notification Service Extension](./service-extensions)を実装している場合、これはアプリへの受信通知の最初のエントリポイントです。このExtension内で`event.preventDefault()`が呼び出されると、アプリの状態に関わらず通知がブロックされます。Extensionのコードを確認し、このメソッドが意図的にのみ呼び出されていることを確認してください。

### Firebase Messaging SDKの競合

アプリにFirebase Messaging SDKも含まれている場合は、OneSignalがFCMメッセージを処理する前にFirebaseが傍受していないか確認してください。

この問題は次の場合によく発生します：

* OneSignalで通知が**配信済み**と表示されているにもかかわらず、デバイスに表示されない。
* アプリにOneSignalと`firebase_messaging`（またはカスタム`FirebaseMessagingService`）の両方が含まれている。
* Firebase Messagingを削除するとプッシュが機能するが、両方のSDKが存在すると失敗する。

1. `AndroidManifest.xml`で`com.google.firebase.iid.FirebaseInstanceIdReceiver`などのレガシーFirebaseレシーバーを確認し、OneSignalがプッシュ配信を担当している場合は削除または条件付きで除外してください。

2. `onMessageReceived`をオーバーライドするカスタム`FirebaseMessagingService`の実装（またはFlutterの`firebase_messaging`などのライブラリ）を確認してください。別のサービスがメッセージを完全に処理または抑制している場合、OneSignalが通知を表示する前にFCMペイロードを消費する可能性があります。

3. `FirebaseMessaging.getToken()`や`FirebaseMessaging.deleteToken()`などのFirebaseトークン管理APIの呼び出しは避けてください。

OneSignalがプッシュ配信を担当している場合、プッシュトークンのライフサイクルを管理するSDKはOneSignalのみであるべきです。FCMトークンを直接取得または管理すると、トークンの所有権の競合や不安定な配信動作が発生する可能性があります。

他のシステム用にデバイスのプッシュトークンが必要な場合は、OneSignalから読み取り（例：`User.pushSubscription.token`）、[SDKのオブザーバーAPI](./mobile-sdk-reference#addobserver-push-subscription-changes)を使用してサブスクリプション/トークンの変更を監視してください。

***

## トラブルシューティング

上記のセクションを確認しても問題が解決しない場合は、デバッグログを取得してください。これは配信が失敗している場所を正確に特定する最速の方法です。

[デバッグログの取得](./capturing-a-debug-log)に従ってアプリで詳細ログを有効にします。次に：

1. アプリをバックグラウンドに置く
2. 影響を受けたデバイスにテスト通知を送信する
3. ログにエラーがないか確認する。OneSignalが初期化されており、ログ内の`subscription-id`がプッシュを購読していて、メッセージを送信しているIDと同じであることを確認してください。

***

<Info>
  お困りですか？

  `support@onesignal.com`のサポートチームにお問い合わせください

  以下の情報をご提供ください：

  * OneSignal App ID
  * サブスクリプションIDまたはExternal ID
  * OneSignalダッシュボードでテストしたメッセージのURL
  * [デバッグログの取得](./capturing-a-debug-log)の完全なデバッグログ

  喜んでお手伝いします！
</Info>
