From da40b4b0b23456a00a72d55f39008799b89bad1b Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 14 Jul 2025 20:27:02 -0700 Subject: [PATCH] Resume continuation --- Meshtastic/Helpers/LocationsHandler.swift | 22 +++++++++++-------- .../Views/Onboarding/DeviceOnboarding.swift | 3 +-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Meshtastic/Helpers/LocationsHandler.swift b/Meshtastic/Helpers/LocationsHandler.swift index ddcb5d4b..645959f3 100644 --- a/Meshtastic/Helpers/LocationsHandler.swift +++ b/Meshtastic/Helpers/LocationsHandler.swift @@ -10,14 +10,14 @@ import CoreLocation import OSLog // Shared state that manages the `CLLocationManager` and `CLBackgroundActivitySession`. -@MainActor class LocationsHandler: ObservableObject { +@MainActor class LocationsHandler: NSObject, ObservableObject, @preconcurrency CLLocationManagerDelegate { static let shared = LocationsHandler() // Create a single, shared instance of the object. - public let manager: CLLocationManager + public var manager = CLLocationManager() private var background: CLBackgroundActivitySession? var enableSmartPosition: Bool = UserDefaults.enableSmartPosition - @Published var locationsArray: [CLLocation] + @Published var locationsArray: [CLLocation] = [CLLocation]() @Published var isStationary = false @Published var count = 0 @Published var isRecording = false @@ -39,18 +39,22 @@ import OSLog } } // The continuation we will use to asynchronously ask the user permission to track their location. - var permissionContinuation: CheckedContinuation? + private var permissionContinuation: CheckedContinuation? func requestLocationAlwaysPermissions() async -> CLAuthorizationStatus { - self.manager.requestAlwaysAuthorization() return await withCheckedContinuation { continuation in - permissionContinuation = continuation + self.permissionContinuation = continuation + manager.requestAlwaysAuthorization() } } + func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { + // This is the line you need to add + permissionContinuation?.resume(returning: manager.authorizationStatus) + } - private init() { - self.manager = CLLocationManager() // Creating a location manager instance is safe to call here in `MainActor`. + override init() { + super.init() + self.manager.delegate = self self.manager.allowsBackgroundLocationUpdates = true - locationsArray = [CLLocation]() } func startLocationUpdates() { diff --git a/Meshtastic/Views/Onboarding/DeviceOnboarding.swift b/Meshtastic/Views/Onboarding/DeviceOnboarding.swift index bfd97908..8157b33c 100644 --- a/Meshtastic/Views/Onboarding/DeviceOnboarding.swift +++ b/Meshtastic/Views/Onboarding/DeviceOnboarding.swift @@ -174,10 +174,8 @@ struct DeviceOnboarding: View { Button { Task { await requestLocationPermissions() - } UserDefaults.firstLaunch = false - dismiss() } label: { Text("Configure Location Permissions") .frame(maxWidth: .infinity) @@ -282,5 +280,6 @@ struct DeviceOnboarding: View { } else { Logger.services.info("Notification permissions denied") } + dismiss() } }