[iPhone] GPSなど位置情報をCoreLocationを使って取得

GPSに代表される位置情報はスマホでは重要なファクターです。iOSでの位置情報の取得をXcodeで実装してみます。


Swift 5.1
Xcode 11.4.1

CoreLocation

位置情報を取得するにはCoreLocationのFrameworkを使います。
GPS/GNSSの衛星測位だけでなくWiFi、携帯電話通信網やデジタルコンパス、Bluetoothなどを使用して位置を測定しています。

衛星測位システムでは、日本の準天頂衛星みちびき、GPS、GLONASS、ガリレオにも対応しています。

iPhone11からはUWB(超広帯域無線)を使用した空間認識用「U1チップ」を搭載していてこれも室内などの近距離測位が可能です。

サンプルコード

実装自体はそれほど複雑ではありませんが、それなりに気をつけることやiOSのバージョンアップで変更されたところがあります。

ViewController.swift


尚、これだけコピへしても動きません、以下の設定が必要です。

framework等の設定

faramework:

CoreLocation.framework の設定
「TARGETS」「Build Phases」「Link Binary With Libraries」から「+」をクリックしてCoreLocation.frameworkを追加します。



CoreLocationを検索して「Add」



frameworkが追加されました。



ユーザー許可:
Privacyの許可を尋ねる設定を Info.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