From 46faaac4b21444db9690cf91b00d9e537fd7c0f4 Mon Sep 17 00:00:00 2001 From: Yuto Tokunaga Date: Sat, 21 Mar 2026 14:22:03 +0900 Subject: [PATCH 1/2] 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) From c8ab0ae7be7ae2d10b983a0e0b6fd68729b98868 Mon Sep 17 00:00:00 2001 From: Yuto Tokunaga Date: Sat, 21 Mar 2026 14:46:50 +0900 Subject: [PATCH 2/2] fix(ios): restore locationServicesEnabled() guard in currentPermissions The global Location Services check was inadvertently dropped when switching to appModel.locationAuthorizationStatus(). Without it the gateway can advertise location as usable while system-wide Location Services are off. --- apps/ios/Sources/Gateway/GatewayConnectionController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/ios/Sources/Gateway/GatewayConnectionController.swift b/apps/ios/Sources/Gateway/GatewayConnectionController.swift index 8b0480fcd3f..5ce40eeaa1f 100644 --- a/apps/ios/Sources/Gateway/GatewayConnectionController.swift +++ b/apps/ios/Sources/Gateway/GatewayConnectionController.swift @@ -895,6 +895,7 @@ final class GatewayConnectionController { if let appModel = self.appModel { permissions["location"] = Self.isLocationAuthorized( status: appModel.locationAuthorizationStatus()) + && CLLocationManager.locationServicesEnabled() } permissions["screenRecording"] = RPScreenRecorder.shared().isAvailable