[ios] Refactor way location permissions are requested

This commit is contained in:
Jason Wray
2019-09-09 17:25:42 -07:00
committed by GitHub
parent 8ccf15069d
commit 45140af7cb

View File

@@ -5303,35 +5303,29 @@ public:
if (shouldEnableLocationServices)
{
if (self.locationManager.authorizationStatus == kCLAuthorizationStatusNotDetermined)
{
BOOL requiresWhenInUseUsageDescription = [NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){11,0,0}];
if (self.locationManager.authorizationStatus == kCLAuthorizationStatusNotDetermined) {
BOOL hasWhenInUseUsageDescription = !![[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"];
BOOL hasAlwaysUsageDescription;
if (requiresWhenInUseUsageDescription)
{
hasAlwaysUsageDescription = !![[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysAndWhenInUseUsageDescription"] && hasWhenInUseUsageDescription;
}
else
{
hasAlwaysUsageDescription = !![[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"];
}
if (hasAlwaysUsageDescription)
{
[self.locationManager requestAlwaysAuthorization];
}
else if (hasWhenInUseUsageDescription)
{
[self.locationManager requestWhenInUseAuthorization];
}
else
{
NSString *suggestedUsageKeys = requiresWhenInUseUsageDescription ?
@"NSLocationWhenInUseUsageDescription and (optionally) NSLocationAlwaysAndWhenInUseUsageDescription" :
@"NSLocationWhenInUseUsageDescription and/or NSLocationAlwaysUsageDescription";
[NSException raise:MGLMissingLocationServicesUsageDescriptionException
format:@"This app must have a value for %@ in its Info.plist.", suggestedUsageKeys];
if (@available(iOS 11.0, *)) {
// A WhenInUse string is required in iOS 11+ and the map never has any need for Always, so it's enough to just ask for WhenInUse.
if (hasWhenInUseUsageDescription) {
[self.locationManager requestWhenInUseAuthorization];
} else {
[NSException raise:MGLMissingLocationServicesUsageDescriptionException
format:@"To use location services this app must have a NSLocationWhenInUseUsageDescription string in its Info.plist."];
}
} else {
// We might have to ask for Always if the app does not provide a WhenInUse string.
BOOL hasAlwaysUsageDescription = !![[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"];
if (hasWhenInUseUsageDescription) {
[self.locationManager requestWhenInUseAuthorization];
} else if (hasAlwaysUsageDescription) {
[self.locationManager requestAlwaysAuthorization];
} else {
[NSException raise:MGLMissingLocationServicesUsageDescriptionException
format:@"To use location services this app must have a NSLocationWhenInUseUsageDescription and/or NSLocationAlwaysUsageDescription string in its Info.plist."];
}
}
}