Skip to content

Commit 82e178f

Browse files
committed
Execute CLLocationManager locationServicesEnabled async
1 parent a88963d commit 82e178f

File tree

3 files changed

+121
-109
lines changed

3 files changed

+121
-109
lines changed

ios/LocationAccuracy/RNPermissionHandlerLocationAccuracy.m

Lines changed: 63 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,31 @@ + (NSString * _Nonnull)handlerUniqueId {
2323
- (void)checkWithResolver:(RCTPromiseResolveBlock _Nonnull)resolve
2424
rejecter:(RCTPromiseRejectBlock _Nonnull)reject {
2525
if (@available(iOS 14, *)) {
26-
if (![CLLocationManager locationServicesEnabled]) {
27-
return reject(@"cannot_check_location_accuracy", @"Location services are disabled", nil);
28-
}
29-
30-
switch ([CLLocationManager authorizationStatus]) {
31-
case kCLAuthorizationStatusNotDetermined:
32-
return reject(@"cannot_check_location_accuracy", @"Location permission hasn't been requested first", nil);
33-
case kCLAuthorizationStatusRestricted:
34-
case kCLAuthorizationStatusDenied:
35-
return reject(@"cannot_check_location_accuracy", @"Location permission has been blocked by the user", nil);
36-
case kCLAuthorizationStatusAuthorizedWhenInUse:
37-
case kCLAuthorizationStatusAuthorizedAlways:
38-
break;
39-
}
40-
41-
CLLocationManager *locationManager = [CLLocationManager new];
42-
43-
switch (locationManager.accuracyAuthorization) {
44-
case CLAccuracyAuthorizationFullAccuracy:
45-
return resolve(@"full");
46-
case CLAccuracyAuthorizationReducedAccuracy:
47-
return resolve(@"reduced");
48-
}
26+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
27+
if (![CLLocationManager locationServicesEnabled]) {
28+
return reject(@"cannot_check_location_accuracy", @"Location services are disabled", nil);
29+
}
30+
31+
switch ([CLLocationManager authorizationStatus]) {
32+
case kCLAuthorizationStatusNotDetermined:
33+
return reject(@"cannot_check_location_accuracy", @"Location permission hasn't been requested first", nil);
34+
case kCLAuthorizationStatusRestricted:
35+
case kCLAuthorizationStatusDenied:
36+
return reject(@"cannot_check_location_accuracy", @"Location permission has been blocked by the user", nil);
37+
case kCLAuthorizationStatusAuthorizedWhenInUse:
38+
case kCLAuthorizationStatusAuthorizedAlways:
39+
break;
40+
}
41+
42+
CLLocationManager *locationManager = [CLLocationManager new];
43+
44+
switch (locationManager.accuracyAuthorization) {
45+
case CLAccuracyAuthorizationFullAccuracy:
46+
return resolve(@"full");
47+
case CLAccuracyAuthorizationReducedAccuracy:
48+
return resolve(@"reduced");
49+
}
50+
});
4951
} else {
5052
reject(@"cannot_check_location_accuracy", @"Only available on iOS 14 or higher", nil);
5153
}
@@ -55,43 +57,45 @@ - (void)requestWithPurposeKey:(NSString * _Nonnull)purposeKey
5557
resolver:(RCTPromiseResolveBlock _Nonnull)resolve
5658
rejecter:(RCTPromiseRejectBlock _Nonnull)reject {
5759
if (@available(iOS 14, *)) {
58-
if (![CLLocationManager locationServicesEnabled]) {
59-
return reject(@"cannot_request_location_accuracy", @"Location services are disabled", nil);
60-
}
61-
62-
switch ([CLLocationManager authorizationStatus]) {
63-
case kCLAuthorizationStatusNotDetermined:
64-
return reject(@"cannot_request_location_accuracy", @"Location permission hasn't been requested first", nil);
65-
case kCLAuthorizationStatusRestricted:
66-
case kCLAuthorizationStatusDenied:
67-
return reject(@"cannot_request_location_accuracy", @"Location permission has been blocked by the user", nil);
68-
case kCLAuthorizationStatusAuthorizedWhenInUse:
69-
case kCLAuthorizationStatusAuthorizedAlways:
70-
break;
71-
}
72-
73-
CLLocationManager *locationManager = [CLLocationManager new];
74-
75-
switch (locationManager.accuracyAuthorization) {
76-
case CLAccuracyAuthorizationFullAccuracy:
77-
return resolve(@"full"); // resolve early if full accuracy is already granted
78-
case CLAccuracyAuthorizationReducedAccuracy:
79-
break;
80-
}
81-
82-
[locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:purposeKey
83-
completion:^(NSError * _Nullable error) {
84-
if (error) {
85-
reject([NSString stringWithFormat:@"%ld", (long)error.code], error.localizedDescription, error);
86-
} else {
87-
switch (locationManager.accuracyAuthorization) {
88-
case CLAccuracyAuthorizationFullAccuracy:
89-
return resolve(@"full");
90-
case CLAccuracyAuthorizationReducedAccuracy:
91-
return resolve(@"reduced");
92-
}
60+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
61+
if (![CLLocationManager locationServicesEnabled]) {
62+
return reject(@"cannot_request_location_accuracy", @"Location services are disabled", nil);
9363
}
94-
}];
64+
65+
switch ([CLLocationManager authorizationStatus]) {
66+
case kCLAuthorizationStatusNotDetermined:
67+
return reject(@"cannot_request_location_accuracy", @"Location permission hasn't been requested first", nil);
68+
case kCLAuthorizationStatusRestricted:
69+
case kCLAuthorizationStatusDenied:
70+
return reject(@"cannot_request_location_accuracy", @"Location permission has been blocked by the user", nil);
71+
case kCLAuthorizationStatusAuthorizedWhenInUse:
72+
case kCLAuthorizationStatusAuthorizedAlways:
73+
break;
74+
}
75+
76+
CLLocationManager *locationManager = [CLLocationManager new];
77+
78+
switch (locationManager.accuracyAuthorization) {
79+
case CLAccuracyAuthorizationFullAccuracy:
80+
return resolve(@"full"); // resolve early if full accuracy is already granted
81+
case CLAccuracyAuthorizationReducedAccuracy:
82+
break;
83+
}
84+
85+
[locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:purposeKey
86+
completion:^(NSError * _Nullable error) {
87+
if (error) {
88+
reject([NSString stringWithFormat:@"%ld", (long)error.code], error.localizedDescription, error);
89+
} else {
90+
switch (locationManager.accuracyAuthorization) {
91+
case CLAccuracyAuthorizationFullAccuracy:
92+
return resolve(@"full");
93+
case CLAccuracyAuthorizationReducedAccuracy:
94+
return resolve(@"reduced");
95+
}
96+
}
97+
}];
98+
});
9599
} else {
96100
reject(@"cannot_request_location_accuracy", @"Only available on iOS 14 or higher", nil);
97101
}

