// Copyright 2016-present 650 Industries. All rights reserved. #import #import #import static SEL alwaysAuthorizationSelector; static SEL whenInUseAuthorizationSelector; @implementation EXLocationPermissionRequester + (NSString *)permissionType { return @"location"; } + (void)load { alwaysAuthorizationSelector = NSSelectorFromString([@"request" stringByAppendingString:@"AlwaysAuthorization"]); whenInUseAuthorizationSelector = NSSelectorFromString([@"request" stringByAppendingString:@"WhenInUseAuthorization"]); } - (void)requestLocationPermissions { if ([EXBaseLocationRequester isConfiguredForAlwaysAuthorization] && [self.locationManager respondsToSelector:alwaysAuthorizationSelector]) { ((void (*)(id, SEL))objc_msgSend)(self.locationManager, alwaysAuthorizationSelector); } else if ([EXBaseLocationRequester isConfiguredForWhenInUseAuthorization] && [self.locationManager respondsToSelector:whenInUseAuthorizationSelector]) { ((void (*)(id, SEL))objc_msgSend)(self.locationManager, whenInUseAuthorizationSelector); } else { self.reject(@"E_LOCATION_INFO_PLIST", @"One of the `NSLocation*UsageDescription` keys must be present in Info.plist to be able to use geolocation.", nil); self.resolve = nil; self.reject = nil; } } - (NSDictionary *)parsePermissions:(CLAuthorizationStatus)systemStatus { EXPermissionStatus status; NSString *scope = @"none"; switch (systemStatus) { case kCLAuthorizationStatusAuthorizedWhenInUse: { status = EXPermissionStatusGranted; scope = @"whenInUse"; break; } case kCLAuthorizationStatusAuthorizedAlways: { status = EXPermissionStatusGranted; scope = @"always"; break; } case kCLAuthorizationStatusDenied: case kCLAuthorizationStatusRestricted: { status = EXPermissionStatusDenied; break; } case kCLAuthorizationStatusNotDetermined: default: { status = EXPermissionStatusUndetermined; break; } } return @{ @"status": @(status), @"scope": scope }; } @end