Skip to content
This repository was archived by the owner on Nov 17, 2023. It is now read-only.

Commit 32c85b3

Browse files
David BritchDavid Britch
authored andcommitted
iOS LocationService threading issues resolved.
1 parent a43086f commit 32c85b3

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/LocationServiceImplementation.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,12 @@ public LocationServiceImplementation()
3535

3636
async Task<bool> CheckPermissions(Permission permission)
3737
{
38-
IPermissionsService permissionsService = new PermissionsService();
39-
var status = await permissionsService.CheckPermissionStatusAsync(permission);
38+
var status = await PermissionsService.Current.CheckPermissionStatusAsync(permission);
4039
if (status != PermissionStatus.Granted)
4140
{
4241
Console.WriteLine("Currently do not have Location permissions, requesting permissions");
4342

44-
var request = await permissionsService.RequestPermissionsAsync(permission);
43+
var request = await PermissionsService.Current.RequestPermissionsAsync(permission);
4544
if (request[permission] != PermissionStatus.Granted)
4645
{
4746
Console.WriteLine("Location permission denied, can not get positions async.");

src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/PermissionsService.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,22 @@ namespace eShopOnContainers.iOS.Services
1111
{
1212
public class PermissionsService : IPermissionsService
1313
{
14+
CLLocationManager _locationManager;
15+
16+
static Lazy<IPermissionsService> implementation = new Lazy<IPermissionsService>(CreatePermissions, System.Threading.LazyThreadSafetyMode.PublicationOnly);
17+
static IPermissionsService CreatePermissions()
18+
{
19+
return new PermissionsService();
20+
}
21+
22+
public static IPermissionsService Current
23+
{
24+
get
25+
{
26+
return implementation.Value;
27+
}
28+
}
29+
1430
#region Internal Implementation
1531

1632
PermissionStatus GetLocationPermissionStatus(Permission permission)
@@ -64,22 +80,22 @@ Task<PermissionStatus> RequestLocationPermissionAsync(Permission permission = Pe
6480

6581
EventHandler<CLAuthorizationChangedEventArgs> authCallback = null;
6682
var tcs = new TaskCompletionSource<PermissionStatus>();
67-
var locationManager = new CLLocationManager();
83+
_locationManager = new CLLocationManager();
6884

6985
authCallback = (sender, e) =>
7086
{
7187
if (e.Status == CLAuthorizationStatus.NotDetermined)
7288
return;
73-
locationManager.AuthorizationChanged -= authCallback;
89+
_locationManager.AuthorizationChanged -= authCallback;
7490
tcs.TrySetResult(GetLocationPermissionStatus(permission));
7591
};
76-
locationManager.AuthorizationChanged += authCallback;
92+
_locationManager.AuthorizationChanged += authCallback;
7793

7894
var info = NSBundle.MainBundle.InfoDictionary;
7995
if (permission == Permission.LocationWhenInUse)
8096
{
8197
if (info.ContainsKey(new NSString("NSLocationWhenInUseUsageDescription")))
82-
locationManager.RequestWhenInUseAuthorization();
98+
_locationManager.RequestWhenInUseAuthorization();
8399
else
84100
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.");
85101
}

0 commit comments

Comments
 (0)