From 32c85b327f90a0ddb43bbb7e6bc22746ff570604 Mon Sep 17 00:00:00 2001 From: David Britch Date: Wed, 21 Feb 2018 16:52:27 +0000 Subject: [PATCH] iOS LocationService threading issues resolved. --- .../Services/LocationServiceImplementation.cs | 5 ++-- .../Services/PermissionsService.cs | 24 +++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/LocationServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/LocationServiceImplementation.cs index babd6e45d..abd85b17d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/LocationServiceImplementation.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/LocationServiceImplementation.cs @@ -35,13 +35,12 @@ namespace eShopOnContainers.iOS.Services async Task CheckPermissions(Permission permission) { - IPermissionsService permissionsService = new PermissionsService(); - var status = await permissionsService.CheckPermissionStatusAsync(permission); + var status = await PermissionsService.Current.CheckPermissionStatusAsync(permission); if (status != PermissionStatus.Granted) { Console.WriteLine("Currently do not have Location permissions, requesting permissions"); - var request = await permissionsService.RequestPermissionsAsync(permission); + var request = await PermissionsService.Current.RequestPermissionsAsync(permission); if (request[permission] != PermissionStatus.Granted) { Console.WriteLine("Location permission denied, can not get positions async."); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/PermissionsService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/PermissionsService.cs index 8392bd1df..2b7ce5c43 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/PermissionsService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/PermissionsService.cs @@ -11,6 +11,22 @@ namespace eShopOnContainers.iOS.Services { public class PermissionsService : IPermissionsService { + CLLocationManager _locationManager; + + static Lazy implementation = new Lazy(CreatePermissions, System.Threading.LazyThreadSafetyMode.PublicationOnly); + static IPermissionsService CreatePermissions() + { + return new PermissionsService(); + } + + public static IPermissionsService Current + { + get + { + return implementation.Value; + } + } + #region Internal Implementation PermissionStatus GetLocationPermissionStatus(Permission permission) @@ -64,22 +80,22 @@ namespace eShopOnContainers.iOS.Services EventHandler authCallback = null; var tcs = new TaskCompletionSource(); - var locationManager = new CLLocationManager(); + _locationManager = new CLLocationManager(); authCallback = (sender, e) => { if (e.Status == CLAuthorizationStatus.NotDetermined) return; - locationManager.AuthorizationChanged -= authCallback; + _locationManager.AuthorizationChanged -= authCallback; tcs.TrySetResult(GetLocationPermissionStatus(permission)); }; - locationManager.AuthorizationChanged += authCallback; + _locationManager.AuthorizationChanged += authCallback; var info = NSBundle.MainBundle.InfoDictionary; if (permission == Permission.LocationWhenInUse) { if (info.ContainsKey(new NSString("NSLocationWhenInUseUsageDescription"))) - locationManager.RequestWhenInUseAuthorization(); + _locationManager.RequestWhenInUseAuthorization(); else throw new UnauthorizedAccessException("On iOS 8.0 and higher you must set either NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription in your Info.plist file to enable Authorization Requests for Location updates."); }