209
190

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iOS 10でついに通知許可ダイアログの操作をハンドリングできるようになったよ

Last updated at Posted at 2016-06-20

概要

  • エンドユーザーが通知(特にRemote Push Notification)を許可してくれたかどうかはサービスにとって死活問題
  • それなのに通知の許可ダイアログでの選択を素直にハンドリングする方法がこれまでなかった
  • iOS 10でそれを簡単にハンドリングできるようになったよ!

2016/6/28 追記

コメントで @mono0926 さんからいただいたとおり、じつはiOS 8/9でもdelegateでハンドリング可能ということが発覚しました。

iOS 8/9 でのハンドリングについては別途まとめさせていただきますが、取り急ぎ、こちらで訂正させていただきます。

iOS 9 以前

let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)

でiOSが必要なら

notification_dialog.png

とエンドユーザにこのアプリが通知機能を使うことを許可するかどうかを確認するダイアログを表示していました。

しかしこのrequestは投げっぱなしのため、実際にそのダイアログが表示されたタイミングもプログラム的には検知できませんし、このダイアログに対してユーザーが実際に許可(Allow)をしたのかしなかったのかも、その瞬間にハンドリングすることが難しいという問題がありました。

(やるとすると少し間をおいて通知設定を確認するなどスマートでない方法...)

iOS 10 でこうなる

しかしiOS 10で導入されたUser Notifications Frameworkにより、これを正確にハンドリングすることができるようになったんです。
具体的には、

UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, _) in
    // got granted :)
}

でこれまでと同じくiOSの判断で確認ダイアログが表示されます。

ただ素晴らしいことに(というかようやく)このrequestAuthorizationの第2引数のclosureは、この許可ダイアログでエンドユーザがAllowもしくはDon't Allowを選択したタイミングでコールバックされるんです!そしてその引数(上の例だとgranted)にAllowDon't Allowのどちらが選択されたかが渡されます。

コールバックされるタイミングとgrantedの値のまとめ

なお、すでに許可の判断が済んでいて、この許可ダイアログが表示されない場合もコールバックされますので、正確にはユーザーの選択がコールバックされるというよりは、その時点での許可の状況がコールバックされるというのが正確な言い方かと思います。
(で、嬉しいのは、許可ダイアログが表示された場合は、許可の判断が終わるまでコールバックを待ってくれるところ)

タイミング granted
許可ダイアログでAllowを選択 true
許可ダイアログでDon't Allowを選択 false
request時に既にAllow済み(ダイアログは表示されない) true
request時に既にDon't Allow済み(ダイアログは表示されない) false

ちなみに第2引数は An object containing error information or nil if no error occurred. とのことだが今のところerrorが発生したことはない。

ロギングや解析が捗る!

これにより、

UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, _) in
    // Analyticsサービスにこのユーザーの状態を伝える
    amplitude.identify(AMPIdentify().set("notification_granted", value: granted))
}

とするなどし、適切なタイミングで正確な状態を把握できるようになりました。

ユーザーが通知を許可してくれるかどうかはサービス運営上の重要な課題のひとつですので、通知を許可してもらうための施策をうって、その効果を正確に測りたい場合などに助かりますね♪ (もっと早く欲しかった...)

Ref: User Notifications Frameworkについて

209
190
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
209
190

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?