概要
アプリ内で位置情報を取得し、指定範囲内にいるかどうか判定する手順を記載します。
現在地情報の取得
Info.plistに追記する
位置情報を使用する際、Info.plistに「Privacy – Location When In Use Usage Description」を追加する必要があります。Valueには、確認時に表示されるメッセージを入力してください。
CoreLocationをインポートする
位置情報を取得するために必要な「CoreLocation」をインポートします。
import CoreLocation
CLLocationManagerクラスを用いて現在位置を取得する
委譲先を自身に設定し、位置情報の許可設定を行います。
許可設定を行うことで、アプリ初回起動時に位置情報に関するダイアログが出現します。また、ここにInfo.plistに設定したメッセージが記載されます。
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
self.locationManager.delegate = self
self.locationManager.requestWhenInUseAuthorization() // 位置情報の許可設定
}
位置情報を取得するための処理を記載していきます。
・didUpdateLocations:新しい位置情報が取得された際に実行されます
・didFailWithError:位置情報が取得できなかった際に実行されます
// MARK: - CLLocationManagerDelegate
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let loc = locations.last else { return }
print("location: \(loc)")
print("緯度: \(loc.coordinate.latitude)")
print("経度: \(loc.coordinate.longitude)")
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("位置情報取得エラー: \(error)")
}
}
最後にボタンを用意し、押下時に位置情報を取得できるようにします。
@IBAction func getLocation(_ sender: Any) {
self.locationManager.requestLocation()
}
これで現在地を取得する準備は整ったので、ビルドしボタンを押下すると以下のようなログが出力され現在地が取得できていることがわかります。
※シミュレータでの位置情報設定は、「Features→Location→CustomLocation」で設定することができます。
location: <+35.65840800,+139.74513200> +/- 5.00m (speed -1.00 mps / course -1.00) @ 11/7/23 午後7:55:09 日本標準時
緯度: 35.658408
経度: 139.745132
指定範囲にいるかの判定処理
指定範囲の作成
CLLocationCoordinate2Dを用いて対象となる座標を作成します。
let pointLocation = CLLocationCoordinate2D(latitude: 35.658408, longitude: 139.745132)
対象となる座標から円形の範囲を作成します。
let circularRegion = CLCircularRegion(center: pointLocation, //中心となる座標
radius: 300, //半径メートル
identifier: "identifier")
現在地と指定範囲の比較
CLCircularRegionクラスはCLLocationCoordinate2D型の構造体を引数に取り真偽地を返してくれるcontainsメソッドを持っているのでこちらを使用して判定処理を行います。
取得した現在位置情報からCLLocationCoordinate2D型の座標を取得し、containsメソッドの引数として渡します。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let loc = locations.last else { return }
let pointLocation = CLLocationCoordinate2D(latitude: 35.658408, longitude: 139.745132)
let circularRegion = CLCircularRegion(center: pointLocation, //中心となる座標
radius: 300, //半径メートル
identifier: "identifier")
if circularRegion.contains(loc.coordinate) {
print("指定範囲内です")
}
else {
print("指定範囲外です")
}
}
シミュレータで半径300メートル以内となるところに現在地を設定し判定処理を行ったところ、正しく判定されていることがわかりました。
おわりに
簡単にですが位置情報の取得処理や利用方法をまとめてみました。
CLLocationManagerクラスではまだまだいろいろなことができそうなのでいつかチャレンジしてみようと思います。
ここまで読んでいただきありがとうございました。