LoginSignup
1
4

More than 3 years have passed since last update.

SwiftUIで位置情報を取得できるようになるまでの道のり

Last updated at Posted at 2021-02-15

SwiftUI初心者が位置情報を取得できるようになるまでの道のりを簡単にメモしておきます。

とりあえず以下を参考にしています。
- SwiftUIで位置情報をコンソールに出力する
- 【SwiftUI】SwiftUIでAppDelegateの処理を実装する方法
- その他、Apple公式ドキュメントなど

事前準備

まずは以下の設定が必要です。
- CoreLocationの追加
- info.plistにPrivacyを追加
- バックグラウンド処理の許可

CoreLocationの追加

TARGETS -> Build Phases の Link Binary With Libraries に CoreLocation.frameworkを追加して下しあ。

info.plistにPrivacyを追加

info.plistに以下の2つを追加してください。
- Privacy - Location Always and When In Use Usage Description
- Privacy - Location When in Use Usage Description
どちらも、Valueを設定しとく必要がありますので、適当な説明文を設定してください。

バックグラウンド処理の許可

TARGETS -> Signing & Capabilities の +Capability を選択し、Background Modesを追加してください。
バックグラウンド処理を選択できるようになるので、Location updatesにチェックを入れてください。
アプリがバックグラウンドになったときに位置情報を更新する必要がない場合は、不要です。

XXXXApp.swiftの編集

前処理が終わったらコードを追加していきます。
- Life CycleをSwiftUIに設定している場合、AppDelegateで細かい制御を行うために@UIApplicationDelegateAdaptorを使用する必要があります。
- AppDelegeteを使ってアプリ起動時に位置情報取得を開始するようにしています。

XXXXApp.swift

import SwiftUI
import CoreLocation //CoreLocationを利用

@main
struct CHIAPON3App: App {

    //AppDelegateを設定できるようにする
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

// アプリの起動時に、位置情報を利用できるように設定してしまう
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate{
    var locationManager : CLLocationManager?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool{
        locationManager = CLLocationManager()
        locationManager!.delegate = self
        locationManager!.requestAlwaysAuthorization()


        if CLLocationManager.locationServicesEnabled(){
            locationManager!.desiredAccuracy = kCLLocationAccuracyThreeKilometers //精度3km(かなり低め に設定している)
            locationManager!.distanceFilter = 10
            locationManager!.allowsBackgroundLocationUpdates = true //バックグラウンド処理を可能にする
            locationManager!.pausesLocationUpdatesAutomatically = false //ポーズしても位置取得を続ける
            locationManager!.startUpdatingLocation()
        }

        return true
    }

    //位置情報に変化があった場合の処理(今回は単純に緯度と軽度を出力する)
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
        guard let newLocation = locations.last else {
            return
        }

        let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude)
        print("緯度: ", location.latitude, "経度: ", location.longitude)
    }
}

これで実行すると、緯度と軽度がprintされると思います。

1
4
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
1
4