@@ -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
0 commit comments