ios/LocationAlways/RNPermissionHandlerLocationAlways.m

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,38 +23,42 @@ + (NSString * _Nonnull)handlerUniqueId {
2323

2424
- (void)checkWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
2525
rejecter:(void (__unused ^ _Nonnull)(NSError * _Nonnull))reject {
26-
if (![CLLocationManager locationServicesEnabled]) {
27-
return resolve(RNPermissionStatusNotAvailable);
28-
}
26+
dispatch_async(dispatch_get_main_queue(), ^{
27+
if (![CLLocationManager locationServicesEnabled]) {
28+
return resolve(RNPermissionStatusNotAvailable);
29+
}
2930

30-
switch ([CLLocationManager authorizationStatus]) {
31-
case kCLAuthorizationStatusNotDetermined:
32-
return resolve(RNPermissionStatusNotDetermined);
33-
case kCLAuthorizationStatusRestricted:
34-
return resolve(RNPermissionStatusRestricted);
35-
case kCLAuthorizationStatusAuthorizedWhenInUse:
36-
case kCLAuthorizationStatusDenied:
37-
return resolve(RNPermissionStatusDenied);
38-
case kCLAuthorizationStatusAuthorizedAlways:
39-
return resolve(RNPermissionStatusAuthorized);
40-
}
31+
switch ([CLLocationManager authorizationStatus]) {
32+
case kCLAuthorizationStatusNotDetermined:
33+
return resolve(RNPermissionStatusNotDetermined);
34+
case kCLAuthorizationStatusRestricted:
35+
return resolve(RNPermissionStatusRestricted);
36+
case kCLAuthorizationStatusAuthorizedWhenInUse:
37+
case kCLAuthorizationStatusDenied:
38+
return resolve(RNPermissionStatusDenied);
39+
case kCLAuthorizationStatusAuthorizedAlways:
40+
return resolve(RNPermissionStatusAuthorized);
41+
}
42+
});
4143
}
4244

4345
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
4446
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
45-
if (![CLLocationManager locationServicesEnabled]) {
46-
return resolve(RNPermissionStatusNotAvailable);
47-
}
48-
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined) {
49-
return [self checkWithResolver:resolve rejecter:reject];
50-
}
47+
dispatch_async(dispatch_get_main_queue(), ^{
48+
if (![CLLocationManager locationServicesEnabled]) {
49+
return resolve(RNPermissionStatusNotAvailable);
50+
}
51+
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined) {
52+
return [self checkWithResolver:resolve rejecter:reject];
53+
}
5154

52-
_resolve = resolve;
53-
_reject = reject;
55+
self->_resolve = resolve;
56+
self->_reject = reject;
5457

55-
_locationManager = [CLLocationManager new];
56-
[_locationManager setDelegate:self];
57-
[_locationManager requestAlwaysAuthorization];
58+
self->_locationManager = [CLLocationManager new];
59+
[self->_locationManager setDelegate:self];
60+
[self->_locationManager requestAlwaysAuthorization];
61+
});
5862
}
5963

