【问题标题】:iOS8 Location: How should one request Always Authorization after user has granted "When In Use" Authorization?iOS8位置:用户授予“使用时”授权后如何请求始终授权?
【发布时间】:2014-10-01 01:48:49
【问题描述】:

当我的应用启动地图视图时,我请求 iOS8“使用时”位置权限。假设用户同意。

我想仅在用户选择加入我的地理围栏功能时才请求“始终”权限。但是调用 CLLocationManager.requestAlwaysAuthorization 没有效果,因为当前授权状态不再是 kCLAuthorizationStatusNotDetermined。

在用户授予“使用时”权限之后,如何请求“始终”权限?我认为这是一个常见的用例,因为除非需要,否则应用程序应避免请求 Always 权限。

【问题讨论】:

  • 看起来它的设计并未考虑到您的场景。但是文档说 AlwaysAuthorization 只有在应用程序真正需要它时才应该使用,所以他们应该支持它。我认为您应该向 Apple 提交错误。顺便提一句。还有另一种提示用户更改状态的方法,使用 UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)) 将他们重定向到应用程序设置。在我的情况下,它只显示 None 和 Always,但如果你可以强制它显示所有三个选项......

标签: core-location ios8


【解决方案1】:

我不了解 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

【讨论】:

  • 文档说明“如果当前授权状态不是 kCLAuthorizationStatusNotDetermined,则此方法不执行任何操作,也不会调用 locationManager:didChangeAuthorizationStatus: 方法。”所以这是不正确的。
  • 这里是有关如何升级授权级别的文档的链接。注意,NSLocationAlwaysAndWhenInUsageDescription 键在 iOS 11 之前不存在 developer.apple.com/documentation/corelocation/…
【解决方案2】:

您是对的,如果用户已经授予“使用时”权限,则调用 requestAlwaysAuthorization 将不会执行任何操作。我使用的一种解决方法是将用户链接到设置屏幕并让他们自己打开“始终”设置。以下是执行此操作的步骤:

  1. 在您的 app-Info.plist 中创建一个名为 NSLocationAlwaysUsageDescription 的新密钥,并在值字段中输入您需要请求始终权限的一些原因。

  2. 将您的用户链接到您应用的设置屏幕 (more info here)

    NSURL *settings = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    if ([[UIApplication sharedApplication] canOpenURL:settings])
        [[UIApplication sharedApplication] openURL:settings];
    
  3. 一旦用户点击您的链接,他们就会看到:

    当他们点击Location 时,他们将能够看到While Using the AppAlways 可供选择的设置:

  4. 通过实现 CLLocationManager 委托方法 locationManager:didChangeAuthorizationStatus: 监控应用中的授权更改

【讨论】:

  • 我正在请求授权,但没有看到提示。你遇到过这个吗? stackoverflow.com/questions/26923409/…
  • 我不确定这是否是原因,但您应该只要求其中一个,而不是“始终”和“何时使用”
  • 在 Info.plist 中有额外的字段应该不会有什么坏处,对吧?我取出了额外的提示。
  • 是的,您需要 Info.plist 中的那个额外字段才能使我的解决方案在这里工作。我的意思是在 requestWhenInUseAuthorization 和 requestAlwaysAuthorization 之间进行选择,而不是两者兼而有之。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2021-03-22
  • 2015-07-24
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多