iOS LocationService threading issues resolved.
This commit is contained in:
parent
a43086fe2c
commit
32c85b327f
@ -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.");
|
||||
|
@ -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.");
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user