Skip to content

Commit 1769558

Browse files
committed
Use CLLocationManager instance authorizationStatus on iOS >= 14
1 parent a0d7890 commit 1769558

File tree

3 files changed

+92
-32
lines changed

3 files changed

+92
-32
lines changed

ios/LocationAccuracy/RNPermissionHandlerLocationAccuracy.mm

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ + (NSString * _Nonnull)handlerUniqueId {
1515
- (void)checkWithResolver:(RCTPromiseResolveBlock _Nonnull)resolve
1616
rejecter:(RCTPromiseRejectBlock _Nonnull)reject {
1717
if (@available(iOS 14.0, tvOS 14.0, *)) {
18-
switch ([CLLocationManager authorizationStatus]) {
18+
CLLocationManager *manager = [CLLocationManager new];
19+
20+
switch ([manager authorizationStatus]) {
1921
case kCLAuthorizationStatusNotDetermined:
2022
return reject(@"cannot_check_location_accuracy", @"Location permission hasn't been requested first", nil);
2123
case kCLAuthorizationStatusRestricted:
@@ -43,7 +45,9 @@ - (void)requestWithPurposeKey:(NSString * _Nonnull)purposeKey
4345
resolver:(RCTPromiseResolveBlock _Nonnull)resolve
4446
rejecter:(RCTPromiseRejectBlock _Nonnull)reject {
4547
if (@available(iOS 14.0, tvOS 14.0, *)) {
46-
switch ([CLLocationManager authorizationStatus]) {
48+
CLLocationManager *manager = [CLLocationManager new];
49+
50+
switch ([manager authorizationStatus]) {
4751
case kCLAuthorizationStatusNotDetermined:
4852
return reject(@"cannot_request_location_accuracy", @"Location permission hasn't been requested first", nil);
4953
case kCLAuthorizationStatusRestricted:
@@ -54,21 +58,19 @@ - (void)requestWithPurposeKey:(NSString * _Nonnull)purposeKey
5458
break;
5559
}
5660

57-
CLLocationManager *locationManager = [CLLocationManager new];
58-
59-
switch (locationManager.accuracyAuthorization) {
61+
switch (manager.accuracyAuthorization) {
6062
case CLAccuracyAuthorizationFullAccuracy:
6163
return resolve(@"full"); // resolve early if full accuracy is already granted
6264
case CLAccuracyAuthorizationReducedAccuracy:
6365
break;
6466
}
6567

66-
[locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:purposeKey
67-
completion:^(NSError * _Nullable error) {
68+
[manager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:purposeKey
69+
completion:^(NSError * _Nullable error) {
6870
if (error) {
6971
reject([NSString stringWithFormat:@"%ld", (long)error.code], error.localizedDescription, error);
7072
} else {
71-
switch (locationManager.accuracyAuthorization) {
73+
switch (manager.accuracyAuthorization) {
7274
case CLAccuracyAuthorizationFullAccuracy:
7375
return resolve(@"full");
7476
case CLAccuracyAuthorizationReducedAccuracy:

ios/LocationAlways/RNPermissionHandlerLocationAlways.mm

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,16 @@ + (NSString * _Nonnull)handlerUniqueId {
2020
return @"ios.permission.LOCATION_ALWAYS";
2121
}
2222

23-
- (RNPermissionStatus)currentStatus {
24-
#if TARGET_OS_TV
25-
return RNPermissionStatusNotAvailable;
26-
#else
27-
switch ([CLLocationManager authorizationStatus]) {
23+
- (CLAuthorizationStatus)statusWithManager:(CLLocationManager *)manager {
24+
if (@available(iOS 14.0, tvOS 14.0, *)) {
25+
return [manager authorizationStatus];
26+
} else {
27+
return [CLLocationManager authorizationStatus];
28+
}
29+
}
30+
31+
- (RNPermissionStatus)convertStatus:(CLAuthorizationStatus)status {
32+
switch (status) {
2833
case kCLAuthorizationStatusNotDetermined:
2934
return RNPermissionStatusNotDetermined;
3035
case kCLAuthorizationStatusRestricted:
@@ -35,6 +40,13 @@ - (RNPermissionStatus)currentStatus {
3540
case kCLAuthorizationStatusAuthorizedAlways:
3641
return RNPermissionStatusAuthorized;
3742
}
43+
}
44+
45+
- (RNPermissionStatus)currentStatus {
46+
#if TARGET_OS_TV
47+
return RNPermissionStatusNotAvailable;
48+
#else
49+
return [self convertStatus:[self statusWithManager:[CLLocationManager new]]];
3850
#endif
3951
}
4052

@@ -59,15 +71,13 @@ - (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
5971
- (void)performRequest {
6072
[[NSNotificationCenter defaultCenter] removeObserver:self];
6173

62-
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
74+
CLLocationManager *manager = [CLLocationManager new];
75+
CLAuthorizationStatus status = [self statusWithManager:manager];
6376

6477
if (status != kCLAuthorizationStatusNotDetermined && status != kCLAuthorizationStatusAuthorizedWhenInUse) {
65-
return _resolve([self currentStatus]);
78+
return _resolve([self convertStatus:status]);
6679
}
6780

68-
_locationManager = [CLLocationManager new];
69-
[_locationManager setDelegate:self];
70-
7181
if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
7282
[[NSNotificationCenter defaultCenter] addObserver:self
7383
selector:@selector(onApplicationWillResignActive)
@@ -78,6 +88,9 @@ - (void)performRequest {
7888
[self performSelector:@selector(onApplicationWillResignActiveCheck) withObject:nil afterDelay:0.25];
7989
}
8090

91+
_locationManager = manager;
92+
93+
[_locationManager setDelegate:self];
8194
[_locationManager requestAlwaysAuthorization];
8295
}
8396

@@ -95,27 +108,38 @@ - (void)onApplicationWillResignActiveCheck {
95108
if (_observingApplicationWillResignActive) {
96109
[[NSNotificationCenter defaultCenter] removeObserver:self];
97110
_observingApplicationWillResignActive = false;
98-
99-
[self resolveStatus:[CLLocationManager authorizationStatus]];
111+
[self resolveStatus];
100112
}
101113
}
102114

103115
- (void)onApplicationDidBecomeActive {
104116
[[NSNotificationCenter defaultCenter] removeObserver:self];
105-
[self resolveStatus:[CLLocationManager authorizationStatus]];
117+
[self resolveStatus];
106118
}
107119

120+
#pragma mark - iOS 14+
121+
- (void)locationManagerDidChangeAuthorization:(CLLocationManager *)manager {
122+
if ([manager authorizationStatus] != kCLAuthorizationStatusNotDetermined && !_observingApplicationWillResignActive) {
123+
[self resolveStatus];
124+
}
125+
}
126+
127+
#pragma mark - iOS < 14
108128
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
109129
if (status != kCLAuthorizationStatusNotDetermined && !_observingApplicationWillResignActive) {
110-
[self resolveStatus:status];
130+
[self resolveStatus];
111131
}
112132
}
113133

114-
- (void)resolveStatus:(CLAuthorizationStatus)status {
115-
if (_resolve != nil) {
116-
_resolve([self currentStatus]);
117-
_resolve = nil;
134+
- (void)resolveStatus {
135+
if (_resolve != nil && _locationManager != nil) {
136+
CLAuthorizationStatus status = [self statusWithManager:_locationManager];
137+
118138
[_locationManager setDelegate:nil];
139+
_locationManager = nil;
140+
141+
_resolve([self convertStatus:status]);
142+
_resolve = nil;
119143
}
120144
}
121145

ios/LocationWhenInUse/RNPermissionHandlerLocationWhenInUse.mm

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,16 @@ + (NSString * _Nonnull)handlerUniqueId {
1919
return @"ios.permission.LOCATION_WHEN_IN_USE";
2020
}
2121

22-
- (RNPermissionStatus)currentStatus {
23-
switch ([CLLocationManager authorizationStatus]) {
22+
- (CLAuthorizationStatus)statusWithManager:(CLLocationManager *)manager {
23+
if (@available(iOS 14.0, tvOS 14.0, *)) {
24+
return [manager authorizationStatus];
25+
} else {
26+
return [CLLocationManager authorizationStatus];
27+
}
28+
}
29+
30+
- (RNPermissionStatus)convertStatus:(CLAuthorizationStatus)status {
31+
switch (status) {
2432
case kCLAuthorizationStatusNotDetermined:
2533
return RNPermissionStatusNotDetermined;
2634
case kCLAuthorizationStatusRestricted:
@@ -33,23 +41,49 @@ - (RNPermissionStatus)currentStatus {
3341
}
3442
}
3543

44+
- (RNPermissionStatus)currentStatus {
45+
return [self convertStatus:[self statusWithManager:[CLLocationManager new]]];
46+
}
47+
3648
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
3749
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
38-
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined) {
39-
return resolve([self currentStatus]);
50+
CLLocationManager *manager = [CLLocationManager new];
51+
CLAuthorizationStatus status = [self statusWithManager:manager];
52+
53+
if (status != kCLAuthorizationStatusNotDetermined) {
54+
return resolve([self convertStatus:status]);
4055
}
4156

57+
_locationManager = manager;
4258
_resolve = resolve;
4359

44-
_locationManager = [CLLocationManager new];
4560
[_locationManager setDelegate:self];
4661
[_locationManager requestWhenInUseAuthorization];
4762
}
4863

64+
#pragma mark - iOS 14+
65+
- (void)locationManagerDidChangeAuthorization:(CLLocationManager *)manager {
66+
if ([manager authorizationStatus] != kCLAuthorizationStatusNotDetermined) {
67+
[self resolveStatus];
68+
}
69+
}
70+
71+
#pragma mark - iOS < 14
4972
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
5073
if (status != kCLAuthorizationStatusNotDetermined) {
74+
[self resolveStatus];
75+
}
76+
}
77+
78+
- (void)resolveStatus {
79+
if (_resolve != nil && _locationManager != nil) {
80+
CLAuthorizationStatus status = [self statusWithManager:_locationManager];
81+
5182
[_locationManager setDelegate:nil];
52-
_resolve([self currentStatus]);
83+
_locationManager = nil;
84+
85+
_resolve([self convertStatus:status]);
86+
_resolve = nil;
5387
}
5488
}
5589

0 commit comments

Comments
 (0)