iOS LocationService threading issues resolved.

This commit is contained in:
David Britch 2018-02-21 16:52:27 +00:00
parent a43086fe2c
commit 32c85b327f
2 changed files with 22 additions and 7 deletions

View File

@ -35,13 +35,12 @@ namespace eShopOnContainers.iOS.Services
async Task<bool> CheckPermissions(Permission permission) async Task<bool> CheckPermissions(Permission permission)
{ {
IPermissionsService permissionsService = new PermissionsService(); var status = await PermissionsService.Current.CheckPermissionStatusAsync(permission);
var status = await permissionsService.CheckPermissionStatusAsync(permission);
if (status != PermissionStatus.Granted) if (status != PermissionStatus.Granted)
{ {
Console.WriteLine("Currently do not have Location permissions, requesting permissions"); 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) if (request[permission] != PermissionStatus.Granted)
{ {
Console.WriteLine("Location permission denied, can not get positions async."); Console.WriteLine("Location permission denied, can not get positions async.");

View File

@ -11,6 +11,22 @@ namespace eShopOnContainers.iOS.Services
{ {
public class PermissionsService : IPermissionsService public class PermissionsService : IPermissionsService
{ {
CLLocationManager _locationManager;
static Lazy<IPermissionsService> implementation = new Lazy<IPermissionsService>(CreatePermissions, System.Threading.LazyThreadSafetyMode.PublicationOnly);
static IPermissionsService CreatePermissions()
{
return new PermissionsService();
}
public static IPermissionsService Current
{
get
{
return implementation.Value;
}
}
#region Internal Implementation #region Internal Implementation
PermissionStatus GetLocationPermissionStatus(Permission permission) PermissionStatus GetLocationPermissionStatus(Permission permission)
@ -64,22 +80,22 @@ namespace eShopOnContainers.iOS.Services
EventHandler<CLAuthorizationChangedEventArgs> authCallback = null; EventHandler<CLAuthorizationChangedEventArgs> authCallback = null;
var tcs = new TaskCompletionSource<PermissionStatus>(); var tcs = new TaskCompletionSource<PermissionStatus>();
var locationManager = new CLLocationManager(); _locationManager = new CLLocationManager();
authCallback = (sender, e) => authCallback = (sender, e) =>
{ {
if (e.Status == CLAuthorizationStatus.NotDetermined) if (e.Status == CLAuthorizationStatus.NotDetermined)
return; return;
locationManager.AuthorizationChanged -= authCallback; _locationManager.AuthorizationChanged -= authCallback;
tcs.TrySetResult(GetLocationPermissionStatus(permission)); tcs.TrySetResult(GetLocationPermissionStatus(permission));
}; };
locationManager.AuthorizationChanged += authCallback; _locationManager.AuthorizationChanged += authCallback;
var info = NSBundle.MainBundle.InfoDictionary; var info = NSBundle.MainBundle.InfoDictionary;
if (permission == Permission.LocationWhenInUse) if (permission == Permission.LocationWhenInUse)
{ {
if (info.ContainsKey(new NSString("NSLocationWhenInUseUsageDescription"))) if (info.ContainsKey(new NSString("NSLocationWhenInUseUsageDescription")))
locationManager.RequestWhenInUseAuthorization(); _locationManager.RequestWhenInUseAuthorization();
else 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."); 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.");
} }