RNPermissionHandlerLocationWhenInUse.m 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #import "RNPermissionHandlerLocationWhenInUse.h"
  2. @import CoreLocation;
  3. @interface RNPermissionHandlerLocationWhenInUse() <CLLocationManagerDelegate>
  4. @property (nonatomic) CLLocationManager *locationManager;
  5. @property (nonatomic) bool initialChangeEventFired;
  6. @property (nonatomic, copy) void (^resolve)(RNPermissionStatus status);
  7. @property (nonatomic, copy) void (^reject)(NSError *error);
  8. @end
  9. @implementation RNPermissionHandlerLocationWhenInUse
  10. + (NSArray<NSString *> *)usageDescriptionKeys {
  11. return @[@"NSLocationWhenInUseUsageDescription"];
  12. }
  13. - (void)checkWithResolver:(void (^)(RNPermissionStatus status))resolve
  14. withRejecter:(void (__unused ^)(NSError *error))reject {
  15. if (![CLLocationManager locationServicesEnabled]) {
  16. return resolve(RNPermissionStatusNotAvailable);
  17. }
  18. switch ([CLLocationManager authorizationStatus]) {
  19. case kCLAuthorizationStatusNotDetermined:
  20. return resolve(RNPermissionStatusNotDetermined);
  21. case kCLAuthorizationStatusRestricted:
  22. return resolve(RNPermissionStatusRestricted);
  23. case kCLAuthorizationStatusDenied:
  24. return resolve(RNPermissionStatusDenied);
  25. case kCLAuthorizationStatusAuthorizedWhenInUse:
  26. case kCLAuthorizationStatusAuthorizedAlways:
  27. return resolve(RNPermissionStatusAuthorized);
  28. }
  29. }
  30. - (void)requestWithOptions:(__unused NSDictionary * _Nullable)options
  31. withResolver:(void (^)(RNPermissionStatus status))resolve
  32. withRejecter:(void (^)(NSError *error))reject {
  33. CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
  34. if (status != kCLAuthorizationStatusNotDetermined) {
  35. return [self checkWithResolver:resolve withRejecter:reject];
  36. }
  37. _resolve = resolve;
  38. _reject = reject;
  39. _locationManager = [CLLocationManager new];
  40. [_locationManager setDelegate:self];
  41. [_locationManager requestWhenInUseAuthorization];
  42. }
  43. - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
  44. if (!_initialChangeEventFired) {
  45. _initialChangeEventFired = true;
  46. } else {
  47. [self checkWithResolver:_resolve withRejecter:_reject];
  48. [_locationManager setDelegate:nil];
  49. _locationManager = nil;
  50. }
  51. }
  52. @end