プッシュ通知の受信ハンドラー

プッシュメッセージがデバイスに届くと、application(_:didReceiveRemoteNotification:fetchCompletionHandler:) メソッドが呼び出されます。

このメソッドでは、基本的に以下の状態のときプッシュメッセージを受け取ることができます。

  • モバイルアプリがフォアグラウンドで動作中にメッセージを受信したとき(フォアグラウンドでは、content-available キーの設定の有無に関わらず呼び出されます)

  • モバイルアプリがバックグラウンドで動作中に、content-available キーが設定されているメッセージを受信したとき

  • iOS 8/iOS 9 で、通知センターのメッセージのタップによって、モバイルアプリがフォアグラウンドになったとき

例外を含む詳細な動作は、受信メソッドの組み合わせ を参照してください。状況によっては、ハンドラーが複数回呼び出されたり、ユーザー操作によって ユーザーアクションのハンドラー が呼び出されたりする場合があります。

content-available キーが設定されている場合、iOS 8 以降では、iOS の設定画面での "App のバックグラウンド更新" のオン、オフ設定にかかわらず、バックグラウンド状態でのメソッド呼び出しが行われます。iOS 7 以前では、"App のバックグラウンド更新" をオンにしないと呼び出しは行われませんでした。

なお、このメソッドが呼び出されるのはリモート通知の場合のみで、ローカル通知の場合は呼び出されません。

受信ハンドラーの実装例を以下に示します。

Swift 3:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  print("Received notification : \(userInfo)")

  let message = KiiReceivedMessage(fromAPNS: userInfo)
  // Do something.

  completionHandler(.newData)
}

Objective-C:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result)) completionHandler {
  NSLog(@"Received notification: %@", userInfo);

  KiiReceivedMessage *message = [KiiReceivedMessage messageFromAPNS:userInfo];
  // Do something.

  completionHandler(UIBackgroundFetchResultNewData);
}

APNs のペイロードは、[AnyHashable: Any] として userInfo に格納されています。これを Kii Cloud の KiiReceivedMessage クラスに渡すと、ペイロードの情報を取得できます。

コメント // Do something. の箇所で KiiReceivedMessage インスタンスを参照し、Kii Cloud の機能を使った処理を実行します。KiiReceivedMessage クラスの使用方法は、サーバー上変更のプッシュ通知(Push to App)ユーザープッシュ通知 (Push to User)管理者メッセージのプッシュ通知(Direct Push) を参照してください。

処理の最後に、completionHandler ブロックを呼び出します。この呼び出しは、メソッドの開始から 30 秒以内に実行する必要があります。

completionHandler ブロックの引数には、列挙型 UIBackgroundFetchResult の値を指定します。プッシュ通知では、以下の値を返します。iOS では、この情報をバックグラウンド処理の制御に使用します。

返す値 意味
newData 新しいデータを処理できたことを示します。届いたプッシュメッセージが正常に処理できた際に指定します。
noData 例えば、受信処理には成功しましたが、届いたプッシュメッセージに処理対象のデータが存在しないため、データの処理をスキップしたような場合に指定します。
failed データの処理に失敗したことを示します。

なお、iOS 10 以降で非推奨となっている application(_:didReceiveRemoteNotification:) メソッドは実装する必要はありません。上記のサンプルコードに示す application(_:didReceiveRemoteNotification:fetchCompletionHandler:) メソッドを実装すれば、同じ役割を果たすことができます。また、これら 2 つのメソッドを共に実装した場合、application(_:didReceiveRemoteNotification:) メソッドは呼び出されません。