当我的应用程序启动地图视图时,我会请求iOS8"何时使用"位置许可。假设用户授予该权限。
我想仅在用户选择我的地理围栏功能时才请求“始终”权限。但是调用CLLocationManager.requestAlwaysAuthorization没有任何效果,因为当前的授权状态不再是kCLAuthorizationStatusNotDetermined。
在用户授予“使用时”权限后,如何申请“永久”权限?我认为这是一个常见的用例,因为除非需要,应用程序应避免要求“始终”权限。
答案 0 :(得分:3)
你是对的,如果用户已经授予“使用时”权限,则调用requestAlwaysAuthorization
将不会执行任何操作。我使用的解决方法是将用户链接到设置屏幕,让他们自己打开“始终”设置。以下是执行此操作的步骤:
在名为app-Info.plist
的{{1}}中创建一个新密钥,并输入一些原因,说明您需要在值字段中请求始终权限的原因。
将您的用户关联到应用的设置屏幕(more info here)
NSLocationAlwaysUsageDescription
一旦用户点击您的链接,他们就会看到:
当他们点击NSURL *settings = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:settings])
[[UIApplication sharedApplication] openURL:settings];
时,他们将能够看到Location
和While Using the App
设置以供选择:
Always
答案 1 :(得分:2)
我不了解objective-c,但它在swift和iOS 8.4中对我来说很好。确保在info.plist中提供这两个键
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
// iOS 11 and up will require this key instead of AlwaysUsageDescription
NSLocationAlwaysAndWhenInUsageDescription
然后致电
locationManager.requestAlwaysAuthorization()
确保locationManager是一个实例变量!由于某些奇怪的原因,将忽略局部变量。 Apple Documentation