RNPLocation.m 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //
  2. // RNPLocation.m
  3. // ReactNativePermissions
  4. //
  5. // Created by Yonah Forst on 11/07/16.
  6. // Copyright © 2016 Yonah Forst. All rights reserved.
  7. //
  8. #import "RNPLocation.h"
  9. #import <CoreLocation/CoreLocation.h>
  10. @interface RNPLocation() <CLLocationManagerDelegate>
  11. @property (strong, nonatomic) CLLocationManager* locationManager;
  12. @property (copy) void (^completionHandler)(NSString *);
  13. @end
  14. @implementation RNPLocation
  15. + (NSString *)getStatusForType:(NSString *)type
  16. {
  17. int status = [CLLocationManager authorizationStatus];
  18. switch (status) {
  19. case kCLAuthorizationStatusAuthorizedAlways:
  20. return RNPStatusAuthorized;
  21. case kCLAuthorizationStatusAuthorizedWhenInUse:
  22. return [type isEqualToString:@"always"] ? RNPStatusDenied : RNPStatusAuthorized;
  23. case kCLAuthorizationStatusDenied:
  24. return RNPStatusDenied;
  25. case kCLAuthorizationStatusRestricted:
  26. return RNPStatusRestricted;
  27. default:
  28. return RNPStatusUndetermined;
  29. }
  30. }
  31. - (void)request:(NSString*)type completionHandler:(void (^)(NSString *))completionHandler
  32. {
  33. NSString *status = [RNPLocation getStatusForType:nil];
  34. if (status == RNPStatusUndetermined) {
  35. self.completionHandler = completionHandler;
  36. if (self.locationManager == nil) {
  37. self.locationManager = [[CLLocationManager alloc] init];
  38. self.locationManager.delegate = self;
  39. }
  40. [self.locationManager requestWhenInUseAuthorization];
  41. } else {
  42. if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse && [type isEqualToString:@"always"]) {
  43. completionHandler(RNPStatusDenied);
  44. } else {
  45. completionHandler(status);
  46. }
  47. }
  48. }
  49. -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
  50. if (status != kCLAuthorizationStatusNotDetermined) {
  51. if (self.locationManager) {
  52. self.locationManager.delegate = nil;
  53. self.locationManager = nil;
  54. }
  55. if (self.completionHandler) {
  56. //for some reason, checking permission right away returns denied. need to wait a tiny bit
  57. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
  58. self.completionHandler([RNPLocation getStatusForType:nil]);
  59. self.completionHandler = nil;
  60. });
  61. }
  62. }
  63. }
  64. @end