Skip to main content
このガイドでは、プッシュ通知がデバイスに表示された後に何が起こるかを理解し、制御する方法を説明します:クリックと却下で何が起こるか、Android が通知を再表示するタイミング、バッジが同期される仕組み、そしてアプリコードからトレイを管理できる SDK ツールについてです。 このページはモバイルプッシュ(Android および iOS)を対象としています。Web プッシュの動作については、Web プッシュ通知の動作を参照してください。

トレイ内の通知ライフサイクル

デバイスに表示されたすべての OneSignal 通知は SDK によって追跡されます。次に何が起こるかによって、その通知が再表示される可能性があるかどうかが決まります:
Android では、Android のネイティブな NotificationManager.cancel()cancelAll() の代わりに、常に OneSignal SDK メソッドで通知をクリアしてください。ネイティブ API でキャンセルされた通知は却下済みとしてマークされないため、次回アプリが再起動したときに SDK がそれらを復元します。

クリックと却下の動作

通知をクリックすると、アプリ(または通知の起動 URL)が開き、通知がトレイから削除され、通知ペイロードとクリックされたアクションボタン ID を伴って addClickListener() コールバックが発火します。クリックされた通知がグループに属している場合、SDK はグループサマリーを更新または削除します。クリックされた通知が復元されることはありません。 通知を却下する(スワイプで消す、またはトレイの「すべて消去」をタップする)と、却下済みとしてマークされ、バッジカウントとグループサマリーが更新されます。却下された通知が復元されることはありません。SDK は却下リスナーを提供していません。却下は内部的に追跡されます。 アプリがフォアグラウンドにある間に表示される通知は、まずフォアグラウンドライフサイクルリスナーを通過するため、そこで表示を防ぐことができます。

復元された通知(Android)

Android は、ユーザーの操作なしに通知を強制削除することがあります:デバイスの再起動、アプリの更新、強制終了(一部デバイスの積極的なバッテリーマネージャーを含む)などの場合です。Android SDK は、次回アプリがコールドスタートしたときに、影響を受けた通知を自動的に再表示(復元)します。これにより、ユーザーが見たり却下したりしなかった配信済みメッセージが失われることはありません。 復元された通知は、低重要度の Restored カテゴリでサイレントに再表示されます。クリックも却下もされておらず、TTL の範囲内にあり、過去 7 日以内に受信された通知のみが、最大 49 件まで復元されます。 対象となる条件と制御方法の詳細は、復元された通知(Android)にあります。復元を減らすには、送信時に短い ttl を使用するか、消費済みの通知を以下の SDK メソッドでクリアしてください。iOS には復元の動作はありません。

バッジの動作

iOS では、バッジは通知ペイロード(ios_badgeTypeios_badgeCount)によって設定され、サービス拡張機能がカウントを正確に更新できるように App Group が必要です。デフォルトでは、SDK はアプリを開いたときにバッジをクリアします。 Android では、アプリアイコンのバッジはトレイ内のアクティブな OneSignal 通知の数を反映し、通知カテゴリを通じて管理されます。SDK は、通知が表示、却下、クリック、またはクリアされたときにカウントを自動的に更新し、clearAllNotifications() を呼び出すと 0 にリセットします。 セットアップ、プラットフォームごとのオプション、トラブルシューティングについては、バッジを参照してください。

プログラムによる通知のクリア

通知のクリアは、アプリのライフサイクルイベントではなく、その内容がアプリ内で消費されたときに行ってください。一般的なパターン:
  • コンテンツ消費に伴う同期:ユーザーが通知の指す画面(受信ボックス、メッセージセンター、アクティビティフィード)を開いたため、通知が不要になった場合。すべてをクリアするか、一部のコンテンツのみが消費された場合はターゲット指定のメソッドを使用します。
  • ログアウト:前のユーザーの通知が次のユーザーに見えないよう、すべてをクリアします。
「トレイをきれいに保つ」ためにアプリの起動時やフォアグラウンド復帰のたびにクリアするのは避けてください。トレイ内の通知は再エンゲージメントを促進するものであり、クリアするとその入口が失われます。通知の蓄積を管理したい場合は、送信時に collapse_id を使用して通知を積み重ねる代わりに置き換えるか、より短い TTL を使用して未配信の通知を期限切れにしてください。

clearAllNotifications()

