[iOS 10] User Notifications framework を使用して位置情報に基づいて発火するローカル通知を作成する #wwdc

2016.06.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんばんは。モバイルアプリサービス部の平屋です。前回の記事に引き続き、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 に追加した通知を管理する機能などを試してみようと思います!

参考資料

Framework Reference

Class Reference