その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

Push Notification おさらい

プッシュ通知を実装するときに、「バックグラウンドで通知受けたときはapplication:didFinishLaunchingWithOptions:とapplication:didReceiveRemoteNotification:、どっちが呼ばれるんだっけ?」とかなんだかいつも自信なくなってきてドキュメントを見返したりしてしまうので、ドキュメントと、実際の動作を確認した内容をまとめておきます。


(参考ドキュメント)
Local Notification および Push Notification プログラミングガイド(日本語)
英語・最新版

アプリがバックグラウンドで動作中に通知が配信された場合の挙動

この場合、システムは、警告の表示、アイコンのバッジの表示、また、サウンドの再生を行う ことで通知を提示します。

アクションボタンがタップされると、システムはアプリケーションを起動します。そのアプリケーションはデリゲートのapplication:didFinishLaunchingWithOptions:メソッド(実装されている場合)を呼び出し、通知のペイロード(Remote Notificationの場合)またはLocal Notificationオブジェクト(Local Notificationの場合)を渡します。

アプリがフォアグラウンドで動作中に通知が配信された場合の挙動

アプリケーションは、そのデリゲートのapplication:didReceiveRemoteNotification:メソッド(Remote Notificationの場合)またはapplication:didReceiveLocalNotification:メソッド(Local Notificationの場合)を呼び出して、通知のペイロードまたはLocal Notificationオブジェクトを渡します。

ユーザがアクションボタンをタップしたからアプリケーションが起動されたのか、アプリケーション状態を確認したことによって動作中のアプリケーションに通知が配信されたのかどうかを特定できます。デリゲートのapplication:didReceiveRemoteNotification:メソッドまたは application:didReceiveLocalNotification:メソッドの実装で、applicationStateプロパティの値を取得し、その値を評価します。値がUIApplicationStateInactiveの場合は、ユーザがアクションボタンをタップしました。値がUIApplicationStateActiveの場合は、通知を受け取ったと きにそのアプリケーションが最前面にありました。

ここの「アプリケーション状態を確認したことによって動作中のアプリケーションに通知が配信されたのかどうか」ってのが何のことかよくわからなかったので原文みると、

You can determine whether an application is launched as a result of the user tapping the action button or whether the notification was delivered to the already-running application by examining the application state.

とあって、つまり「フォアグラウンドにあるアプリケーションに通知が配信されたのかどうか、ApplicationStateを確認することで特定できる」ということを言ってるようです。

まとめ

フォアグラウンドでプッシュ通知を受け取ったとき

  • application:didReceiveRemoteNotification:メソッドが呼ばれる
  • application:didReceiveRemoteNotification:でのUIApplicationStateActiveの値はUIApplicationStateActive

アプリのプロセスがバックグラウンドで生きているときにプッシュ通知を受け取り、ユーザーがアクションボタンをタップしたとき

  • application:didReceiveRemoteNotification:メソッドが呼ばれる
  • application:didReceiveRemoteNotification:でのUIApplicationStateActiveの値はUIApplicationStateInactive

アプリのプロセスがバックグラウンドで生きていないときにプッシュ通知を受け取り、ユーザーがアクションボタンをタップしたとき

  • application:didFinishLaunchingWithOptions:メソッドが呼ばれる
  • application:didFinishLaunchingWithOptions:の引数launchOptionsにUIApplicationLaunchOptionsRemoteNotificationKeyというキーでペイロードが入ってくる