head_hexagonはにらぼ☆てっくtale_hexagon

iOS10に対応した その2

Posted by nagashima on 2017/01/21 under Development | Be the First to Comment


こんにちは、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()を呼ぶようにしましょう。

コメントを残す