6064
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {

ios/LocationWhenInUse/RNPermissionHandlerLocationWhenInUse.m

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,42 @@ + (NSString * _Nonnull)handlerUniqueId {
2222

2323
- (void)checkWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
2424
rejecter:(void (__unused ^ _Nonnull)(NSError * _Nonnull))reject {
25-
if (![CLLocationManager locationServicesEnabled]) {
26-
return resolve(RNPermissionStatusNotAvailable);
27-
}
25+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
26+
if (![CLLocationManager locationServicesEnabled]) {
27+
return resolve(RNPermissionStatusNotAvailable);
28+
}
2829

29-
switch ([CLLocationManager authorizationStatus]) {
30-
case kCLAuthorizationStatusNotDetermined:
31-
return resolve(RNPermissionStatusNotDetermined);
32-
case kCLAuthorizationStatusRestricted:
33-
return resolve(RNPermissionStatusRestricted);
34-
case kCLAuthorizationStatusDenied:
35-
return resolve(RNPermissionStatusDenied);
36-
case kCLAuthorizationStatusAuthorizedWhenInUse:
37-
case kCLAuthorizationStatusAuthorizedAlways:
38-
return resolve(RNPermissionStatusAuthorized);
39-
}
30+
switch ([CLLocationManager authorizationStatus]) {
31+
case kCLAuthorizationStatusNotDetermined:
32+
return resolve(RNPermissionStatusNotDetermined);
33+
case kCLAuthorizationStatusRestricted:
34+
return resolve(RNPermissionStatusRestricted);
35+
case kCLAuthorizationStatusDenied:
36+
return resolve(RNPermissionStatusDenied);
37+
case kCLAuthorizationStatusAuthorizedWhenInUse:
38+
case kCLAuthorizationStatusAuthorizedAlways:
39+
return resolve(RNPermissionStatusAuthorized);
40+
}
41+
});
4042
}
4143

4244
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
4345
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
44-
if (![CLLocationManager locationServicesEnabled]) {
45-
return resolve(RNPermissionStatusNotAvailable);
46-
}
47-
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined) {
48-
return [self checkWithResolver:resolve rejecter:reject];
49-
}
46+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
47+
if (![CLLocationManager locationServicesEnabled]) {
48+
return resolve(RNPermissionStatusNotAvailable);
49+
}
50+
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined) {
51+
return [self checkWithResolver:resolve rejecter:reject];
52+
}
5053

51-
_resolve = resolve;
52-
_reject = reject;
54+
self->_resolve = resolve;
55+
self->_reject = reject;
5356

54-
_locationManager = [CLLocationManager new];
55-
[_locationManager setDelegate:self];
56-
[_locationManager requestWhenInUseAuthorization];
57+
self->_locationManager = [CLLocationManager new];
58+
[self->_locationManager setDelegate:self];
59+
[self->_locationManager requestWhenInUseAuthorization];
60+
});
5761
}
5862

5963
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {

0 commit comments

Comments
 (0)