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されると思います。