[iOS 10] User Notifications framework を使用して位置情報に基づいて発火するローカル通知を作成する #wwdc
はじめに
こんばんは。モバイルアプリサービス部の平屋です。前回の記事に引き続き、iOS 10 で追加された「User Notifications framework」のクラスを使用した実装を紹介します。
今回は位置情報に基づいて発火するローカル通知を作成する方法を紹介します。
以前の記事で解説した要素は省略します。以下の記事もあわせてお読みください!
- [iOS 10] User Notifications framework を使用して時限式のローカル通知を作成する
- [iOS 10] User Notifications framework を使用して指定日時に発火するローカル通知を作成する
本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。
実装
さっそく、位置情報に基づいて発火するローカル通知を作成する実装を紹介していきます。
通知の作成方法は、「時限式のローカル通知」や「指定日時に発火するローカル通知」と同じですが、「位置情報に基づいて発火するローカル通知」の場合はさらに、アプリから「位置情報」へアクセスできるようにする必要があります。
位置情報へアクセスできるようにする
アプリ起動時のみ、位置情報へアクセスできるようにします。
Info.plist に項目を追加する
Info.plist に NSLocationWhenInUseUsageDescription
キーと値 (文字列) を追加します。値は「位置情報を使用する目的」です。
<key>NSLocationWhenInUseUsageDescription</key> <string>UNLocationNotificationTriggerを使うために位置情報を使用します。</string>
位置情報へのアクセスをリクエスト
任意のタイミングで CLLocationManager
を作成し、requestWhenInUseAuthorization()
メソッドを使用して位置情報へのアクセスをリクエストします。はじめてリクエストしたタイミングで、許可を求めるアラートが表示されます。
self.locationManager = CLLocationManager() self.locationManager.requestWhenInUseAuthorization()
任意のオブジェクトを CLLocationManagerDelegate のデリゲートにして、デリゲートメソッドを実装すれば、許可の状態の変化をハンドリングできます。
// delegate を設定 (CLLocationManagerDelegate) self.locationManager.delegate = self
// 位置情報へのアクセスへの許可の状態が変化したら呼ばれる private func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { print("location AuthorizationStatus:\(status)") }
通知の使用許可リクエストと通知受信時処理の実装
以下の記事をご覧ください。
位置情報に基づいて発火するローカル通知を作成する
作成方法は、基本的に「時限式のローカル通知」や「指定日時に発火するローカル通知」と同じであり、使用するトリガーオブジェクトだけが異なります。
位置情報に基づいて発火するローカル通知の場合は、UNLocationNotificationTrigger
を使用します。
以下の例では 「中心座標 (35.697275, 139.774728)」「半径 1000m」の円に入った時に発火する通知を作成しています。
// UNMutableNotificationContent 作成 let content = UNMutableNotificationContent() content.title = "Hello!" content.body = "Enter Headquarter" content.sound = UNNotificationSound.default() // UNLocationNotificationTrigger 作成 let coordinate = CLLocationCoordinate2DMake(35.697275, 139.774728) let region = CLCircularRegion.init(center: coordinate, radius: 1000.0, identifier: "Headquarter") region.notifyOnEntry = true; region.notifyOnExit = false; let trigger = UNLocationNotificationTrigger.init(region: region, repeats: false) // id, content, trigger から UNNotificationRequest 作成 let request = UNNotificationRequest.init(identifier: "LocationNotification", content: content, trigger: trigger) // UNUserNotificationCenter に request を追加 let center = UNUserNotificationCenter.current() center.add(request)
さいごに
本記事では User Notifications framework を使用して位置情報に基づいて発火するローカル通知を作成する方法を紹介しました。次回は UNUserNotificationCenter に追加した通知を管理する機能などを試してみようと思います!