プッシュ通知の受信ハンドラー
プッシュメッセージがデバイスに届くと、application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
メソッドが呼び出されます。
このメソッドでは、基本的に以下の状態のときプッシュメッセージを受け取ることができます。
モバイルアプリがフォアグラウンドで動作中にメッセージを受信したとき(フォアグラウンドでは、content-available キーの設定の有無に関わらず呼び出されます)
モバイルアプリがバックグラウンドで動作中に、
content-available
キーが設定されているメッセージを受信したときiOS 8/iOS 9 で、通知センターのメッセージのタップによって、モバイルアプリがフォアグラウンドになったとき
例外を含む詳細な動作は、受信メソッドの組み合わせ を参照してください。状況によっては、ハンドラーが複数回呼び出されたり、ユーザー操作によって ユーザーアクションのハンドラー が呼び出されたりする場合があります。
content-available
キーが設定されている場合、iOS 8 以降では、iOS の設定画面での "App のバックグラウンド更新" のオン、オフ設定にかかわらず、バックグラウンド状態でのメソッド呼び出しが行われます。iOS 7 以前では、"App のバックグラウンド更新" をオンにしないと呼び出しは行われませんでした。
なお、このメソッドが呼び出されるのはリモート通知の場合のみで、ローカル通知の場合は呼び出されません。
受信ハンドラーの実装例を以下に示します。
Swift:
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:)
メソッドは呼び出されません。