RNPermissionHandlerLocationAlways.m 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #import "RNPermissionHandlerLocationAlways.h"
  2. @import CoreLocation;
  3. @import UIKit;
  4. @interface RNPermissionHandlerLocationAlways() <CLLocationManagerDelegate>
  5. @property (nonatomic) CLLocationManager *locationManager;
  6. @property (nonatomic) bool initialChangeEventFired;
  7. @property (nonatomic, copy) void (^resolve)(RNPermissionStatus status);
  8. @property (nonatomic, copy) void (^reject)(NSError *error);
  9. @end
  10. @implementation RNPermissionHandlerLocationAlways
  11. + (NSArray<NSString *> * _Nullable)usageDescriptionKeys {
  12. return @[
  13. @"NSLocationAlwaysAndWhenInUseUsageDescription",
  14. @"NSLocationAlwaysUsageDescription",
  15. ];
  16. }
  17. - (void)checkWithResolver:(void (^)(RNPermissionStatus status))resolve
  18. withRejecter:(void (__unused ^)(NSError *error))reject {
  19. if (![CLLocationManager locationServicesEnabled]) {
  20. return resolve(RNPermissionStatusNotAvailable);
  21. }
  22. switch ([CLLocationManager authorizationStatus]) {
  23. case kCLAuthorizationStatusNotDetermined:
  24. return resolve(RNPermissionStatusNotDetermined);
  25. case kCLAuthorizationStatusRestricted:
  26. return resolve(RNPermissionStatusRestricted);
  27. case kCLAuthorizationStatusAuthorizedWhenInUse:
  28. case kCLAuthorizationStatusDenied:
  29. return resolve(RNPermissionStatusDenied);
  30. case kCLAuthorizationStatusAuthorizedAlways:
  31. return resolve(RNPermissionStatusAuthorized);
  32. }
  33. }
  34. - (void)requestWithOptions:(__unused NSDictionary * _Nullable)options
  35. withResolver:(void (^)(RNPermissionStatus status))resolve
  36. withRejecter:(void (^)(NSError *error))reject {
  37. CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
  38. if ((status != kCLAuthorizationStatusNotDetermined && status != kCLAuthorizationStatusAuthorizedWhenInUse) ||
  39. ([RNPermissionsManager hasBeenRequestedOnce:self] && status == kCLAuthorizationStatusAuthorizedWhenInUse)) {
  40. return [self checkWithResolver:resolve withRejecter:reject];
  41. }
  42. _resolve = resolve;
  43. _reject = reject;
  44. if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
  45. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(UIApplicationDidBecomeActiveNotification:) name:UIApplicationDidBecomeActiveNotification object:nil];
  46. }
  47. _locationManager = [CLLocationManager new];
  48. [_locationManager setDelegate:self];
  49. [_locationManager requestAlwaysAuthorization];
  50. }
  51. - (void)onAuthorizationStatus {
  52. [self checkWithResolver:_resolve withRejecter:_reject];
  53. [_locationManager setDelegate:nil];
  54. _locationManager = nil;
  55. }
  56. - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
  57. if (!_initialChangeEventFired) {
  58. _initialChangeEventFired = true;
  59. } else {
  60. [self onAuthorizationStatus];
  61. }
  62. }
  63. - (void)UIApplicationDidBecomeActiveNotification:(NSNotification *)notification {
  64. if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) {
  65. [self onAuthorizationStatus];
  66. }
  67. [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
  68. }
  69. @end