21
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Swift】位置情報を取得する

Posted at

概要

swiftで位置情報を取得する方法について、まとめました。

startUpdatingLocation() で位置情報の取得を開始し、取得した場合 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) が呼び出され位置情報を確認することだできます。

class ViewController: UIViewController, CLLocationManagerDelegate {

      var locationManager : CLLocationManager?

      override func viewDidLoad() {
            super.viewDidLoad()

            locationManager = CLLocationManager()
            locationManager!.delegate = self

            //位置情報を使用可能か
            if CLLocationManager.locationServicesEnabled() {
            
                 //位置情報の取得開始
                 locationManager!.startUpdatingLocation()
            
            }
     }

     // 位置情報を取得した場合
     func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

     }
}

info.listに追記

位置情報を取得する場合、info.list に「Location Always and When In Use Usage Description」、「Location When In Use Usage Description」を追加し位置情報どのように使用するか記載する必要があります。

info.list
// ユーザーの位置情報へのアクセスを常に要求している理由を記載します。
Privacy - Location Always and When In Use Usage Description

// フォアグラウンドで実行されているときに、アプリがユーザーの位置情報へのアクセスを要求する理由を記載します。
Privacy - Location When In Use Usage Description

位置情報を取得する際の設定

位置情報を取得する際に、精度や取得間隔の指定ができます。

locationManager = CLLocationManager()
locationManager!.delegate = self
        
// 常に使用する場合、バックグラウンドでも取得するようにする
if CLLocationManager.authorizationStatus() == .authorizedAlways {
     // バックグラウンドでも取得する
     locationManager!.allowsBackgroundLocationUpdates = true
} else {
     // バックグラウンドでは取得しない
     locationManager!.allowsBackgroundLocationUpdates = false
}

// 位置情報の取得精度を指定します
locationManager!.desiredAccuracy = kCLLocationAccuracyBest

// 更新に必要な最小移動距離
// Int値を指定することで、○○m間隔で取得するようになります
locationManager!.distanceFilter = 10

// 移動手段を指定します
// 徒歩、自動車等
locationManager!.activityType = .fitness

// 位置情報取得開始
locationManager!.startUpdatingHeading()

CLLocationManager.authorizationStatusの設定値

authorizationStatus 設定
.notDetermined 未設定
.restricted 機能が制限されている
.denied 許可しない
.authorizedWhenInUse このAppの使用中のみ許可
.authorizedAlways 常に許可

activityTypeの設置値

activityType 移動手段
.fitness 徒歩
.automotiveNavigation 自動車
.other その他

desiredAccuracyの設置値

desiredAccuracy 精度
kCLLocationAccuracyBestForNavigation デフォルト
kCLLocationAccuracyBest 最高精度
kCLLocationAccuracyNearestTenMeters 10m以内
kCLLocationAccuracyHundredMeters 100m以内
kCLLocationAccuracyKilometer 1km以内
kCLLocationAccuracyThreeKilometers 3km以内

位置情報を取得した場合

位置情報を取得した場合以下の、関数を呼び出し緯度経度等の情報を取得できます。

// 位置情報取得した場合
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        
     guard let newLocation = locations.last else {
          return
     }

     let location:CLLocationCoordinate2D
            = CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude)
        
     let formatter: DateFormatter = DateFormatter()
     formatter.timeZone   = TimeZone(identifier: "Asia/Tokyo")
     formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
     let date = formatter.string(from: newLocation.timestamp)

   print("緯度:", location.latitude, "経度:", location.longitude, "時間:", date)

}

#参考
CLLocationManager

21
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?