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)
{
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.");

View File

@ -11,6 +11,22 @@ namespace eShopOnContainers.iOS.Services
{
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
PermissionStatus GetLocationPermissionStatus(Permission permission)
@ -64,22 +80,22 @@ namespace eShopOnContainers.iOS.Services
EventHandler<CLAuthorizationChangedEventArgs> authCallback = null;
var tcs = new TaskCompletionSource<PermissionStatus>();
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.");
}