GPSに代表される位置情報はスマホでは重要なファクターです。iOSでの位置情報の取得をXcodeで実装してみます。
Xcode 11.4.1
CoreLocation
位置情報を取得するにはCoreLocationのFrameworkを使います。
GPS/GNSSの衛星測位だけでなくWiFi、携帯電話通信網やデジタルコンパス、Bluetoothなどを使用して位置を測定しています。
衛星測位システムでは、日本の準天頂衛星みちびき、GPS、GLONASS、ガリレオにも対応しています。
iPhone11からはUWB(超広帯域無線)を使用した空間認識用「U1チップ」を搭載していてこれも室内などの近距離測位が可能です。
サンプルコード
実装自体はそれほど複雑ではありませんが、それなりに気をつけることやiOSのバージョンアップで変更されたところがあります。
ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
import UIKit import CoreLocation class ViewController: UIViewController , CLLocationManagerDelegate { var locationManager: CLLocationManager! // 測位精度 let locationAccuracy: [Double] = [ kCLLocationAccuracyBestForNavigation, kCLLocationAccuracyBest, kCLLocationAccuracyNearestTenMeters, kCLLocationAccuracyHundredMeters, kCLLocationAccuracyKilometer, kCLLocationAccuracyThreeKilometers ] override func viewDidLoad() { super.viewDidLoad() // locationManager初期化 locationManager = CLLocationManager() // ユーザーの使用許可を確認 locationManager.requestWhenInUseAuthorization() // 使用許可に対するステータス let status = CLLocationManager.authorizationStatus() if status == .authorizedWhenInUse { // delegateを設定 locationManager.delegate = self // 測位精度の設定 locationManager.desiredAccuracy = locationAccuracy[1] // アップデートする距離半径(m) locationManager.distanceFilter = 10 // 位置情報の取得を開始 locationManager.startUpdatingLocation() } } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { // 最初のデータ let location = locations.first // 緯度 let latitude = location?.coordinate.latitude // 経度 let longitude = location?.coordinate.longitude print("latitude: \(latitude!)") print("longitude: \(longitude!)") } } |
尚、これだけコピへしても動きません、以下の設定が必要です。
framework等の設定
faramework:
CoreLocation.framework の設定
「TARGETS」「Build Phases」「Link Binary With Libraries」から「+」をクリックしてCoreLocation.frameworkを追加します。
CoreLocationを検索して「Add」
frameworkが追加されました。
ユーザー許可:
Privacyの許可を尋ねる設定を Info.plist にします。
直接ファイルに記述する方が早いかもしれません
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> ... <key>NSLocationWhenInUseUsageDescription</key> <string>App uses Loacation data</string> ... </dict> </plist> |
ユーザー許可には2種類あります。
- NSLocationWhenInUseUsageDescription
- アプリ使用中のみ許可
- NSLocationAlwaysAndWhenInUseUsageDescription
- 常に許可
ここではアプリ使用中のみの設定でやっていますが、バックグラウンドでの測位ログを記録する場合は常に許可を得ることになります。
測位精度:
- kCLLocationAccuracyBestForNavigation
- ナビゲーションアプリのための高い精度と追加のセンサーも使用する
- kCLLocationAccuracyBest
- 最高レベルの精度
- kCLLocationAccuracyNearestTenMeters
- 10メートル以内の精度
- kCLLocationAccuracyHundredMeters
- 100メートル以内の精度
- kCLLocationAccuracyKilometer
- キロメートルでの精度
- kCLLocationAccuracyThreeKilometers
- 3キロメートルでの精度
高精度にするためにはより多くの消費電力が必要となるので、精度を上げすぎるとバッテリーの減りが早くなるので注意しないといけません。
測位テスト
測位は実機を使わないと最終的には確認できませんが、とりあえずの設定確認としてはSimulatorでもある程度できます。
- Simulatorを起動
- デバッグエリアに「Simulate Location」の矢印をクリック
- 特定のロケーション、あるいはカスタム位置情報を設定
References:
Core Location | Apple Developer Documentation
CLLocationManager – Core Location | Apple Developer
CLLocationAccuracy – Core Location | Apple Developer
requestWhenInUseAuthorization() – Apple Developer
requestAlwaysAuthorization() – Apple Developer
distanceFilter – CLLocationManager | Apple Developer