From 6fb962c055a19fef5437e9fba2bc935bdefa56a5 Mon Sep 17 00:00:00 2001
From: Maurits van Beusekom <maurits@baseflow.com>
Date: Wed, 27 Dec 2023 22:37:21 +0200
Subject: [PATCH] Ensures [CLLocationManager locationServicesEnabled] is called
 on background thread (#1399)

* Call locationServiceEnabled on separate thread

* Update version number

* Remove redundant empty lines
---
 geolocator_apple/CHANGELOG.md                     |  5 +++++
 .../Handlers/LocationServiceStreamHandler.m       | 15 ++++++++++-----
 geolocator_apple/pubspec.yaml                     |  2 +-
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/geolocator_apple/CHANGELOG.md b/geolocator_apple/CHANGELOG.md
index 7ba7387e5..b915352b9 100644
--- a/geolocator_apple/CHANGELOG.md
+++ b/geolocator_apple/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.3.3
+
+* Ensures the `[CLLocationManager locationServicesEnabled]` message is called
+on a background thread when listening for service updates.
+
 ## 2.3.2
 
 * Fixes build error and warnings regarding unused variables and unavailable APIs on macOS.
diff --git a/geolocator_apple/ios/Classes/Handlers/LocationServiceStreamHandler.m b/geolocator_apple/ios/Classes/Handlers/LocationServiceStreamHandler.m
index 31fac8baf..ac6e8ff4c 100644
--- a/geolocator_apple/ios/Classes/Handlers/LocationServiceStreamHandler.m
+++ b/geolocator_apple/ios/Classes/Handlers/LocationServiceStreamHandler.m
@@ -34,11 +34,16 @@ - (FlutterError * _Nullable)onListenWithArguments:(id _Nullable)arguments eventS
 }
 
 - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
-  if ([CLLocationManager locationServicesEnabled]) {
-    _eventSink([NSNumber numberWithInt:(ServiceStatus)enabled]);
-  } else {
-    _eventSink([NSNumber numberWithInt:(ServiceStatus)disabled]);
-  }
+  dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+    BOOL isEnabled = [CLLocationManager locationServicesEnabled];
+    dispatch_async(dispatch_get_main_queue(), ^(void) {
+        if (isEnabled) {
+            self->_eventSink([NSNumber numberWithInt:(ServiceStatus)enabled]);
+        } else {
+            self->_eventSink([NSNumber numberWithInt:(ServiceStatus)disabled]);
+        }
+    });
+  });
 }
 
 @end
diff --git a/geolocator_apple/pubspec.yaml b/geolocator_apple/pubspec.yaml
index 529aea4d8..d44528774 100644
--- a/geolocator_apple/pubspec.yaml
+++ b/geolocator_apple/pubspec.yaml
@@ -2,7 +2,7 @@ name: geolocator_apple
 description: Geolocation Apple plugin for Flutter. This plugin provides the Apple implementation for the geolocator.
 repository: https://github.com/baseflow/flutter-geolocator/tree/main/geolocator_apple
 issue_tracker: https://github.com/baseflow/flutter-geolocator/issues?q=is%3Aissue+is%3Aopen
-version: 2.3.2
+version: 2.3.3
 
 environment:
   sdk: ">=2.15.0 <4.0.0"