

iOS10に対応した その2
こんにちは、nagashimaです。
今回はメインのpush周りの実装になります。
iOS9とiOS10でざっくりと以下の違いがあります。
・iOS9ではForeground時に通知が作られず、ローカル通知を作る必要があった
・iOS9ではリモートプッシュから開いた時はapplication(UIApplication, didReceiveRemoteNotification)がコールバックされる
・iOS10ではForeground時にも通知が作られ、ローカル通知を作る必要はない
・iOS10では通知から開いた時、アプリにコールバックされる関数が異なる
iOS10からuserNotificationCenterが追加されそちらで受け取るとiOS9とうまく切り分けることができます。
AppDelegateにUNUserNotificationCenterDelegateを追加して
registerUserNotificationSettingsの代わりに次のコードを追加してデバイストークンを取得します。
UNUserNotificationCenter.currentNotificationCenter().delegate = self UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions( [UNAuthorizationOptions.Badge, UNAuthorizationOptions.Sound, UNAuthorizationOptions.Alert], completionHandler: { (granted, error) in if error != nil { return } //エラー時の処理 })
リモートプッシュが来た時はアプリがForeground時には
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void){}
が呼ばれます。
notification.request.content.userInfoにuserinfoのデータが入っているので取得して操作することができます。
completionHandler([UNNotificationPresentationOptions.Alert, UNNotificationPresentationOptions.Sound])
を呼ぶとことで通知も作ってくれます。各自でローカル通知を作る必要がなくなりました!
通知から起動した時は
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void){}
が呼ばれます。
response.notification.request.content.userInfoに同じくuserinfoのデータが入っているので画面遷移など好きなように操作できます。
処理が完了した時にはcompletionHandler()を呼ぶようにしましょう。