#import "RNPermissionHandlerLocationWhenInUse.h" @import CoreLocation; @interface RNPermissionHandlerLocationWhenInUse() @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 * _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