56 lines
1.5 KiB
Swift
56 lines
1.5 KiB
Swift
//
|
|
// LocationManager.swift
|
|
// Gas Man
|
|
//
|
|
// Created by Kameron Kenny on 3/17/25.
|
|
//
|
|
|
|
|
|
import Foundation
|
|
import CoreLocation
|
|
import Combine
|
|
|
|
class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
|
|
private let manager = CLLocationManager()
|
|
|
|
@Published var location: CLLocation?
|
|
@Published var placemark: CLPlacemark?
|
|
|
|
override init() {
|
|
super.init()
|
|
manager.delegate = self
|
|
manager.desiredAccuracy = kCLLocationAccuracyBest
|
|
}
|
|
|
|
func requestLocation() {
|
|
manager.requestWhenInUseAuthorization()
|
|
manager.requestLocation()
|
|
}
|
|
|
|
// CLLocationManagerDelegate
|
|
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
|
|
if let loc = locations.first {
|
|
DispatchQueue.main.async {
|
|
self.location = loc
|
|
}
|
|
// Reverse geocode
|
|
let geocoder = CLGeocoder()
|
|
geocoder.reverseGeocodeLocation(loc) { [weak self] placemarks, error in
|
|
if let error = error {
|
|
print("Reverse geocode error: \(error)")
|
|
return
|
|
}
|
|
if let firstPlacemark = placemarks?.first {
|
|
DispatchQueue.main.async {
|
|
self?.placemark = firstPlacemark
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
|
|
print("Failed to get user location: \(error)")
|
|
}
|
|
}
|