From 46faaac4b21444db9690cf91b00d9e537fd7c0f4 Mon Sep 17 00:00:00 2001 From: Yuto Tokunaga Date: Sat, 21 Mar 2026 14:22:03 +0900 Subject: [PATCH] fix(ios): use existing CLLocationManager for authorizationStatus check Avoid creating a throwaway CLLocationManager() on the main thread in currentPermissions(). Route through NodeAppModel.locationAuthorizationStatus() which reads from the delegate-managed LocationService instance instead. --- apps/ios/Sources/Gateway/GatewayConnectionController.swift | 7 ++++--- apps/ios/Sources/Model/NodeAppModel.swift | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/ios/Sources/Gateway/GatewayConnectionController.swift b/apps/ios/Sources/Gateway/GatewayConnectionController.swift index dc94f3d0797..8b0480fcd3f 100644 --- a/apps/ios/Sources/Gateway/GatewayConnectionController.swift +++ b/apps/ios/Sources/Gateway/GatewayConnectionController.swift @@ -892,9 +892,10 @@ final class GatewayConnectionController { permissions["camera"] = AVCaptureDevice.authorizationStatus(for: .video) == .authorized permissions["microphone"] = AVCaptureDevice.authorizationStatus(for: .audio) == .authorized permissions["speechRecognition"] = SFSpeechRecognizer.authorizationStatus() == .authorized - permissions["location"] = Self.isLocationAuthorized( - status: CLLocationManager().authorizationStatus) - && CLLocationManager.locationServicesEnabled() + if let appModel = self.appModel { + permissions["location"] = Self.isLocationAuthorized( + status: appModel.locationAuthorizationStatus()) + } permissions["screenRecording"] = RPScreenRecorder.shared().isAvailable let photoStatus = PHPhotoLibrary.authorizationStatus(for: .readWrite) diff --git a/apps/ios/Sources/Model/NodeAppModel.swift b/apps/ios/Sources/Model/NodeAppModel.swift index 4c0ab81f1a1..5cf59f56ae7 100644 --- a/apps/ios/Sources/Model/NodeAppModel.swift +++ b/apps/ios/Sources/Model/NodeAppModel.swift @@ -1,3 +1,4 @@ +import CoreLocation import OpenClawChatUI import OpenClawKit import OpenClawProtocol @@ -514,6 +515,10 @@ final class NodeAppModel { } } + func locationAuthorizationStatus() -> CLAuthorizationStatus { + self.locationService.authorizationStatus() + } + func requestLocationPermissions(mode: OpenClawLocationMode) async -> Bool { guard mode != .off else { return true } let status = await self.locationService.ensureAuthorization(mode: mode)