位置情報を使ったものを作ろうとして色々調べたので、記録しておきます。 https://softmoco.com/basics/how-to-get-current-location-in-ios-app.php
ひとまず取得する用のclassを作る
もうだいぶいろんなサイトからかいつまんで作ってみました。
今回作った流れとしては、
1.CoreLocationを使う
2.ObservableObject を使って取得状況を監視する(ワイはこの使い方が必要だった)
3.CLLocationManagerDelegate ってのはプロトコルだから、定義した名前の関数を使って実装せんといけん
みたいな、そんな感じ。ひとまず脳死的に作ったものを記録する
コード
import CoreLocation
class LocationPostModel: NSObject, ObservableObject, CLLocationManagerDelegate {
@Published var authorizationStatus: CLAuthorizationStatus
@Published var lastSeenLocation: CLLocation?
private let locationManager: CLLocationManager
override init() {
locationManager = CLLocationManager()
///ここからCLLocationManagerの設定とか入れていく
///位置情報の利用許可設定の状況
authorizationStatus = locationManager.authorizationStatus
super.init()
//// delegate かこのclass自体になってるのでselfにしとくらしい。
locationManager.delegate = self
///どのくらいの精度で位置情報を取るからしい。精度高いと電池消費でかいらしい
locationManager.desiredAccuracy = kCLLocationAccuracyBest
///どのくらい移動したら取り直しするか?の設定らしい。メートル
locationManager.distanceFilter = 10
///バックグランドで実行中も座標取得すんのか?って設定。しなくていいのでfalse
locationManager.allowsBackgroundLocationUpdates = false
///なんか再度取得する必要がない時は再取得しないという自動設定らしく、trueにすると電力節約になるとか
locationManager.pausesLocationUpdatesAutomatically = true
///取得開始
locationManager.startUpdatingLocation()
}
///この関数は、権限の要求の時のあの選択画面を表示するものらしい。
func requestPermission() {
locationManager.requestWhenInUseAuthorization() ///起動中のみ取得する
/// locationManager.requestAlwaysAuthorization() // バックグラウンド実行中も座標取得する場合はこちらを使う
}
///権限が更新された時に実行されるらしい。 authorizationStatus が権限状況なので、authorizationStatus を更新する
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
authorizationStatus = manager.authorizationStatus
}
///スタートした後、更新で再取得とか、この関数が実行されるらしい。メイン部分
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let loc = locations.last else{return}
lastSeenLocation = loc
///市町村名前とか取りたい時、CLLocationから、取り出す
CLGeocoder().reverseGeocodeLocation(loc){(placemarks, error) in
if let error = error {
print("reverseGeocodeLocation Failed: \(error.localizedDescription)")
return
}
if let placemark = placemarks?[0] {
///緯度
print("loc.coordinate.latitude")
///経度
print("loc.coordinate.longitude")
///国名前 ex) 日本
print("placemark.country")
///国コード ex) JP
print("placemark.isoCountryCode")
/// 都道府県 ex) 東京都
print("placemark.administrativeArea")
///市町村 ex)立川市
print("placemark.locality")
///市町村の次のレイヤー ex) 泉町
print("placemark.subLocality")
///市町村の次のレイヤーの丁目などがついた場合 ex)泉町1156番地
print("placemark.thoroughfare")
///座標が池とかの上の場合、池の名前とか
print("placemark.inlandWater")
///郵便番号
print("(placemark.postalCode")
///市の後の全部
print("(placemark.name")
}
}
}
}
これで色々できる。
あとはめんどくさいので省略