アプリの通知をトレイから削除し、バッジカウントを 0 にリセットします。Android では、OneSignal が作成した通知のみが削除され、復元されないように却下済みとしてマークされます。iOS では、ローカル通知や他のプロバイダーからのプッシュを含む、アプリの配信済み通知がすべて削除されます。完全なメソッドリファレンスを参照してください。
復元された通知を防ぐためにアプリ起動時にクリアする場合、クロスプラットフォームアプリでは呼び出しを Android に限定してください。iOS では、ローカル通知や他のプロバイダーからのプッシュも削除されます。

removeNotification()removeGroupedNotifications()(Android)

Android 通知 ID で単一の通知を削除するか、グループキーでグループ内のすべての通知を削除します。削除された通知は却下済みとしてマークされ、復元されません。複数の会話のうちの 1 つなど、トレイ内のコンテンツの一部のみが消費された場合に使用してください。メソッドリファレンスを参照してください。

一定時間後に通知を自動的に却下する

表示された通知を一定時間後に削除する送信時パラメーターはありません。可能なことはプラットフォームによって異なります:
  • Android 8.0(API 26)以降通知サービス拡張機能setTimeoutAfter() を使用してタイムアウトを設定します。タイムアウトが経過すると、Android は通知をシェードから削除します。API 26 未満のデバイスでは、この呼び出しは無視され、ユーザーが操作するまで通知が残ります。
  • iOS:サポートされていません。iOS には配信済み通知を自動的に期限切れにする方法はありません。最も近い選択肢は、collapse_id を使用して新しい通知で置き換えるか、後続のプッシュが届いたときに Apple の removeDeliveredNotifications(withIdentifiers:) を使用して Notification Service Extension から削除することです。
コードで固定するのではなくメッセージごとにタイムアウトを設定するには、additionalData で時間を送信し、サービス拡張機能内でイベントから読み取ってください。
setTimeoutAfter() で削除された通知はシステムによって却下されるため、OneSignal SDK はそれを復元しません。これを ttl と混同しないでください。ttl は未配信のメッセージがオフラインのデバイスを待つ時間を制御するもので、表示済みの通知を削除することはありません。

サービス拡張機能による通知のカスタマイズ

サービス拡張機能は通知が表示される前に実行され、外観の変更、バックグラウンドデータの受信、表示の完全な抑制が可能です:
  • Android では、INotificationServiceExtension を実装し、setExtender() を使用して NotificationCompat オプションを変更するか、event.preventDefault() を呼び出して表示を抑制します。
  • iOS では、リッチメディア、バッジの増分、配信確認のために UNNotificationServiceExtension(セットアップ時に作成される OneSignalNotificationServiceExtension)を使用します。
Android では、サービス拡張機能は復元された通知に対しても実行されます。onNotificationReceived 内の副作用(アナリティクス呼び出し、API リクエスト、データベース書き込み)は通知が復元されるときに再実行され、setChannelId() などのエクステンダーによる変更も復元に適用されるため、復元時に大きな音で通知される可能性があります。アラートオプションが新規に配信された通知にのみ適用されるように拡張機能を設計してください。

FAQ

Android でアプリを開くと古い通知が再表示されるのはなぜですか?

Android SDK は、デバイスの再起動、アプリの更新、強制終了などの後に、トレイから強制削除された通知を復元します。ユーザーが却下またはクリックした通知は復元されません。対象条件と制御方法については、復元された通知(Android)を参照してください。

TTL の期限が切れると、トレイから通知が削除されますか?

いいえ。TTL は未配信のメッセージがオフラインのデバイスを待つ時間を制御するもので、Android では復元可能な通知の範囲も制限します。すでにトレイに表示されている通知を削除することはありません。表示済みの通知を削除するには、クリアメソッドを使用してください。Android で一定時間後に削除するには、一定時間後に通知を自動的に却下するを参照してください。

トレイをクリアせずにバッジだけをクリアできますか?

iOS では可能です:バッジはアプリを開いたときに自動的にクリアされ(無効化していない限り)、トレイの内容はそのまま残ります。Android では、バッジはトレイ内のアクティブな通知を反映するため、通知とは独立して設定することはできません。バッジを参照してください。

ユーザーが通知を却下したときのリスナーはありますか?

いいえ。SDK は却下された通知が復元されないように内部的に却下を追跡しますが、却下イベントは公開していません。クリックリスナーはクリックのみを対象としています。

モバイル SDK リファレンス

通知メソッドとリスナーの完全なリファレンス。

OSNotification ペイロード

ペイロードフィールドと復元された通知のルール。

モバイルサービス拡張機能

表示前に通知を傍受してカスタマイズします。