12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #import "RNPermissionHandlerLocationWhenInUse.h"
-
- @import CoreLocation;
-
- @interface RNPermissionHandlerLocationWhenInUse() <CLLocationManagerDelegate>
-
- @property (nonatomic, strong) CLLocationManager *locationManager;
- @property (nonatomic) bool initialChangeEventFired;
- @property (nonatomic, strong) void (^resolve)(RNPermissionStatus status);
- @property (nonatomic, strong) void (^reject)(NSError *error);
-
- @end
-
- @implementation RNPermissionHandlerLocationWhenInUse
-
- + (NSArray<NSString *> * _Nonnull)usageDescriptionKeys {
- return @[@"NSLocationWhenInUseUsageDescription"];
- }
-
- + (NSString * _Nonnull)handlerUniqueId {
- return @"ios.permission.LOCATION_WHEN_IN_USE";
- }
-
- - (void)checkWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
- rejecter:(void (__unused ^ _Nonnull)(NSError * _Nonnull))reject {
- if (![CLLocationManager locationServicesEnabled]) {
- return resolve(RNPermissionStatusNotAvailable);
- }
-
- switch ([CLLocationManager authorizationStatus]) {
- case kCLAuthorizationStatusNotDetermined:
- return resolve(RNPermissionStatusNotDetermined);
- case kCLAuthorizationStatusRestricted:
- return resolve(RNPermissionStatusRestricted);
- case kCLAuthorizationStatusDenied:
- return resolve(RNPermissionStatusDenied);
- case kCLAuthorizationStatusAuthorizedWhenInUse:
- case kCLAuthorizationStatusAuthorizedAlways:
- return resolve(RNPermissionStatusAuthorized);
- }
- }
-
- - (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
- rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
- if (![CLLocationManager locationServicesEnabled]) {
- return resolve(RNPermissionStatusNotAvailable);
- }
-
- if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined) {
- return [self checkWithResolver:resolve rejecter:reject];
- }
-
- _resolve = resolve;
- _reject = reject;
- _initialChangeEventFired = false;
-
- _locationManager = [CLLocationManager new];
- [_locationManager setDelegate:self];
- [_locationManager requestWhenInUseAuthorization];
- }
-
- - (void)onAuthorizationStatus {
- [self checkWithResolver:_resolve rejecter:_reject];
-
- [_locationManager setDelegate:nil];
- _locationManager = nil;
- }
-
- - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
- // @see https://github.com/iosphere/ISHPermissionKit/blob/2.1.2/ISHPermissionKit/Requests/ISHPermissionRequestLocation.m#L127
- if (status != kCLAuthorizationStatusNotDetermined && _initialChangeEventFired) {
- [self onAuthorizationStatus];
- } else {
- _initialChangeEventFired = true;
- }
- }
-
- @end
|