【问题标题】:How to prompt user to turn on Location Services...again如何再次提示用户打开定位服务...
【发布时间】:2011-08-25 07:16:19
【问题描述】:

我希望拥有与地图应用程序相同的功能,用户每次按下“当前位置”按钮时都会收到提示,如果他们关闭了位置服务:

  • 关闭定位服务
  • 用户按下“getCurrentLocation”按钮
  • 应用尝试使用 CLLocationManager 获取位置
  • 用户收到“打开定位服务...”消息,显示“设置”和“取消”按钮。
  • 用户点击“取消”
  • 用户再次按下“getCurrentLocation”按钮
  • 应用再次尝试使用 CLLocationManager 获取位置
  • 用户不再收到“打开定位服务...”消息

在地图应用中,用户每次都会收到“开启定位服务...”消息。我怎样才能让我的应用程序做同样的事情?我让用户使用了一个新的 CLLocationManager 实例,以防出现问题,但事实并非如此。我看不到任何会影响这一点的设置。

如果我自己发出警报,我将无法获得相同的“设置”按钮功能。另外,我不希望用户看到多个看起来相同的警报。

有什么想法吗?

【问题讨论】:

  • 所以我们在地图应用程序中看到的功能无法在我们自己的应用程序中复制是这一切的结论吗?似乎没有解决方案?任何更新?我正在开发 iOS 7 应用程序...

标签: iphone ios cllocationmanager


【解决方案1】:

iOS 8 中新增了一个名为UIApplicationOpenSettingsURLString 的常量。

从 UIKit 下的"What's new in iOS" 文档中有一行:

您可以将用户直接带到“设置”应用中与您的应用相关的设置。将UIApplicationOpenSettingsURLString 常量传递给 UIApplication 类的 openURL: 方法。

来自 Apple 的documentation

UIApplicationOpenSettingsURLString

用于创建可以传递给 openURL: 方法的 URL。当您打开使用此字符串构建的 URL 时,系统会启动“设置”应用并显示该应用的自定义设置(如果有)。

您可以将其传递给 UIApplication openURL: 方法。它可能看起来像:

NSURL *settings = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

if ([[UIApplication sharedApplication] canOpenURL:settings])
    [[UIApplication sharedApplication] openURL:settings];

【讨论】:

  • 这是一个老问题,但这是 2014 年的正确答案。
【解决方案2】:

如果您想让用户返回“设置”应用中的“定位服务”屏幕,可以通过将其发送到特殊 URL 来实现,如下所示:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"prefs:root=LOCATION_SERVICES"]];

【讨论】:

【解决方案3】:

如果启用了位置服务,您可以查询共享的CLLocationManager 实例。 正确的方式是尊重用户禁用定位服务的选择。

但是,如果您愿意,无论如何都只需启动定位服务,系统将提示用户重新启动它。如果用户选择加入请求,则将开始像往常一样向您的代表报告位置。如果用户拒绝您的请求,您将收到对 locationManager:didFailWithError: 委托方法的失败回调。该错误的错误代码为kCLErrorDenied

我强烈建议您不要这样做,但如果用户拒绝,您可以尝试重新启动服务,系统会再次询问用户。不过,大多数用户会因此而讨厌你。

【讨论】:

  • +1 用户应该只决定他们是否要允许应用程序在某一时刻使用他们的位置,我注意到我最近使用的许多应用程序会定期请求权限,即使它没有被允许过去,我不喜欢
  • 同意。如果您的应用依赖于位置服务来实现任何重要功能,那么执行此操作的好方法是检测何时禁用位置服务并在您的应用中显示被动 UI,通知用户并允许他们重新打开位置服务。如果用户选择加入,您可以启动定位服务,这将提示用户启用。
  • 感谢您的反馈。我和你在一起,完全不想惹恼我的用户重新要求他们允许我的应用程序访问位置服务。但是在这种情况下,用户正在点击“获取当前位置”按钮,因此告诉他们他们需要打开它似乎是合适的。当用户点击“获取当前位置”按钮时,这与地图应用程序中的相同。我正在按照您的建议进行操作,调用启动监视器方法,但它不会重新提示用户,我只是得到 kCLErrorDenied 错误。
  • 这是不正确的。一旦显示定位服务授权警报视图,用户将再也不会看到它。曾经。 (尽管手机重置。)即使应用程序删除和重新安装也不会再次出现。用户恢复位置服务授权的唯一方法是转到“设置”应用并直接重新启用它。
  • @Yetanotherjosh 另外,位置警告可以在设置>常规>重置>重置位置警告中手动重置。
猜你喜欢
  • 2011-06-20
  • 2015-10-04
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多