iOS 定位服务在应用打开时询问

iOS Location Services asks on app open

只是想向我的应用程序添加位置服务(在 ObjC 中)。我只希望在我要使用的时候出现权限提示,但是在我第一次打开应用程序时出现提示。

我的印象是只有在 CLLocationManager 对象上调用 startUpdatingLocation 时才会出现提示。但是,这仅在我的应用程序中的某些 ViewController 上调用(绝对不是我的第一个视图控制器)。

有趣的是,这个问题只出现在iOS8中,在iOS7中没有问题。有人遇到过类似的问题吗?或者知道还有什么问题吗?

谢谢。

在不知道您将代码放在哪里的情况下,我处理这个问题的方法是

  • 创建一个请求位置访问的方法,即 - (void) findLocationAsk
  • 现在不要在应用程序启动时立即调用此方法,因为您不希望出现这种情况
  • 在你的视图控制器中调用这个方法
  • 您可以在 viewDidLoad 中调用它或将其作为按钮操作或将其作为计时器触发。

这应该会处理应用启动时的提示

更新: 您的应用程序将在 iOS 8 启动时提示位置访问权限。这是因为在 plist 文件中检测到 "Required background modes" 所需的密钥。您唯一可以做的就是使该消息更具描述性,说明您需要访问的原因。将此密钥和描述对添加到您的 plist 文件中,并在其中添加您喜欢的任何解释文本

NSLocationWhenInUseUsageDescription 请授予此应用访问您位置的权限,以防检测到登录尝试失败并且您想知道它是谁

iOS 8 改变了定位服务的处理方式,这也意味着如果您支持旧版本的 OS,您可能需要进行一些额外的编码。要详细了解整个过程,请查看 NSHipster

在 iOS 8 之前,是的,调用 startUpdatingLocation 会提示用户获得许可。虽然现在请求权限和开始位置更新是分开的,但您需要调用 requestWhenInUseAuthorizationrequestAlwaysAuthorization

不仅如此,在iOS8中你需要显式添加两个plist键然后定义它们的值:NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescription,它们是将显示的字符串在通知用户您的应用正在请求位置信息的警报中。

但说真的,请查看 link。它在解释这一切方面非常出色,远比我在这里总结的要好。