[iOS 8] UILocalNotification もユーザー認証が必要になりました
Local Notification もユーザー承認が必要に
これまで Local Notification はユーザーへの確認なしで表示することができましたが、iOS 8 から Local Notification も Remote Notification 同様、ユーザーへの確認が必要になりました。これは iOS 7 から Background Fetch や iBeacon などのようなバックグラウンドで動作する機能が増えたことにより、Remote Notification と似たような使われかたが多くなったからかと思われます。
ということで、iOS 8 からの Local Notification の正しい利用方法を解説したいと思います!
Local Notification を認証させる
Local Notification を認証してもらうには、次のような処理を記述します。
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { let settings = UIUserNotificationSettings( forTypes: UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert, categories: nil) application.registerUserNotificationSettings(settings); return true }
Remote Notification と同様、ユーザーに通知を認証してもらうには UIApplication の registerUserNotificationSettings: メソッドを呼びます。引数の UIUserNotificationSettings は iOS 8 で新しく追加されたクラスです。コンビニエンスコンストラクタの第一引数には UIUserNotificationType を指定します。これはどのような形式の通知を利用するか指定します。第二引数には UIUserNotificationCategory を NSSet でまとめて指定します。UIUserNotificationCategory は通知から実行できるカスタムアクションをまとめるためのクラスです。
これを実行すると、次のようなアラートが表示されるようになります。ちなみに、このアラートも Remote Notification 同様、アプリをインストールして起動した初めにしか表示されず、2回目以降は再インストールしても表示されません。
認証結果は application:didRegisterUserNotificationSettings: でハンドリングすることができます。第二引数の notificationSettings.types が認証された通知種類で、これが UIUserNotificationType.None だと何も認証されていないことになります。
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { let allowedType = notificationSettings.types switch allowedType { case UIUserNotificationType.None: println("何も認証されていない") default: println("認証された") } }
ユーザーからアクセスできる通知設定
ユーザーがアプリに対して指定した通知設定は、設定からアクセスすることができます。上記のようなコードをアプリに実装すると、アプリ用の設定が自動で追加され、そちらからでも通知設定にアクセスできるようになります。
設定の中の…
iPhone 設定セクションの設定の中に…
あります。
Local Notification を認証しないと…?
Local Notification の認証処理を呼ばない状態で Local Notification を呼び出すと、次のようなエラーログが出力され、通知は実行されません。
まとめ
Local Notification の通知の認証処理は iOS 8 以降は必須です。iOS 8 に対応させるときは必ず認証処理を挟むようにしましょう。