受信メソッドの組み合わせ
プッシュ通知に必要なメソッドを用意すると、APNs からのプッシュメッセージを受信できます。この際、呼び出されるメソッドやそのタイミングは、初期化に使用した API、APNs のメッセージのペイロード、エンドユーザーの操作、モバイルアプリの実行状態などさまざまな要素によって変化します。
以下の各セクションに、APNs メッセージの alert/body キー、content-available キー、および category キーの設定の組み合わせ別に、ハンドラーの呼び出しや通知センターの操作など、プッシュ通知の受信で発生する事象をまとめています。
| alert/body | content- available |
category | 参照先 |
|---|---|---|---|
| あり | あり | あり | 詳細 |
| あり | あり | なし | 詳細 |
| あり | なし | あり | 詳細 |
| あり | なし | なし | 詳細 |
| なし | あり | あり | 詳細 |
| なし | あり | なし | 詳細 |
| なし | なし | あり | 詳細 |
| なし | なし | なし | 詳細 |
このトピックは、Apple によりドキュメント化されている情報ではなく、実動作より調査した情報に基づいています。OS のバージョンや今回考慮されていない条件によって、異なる動作になる可能性があります。
表の用語
各セクションの表で使われている用語の意味は以下のとおりです。
初期化 API
初期化 API は、プッシュ通知の初期化に使用する API を表します。iOS の API 名を以下のように置き換えて記述しています。
iOS 10 対応:iOS 10 対応の
UNUserNotificationCenteriOS 8/9 対応:iOS 8/9 対応の
UIUserNotificationSettings
ハンドラー
各ハンドラーは、以下のメソッドを実行する処理を表します。いずれも、iOS のメソッド名を以下のように省略して記述しています。
起動ハンドラー:モバイルアプリ起動時に呼び出される
application(_:didFinishLaunchingWithOptions:)メソッドを伴います。launchOptionsパラメータにUIApplicationLaunchOptionsRemoteNotificationKeyを伴って呼び出されます。受信ハンドラー:
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)メソッドを伴います。詳しくは、プッシュ通知の受信ハンドラー を参照してください。アクションハンドラー:iOS 10 対応の
userNotificationCenter(_:didReceive:withCompletionHandler:)メソッド、または、iOS 8/9 対応のapplication(_:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:)メソッドを伴います。初期化の際に指定した API に応じて、いずれかが呼び出されます。詳しくは、ユーザーアクションのハンドラー を参照してください。
各メソッドはモバイルアプリに実装済みとします。実装されていない場合は単純に呼び出しがスキップされますが、表に記載しているとおり、例外的に代替メソッドが呼び出されるケースもあります。
モバイルアプリの状態
受信ハンドラーとアクションハンドラーについては、application.applicationState で取得したモバイルアプリの状態も併記しています。表では以下の 3 つの状態を扱います。
Active:モバイルアプリの状態がUIApplicationStateActiveであることを表します。モバイルアプリがフォアグラウンドで実行中の状態でプッシュメッセージを受信したことを表します。Inactive:モバイルアプリの状態がUIApplicationStateInactiveであることを表します。モバイルアプリがイベントを直接受信できない状態を経由してプッシュメッセージを受信したことを表します。Background:モバイルアプリの状態がUIApplicationStateBackgroundであることを表します。モバイルアプリがバックグラウンド状態でプッシュメッセージを受信したことを表します。
各セクションの使い方
プッシュ通知の動作はさまざまな要素によって変化することから、思わぬバグが生じるおそれがあります。バグを回避するため、関連する要素を意識してモバイルアプリを設計してください。このトピックの各セクションの表で、プッシュ通知の設定と実行環境に応じて発生する事象を確認できます。
複数回呼び出されるハンドラーへの対応
1 回のプッシュ通知に対して 受信ハンドラー が複数回呼び出されることがあります。処理の重複実行を許容できない場合は、この事象を考慮して設計する必要があります。
たとえば、alert/body キー、content-available キー、category キーのすべてが設定されているプッシュ通知を、UIUserNotificationSettings クラスで初期化されたモバイルアプリがバックグラウンド状態のときに受信する処理を設計するとします。これは、alert/body あり、content-available あり、category ありの場合 の表の「バックグラウンド」の列の、2 つ目の項目の事象に対応する処理です。
この場合、プッシュ通知を受信したときとユーザーが通知センターで通知本体をタップしたときに、受信ハンドラーが呼び出されます。該当する表項目から、モバイルアプリの状態が、初回の呼び出し時には UIApplicationStateBackground であり、2 回目の呼び出し時には UIApplicationStateInactive であることがわかります。この情報を利用して呼び出しを区別することによって、処理の重複実行を防止できます。
アクション付き通知の実装
アクション付き通知を実装するときは、ユーザーがアクションボタンではなく通知本体をタップする可能性を考慮して設計する必要があります。
たとえば、alert/body キーと category キーが設定されていて content-available キーが設定されていないプッシュ通知を、UNUserNotificationCenter クラスで初期化されたモバイルアプリがバックグラウンド状態のときに受信する処理を設計するとします。これは、alert/body あり、content-available なし、category ありの場合 の表の「バックグラウンド」の列の、1 つ目の項目の事象に対応する処理です。
この場合、ユーザーが通知センターでアクションボタンまたは通知本体をタップしたときに、アクションハンドラーが呼び出されます。該当する表項目から、モバイルアプリの状態が、アクションボタンがタップされたときには UIApplicationStateBackground であり、通知本体がタップされたときには UIApplicationStateInactive であることがわかります。この情報を利用して呼び出しを区別することによって、ユーザーの操作に応じた処理を実装できます。
alert/body あり、content-available あり、category ありの場合
| 初期化 API | モバイルアプリの状態 | ||
|---|---|---|---|
| フォアグラウンド ※1 | バックグラウンド | 終了状態 | |
| iOS 10 対応 | 即座に受信ハンドラー(Active)が呼び出される |
1. 即座に受信ハンドラー(Background)が呼び出される ※22. 通知センターに通知が表示される 3. タップで以下のハンドラーが呼び出される - アクションボタン:アクションハンドラー( Background)- 通知本体:アクションハンドラー( Inactive)※3 |
1. 通知センターに通知が表示される 2. アクションボタンまたは通知本体のタップで起動ハンドラーが呼び出される 3. 以下のハンドラーが呼び出される - アクションボタン:アクションハンドラー( Background)- 通知本体:アクションハンドラー( Inactive)※3 |
iOS 8/9 対応 | 即座に受信ハンドラー(Active)が呼び出される |
1. 即座に受信ハンドラー(Background)が呼び出される ※22. 通知センターに通知が表示される 3. タップで以下のハンドラーが呼び出される - アクションボタン:アクションハンドラー( Inactive)- 通知本体:受信ハンドラー( Inactive) |
1. 通知センターに通知が表示される 2. アクションボタンまたは通知本体のタップで起動ハンドラーが呼び出される 3. 以下のハンドラーが呼び出される - アクションボタン:アクションハンドラー( Inactive)- 通知本体:受信ハンドラー( Inactive) |
※1 userNotificationCenter(_:willPresent:withCompletionHandler:) メソッドによってフォアグラウンドでの通知の表示方法を変更すると、フォアグラウンドでの動作がこのトピックで示す動作から変化します。
※2 iOS 8 以降では、ユーザーの端末の設定で "App のバックグラウンド更新" の設定がオフになっていても、ペイロードに content-available キーが設定されていれば、バックグラウンドでプッシュ通知を受け取ることができます。
※3 アクションハンドラーが未実装の場合は、受信ハンドラー(Inactive)が代わりに呼び出されます。
alert/body あり、content-available あり、category なしの場合
| 初期化 API | モバイルアプリの状態 | ||
|---|---|---|---|
| フォアグラウンド ※1 | バックグラウンド | 終了状態 | |
| iOS 10 対応 | 即座に受信ハンドラー(Active)が呼び出される |
1. 即座に受信ハンドラー(Background)が呼び出される ※22. 通知センターに通知が表示される 3. 通知本体のタップでアクションハンドラー( Inactive)が呼び出される ※3 |
1. 通知センターに通知が表示される 2. 通知本体のタップで起動ハンドラーが呼び出される 3. アクションハンドラー( Inactive)が呼び出される ※3 |
iOS 8/9 対応 | 即座に受信ハンドラー(Active)が呼び出される |
1. 即座に受信ハンドラー(Background)が呼び出される ※22. 通知センターに通知が表示される 3. 通知本体のタップで受信ハンドラー( Inactive)が呼び出される |
1. 通知センターに通知が表示される 2. 通知本体のタップで起動ハンドラーが呼び出される 3. 受信ハンドラー( Inactive)が呼び出される |
※1 userNotificationCenter(_:willPresent:withCompletionHandler:) メソッドによってフォアグラウンドでの通知の表示方法を変更すると、フォアグラウンドでの動作がこのトピックで示す動作から変化します。
※2 iOS 8 以降では、ユーザーの端末の設定で "App のバックグラウンド更新" の設定がオフになっていても、ペイロードに content-available キーが設定されていれば、バックグラウンドでプッシュ通知を受け取ることができます。
※3 アクションハンドラーが未実装の場合は、受信ハンドラー(Inactive)が代わりに呼び出されます。
alert/body あり、content-available なし、category ありの場合
| 初期化 API | モバイルアプリの状態 | ||
|---|---|---|---|
| フォアグラウンド ※1 | バックグラウンド | 終了状態 | |
| iOS 10 対応 | 即座に受信ハンドラー(Active)が呼び出される |
1. 通知センターに通知が表示される 2. タップで以下のハンドラーが呼び出される - アクションボタン:アクションハンドラー( Background)- 通知本体:アクションハンドラー( Inactive)※2 |
1. 通知センターに通知が表示される 2. アクションボタンまたは通知本体のタップで起動ハンドラーが呼び出される 3. 以下のハンドラーが呼び出される - アクションボタン:アクションハンドラー( Background)- 通知本体:アクションハンドラー( Inactive)※2 |
iOS 8/9 対応 | 即座に受信ハンドラー(Active)が呼び出される |
1. 通知センターに通知が表示される 2. タップで以下のハンドラーが呼び出される - アクションボタン:アクションハンドラー( Inactive)- 通知本体:受信ハンドラー( Inactive) |
1. 通知センターに通知が表示される 2. アクションボタンまたは通知本体のタップで起動ハンドラーが呼び出される 3. 以下のハンドラーが呼び出される - アクションボタン:アクションハンドラー( Inactive)- 通知本体:受信ハンドラー( Inactive) |
※1 userNotificationCenter(_:willPresent:withCompletionHandler:) メソッドによってフォアグラウンドでの通知の表示方法を変更すると、フォアグラウンドでの動作がこのトピックで示す動作から変化します。
※2 アクションハンドラーが未実装の場合は、受信ハンドラー(Inactive)が代わりに呼び出されます。
alert/body あり、content-available なし、category なしの場合
| 初期化 API | モバイルアプリの状態 | ||
|---|---|---|---|
| フォアグラウンド ※1 | バックグラウンド | 終了状態 | |
| iOS 10 対応 | 即座に受信ハンドラー(Active)が呼び出される |
1. 通知センターに通知が表示される 2. 通知本体のタップでアクションハンドラー( Inactive)が呼び出される ※2 |
1. 通知センターに通知が表示される 2. 通知本体のタップで起動ハンドラーが呼び出される 3. アクションハンドラー( Inactive)が呼び出される ※2 |
iOS 8/9 対応 | 即座に受信ハンドラー(Active)が呼び出される |
1. 通知センターに通知が表示される 2. 通知本体のタップで受信ハンドラー( Inactive)が呼び出される |
1. 通知センターに通知が表示される 2. 通知本体のタップで起動ハンドラーが呼び出される 3. 受信ハンドラー( Inactive)が呼び出される |
※1 userNotificationCenter(_:willPresent:withCompletionHandler:) メソッドによってフォアグラウンドでの通知の表示方法を変更すると、フォアグラウンドでの動作がこのトピックで示す動作から変化します。
※2 アクションハンドラーが未実装の場合は、受信ハンドラー(Inactive)が代わりに呼び出されます。
alert/body なし、content-available あり、category ありの場合
| 初期化 API | モバイルアプリの状態 | ||
|---|---|---|---|
| フォアグラウンド ※1 | バックグラウンド | 終了状態 | |
| iOS 10 対応 | 即座に受信ハンドラー(Active)が呼び出される |
即座に受信ハンドラー(Background)が呼び出される ※2 |
通知が無視される | iOS 8/9 対応 | 即座に受信ハンドラー(Active)が呼び出される |
即座に受信ハンドラー(Background)が呼び出される ※2 |
通知が無視される |
※1 userNotificationCenter(_:willPresent:withCompletionHandler:) メソッドによってフォアグラウンドでの通知の表示方法を変更すると、フォアグラウンドでの動作がこのトピックで示す動作から変化します。
※2 iOS 8 以降では、ユーザーの端末の設定で "App のバックグラウンド更新" の設定がオフになっていても、ペイロードに content-available キーが設定されていれば、バックグラウンドでプッシュ通知を受け取ることができます。
alert/body なし、content-available あり、category なしの場合
| 初期化 API | モバイルアプリの状態 | ||
|---|---|---|---|
| フォアグラウンド ※1 | バックグラウンド | 終了状態 | |
| iOS 10 対応 | 即座に受信ハンドラー(Active)が呼び出される |
即座に受信ハンドラー(Background)が呼び出される ※2 |
通知が無視される | iOS 8/9 対応 | 即座に受信ハンドラー(Active)が呼び出される |
即座に受信ハンドラー(Background)が呼び出される ※2 |
通知が無視される |
※1 userNotificationCenter(_:willPresent:withCompletionHandler:) メソッドによってフォアグラウンドでの通知の表示方法を変更すると、フォアグラウンドでの動作がこのトピックで示す動作から変化します。
※2 iOS 8 以降では、ユーザーの端末の設定で "App のバックグラウンド更新" の設定がオフになっていても、ペイロードに content-available キーが設定されていれば、バックグラウンドでプッシュ通知を受け取ることができます。
alert/body なし、content-available なし、category ありの場合
| 初期化 API | モバイルアプリの状態 | ||
|---|---|---|---|
| フォアグラウンド ※1 | バックグラウンド | 終了状態 | |
| iOS 10 対応 | 即座に受信ハンドラー(Active)が呼び出される ※2 |
通知が無視される | 通知が無視される | iOS 8/9 対応 | 即座に受信ハンドラー(Active)が呼び出される ※2 |
通知が無視される | 通知が無視される |
※1 userNotificationCenter(_:willPresent:withCompletionHandler:) メソッドによってフォアグラウンドでの通知の表示方法を変更すると、フォアグラウンドでの動作がこのトピックで示す動作から変化します。
※2 受信ハンドラーを呼び出すには、sound キーや badge キーを設定する必要があります。
alert/body なし、content-available なし、category なしの場合
| 初期化 API | モバイルアプリの状態 | ||
|---|---|---|---|
| フォアグラウンド ※1 | バックグラウンド | 終了状態 | |
| iOS 10 対応 | 即座に受信ハンドラー(Active)が呼び出される ※2 |
通知が無視される | 通知が無視される | iOS 8/9 対応 | 即座に受信ハンドラー(Active)が呼び出される ※2 |
通知が無視される | 通知が無視される |
※1 userNotificationCenter(_:willPresent:withCompletionHandler:) メソッドによってフォアグラウンドでの通知の表示方法を変更すると、フォアグラウンドでの動作がこのトピックで示す動作から変化します。
※2 受信ハンドラーを呼び出すには、sound キーや badge キーを設定する必要があります。