如何提示用户再次打开位置服务....

too*_*fah 17 iphone cllocationmanager ios

我想拥有与地图应用程序相同的功能,每当用户按下"当前位置"按钮打开位置服务时,系统会提示用户:

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

在地图应用中,用户每次都会收到"打开位置服务..."消息.我怎样才能让我的应用程序也这样做?我让用户我正在使用一个新的CLLocationManager实例,以防这是问题,但事实并非如此.我看不到会影响这个的任何设置.

如果我自己发出警报,我就无法获得相同的"设置"按钮功能.此外,我不希望用户看到多个看起来相同的警报.

有任何想法吗?

Aar*_*man 22

在iOS 8中有一个常量调用UIApplicationOpenSettingsURLString.

来自UIKit下的"iOS中的新功能"文档是:

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

来自Apple的文档:

UIApplicationOpenSettingsURLString

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

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

NSURL *settings = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

if ([[UIApplication sharedApplication] canOpenURL:settings])
    [[UIApplication sharedApplication] openURL:settings];
Run Code Online (Sandbox Code Playgroud)

  • 这是一个老问题,但这是2014年的正确答案. (2认同)

小智 19

如果要将用户指回"设置"应用中的"位置服务"屏幕,可以将其发送到特殊URL,如下所示:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"prefs:root=LOCATION_SERVICES"]];
Run Code Online (Sandbox Code Playgroud)

  • Apple允许这样做吗? (5认同)
  • 显然不再了.(http://stackoverflow.com/questions/9627451/how-to-open-preferences-settings-with-ios-5-1) (2认同)

Pey*_*loW 10

CLLocationManager如果启用了位置服务,则可以查询共享实例.在正确的办法是尊重用户选择禁用位置服务.

但是,如果您愿意,只需启动位置服务,系统将提示用户再次启动它.如果用户选择加入请求,将开始像往常一样在您的代表上报告位置.如果用户拒绝您的请求,您将收到locationManager:didFailWithError:委托方法的失败回调.该错误的错误代码为kCLErrorDenied.

我强烈建议您不要这样做,但如果用户拒绝,您可以尝试再次启动该服务,并再次询问用户.大多数用户会讨厌你.

  • 这是不正确的.一旦提供了位置服务授权警报视图,用户将永远*再次看到它.永远.(尽管手机重置.)即使删除并重新安装应用程序也不会再次出现.用户恢复位置服务授权的唯一方法是转到"设置"应用并直接重新启用它. (25认同)
  • @Yetanotherjosh此外,可以在设置>常规>重置>重置位置警告中手动重置位置警告. (3认同)
  • 感谢您的反馈意见.我和你在一起,完全不想惹恼我的用户重新要求他们让我的应用程序访问位置服务.但在这种情况下,用户正在点击"获取当前位置"按钮,因此告诉他们需要打开它是合适的.当用户点击"获取当前位置"按钮时,这与Map应用程序中的相同.我按照你的建议,调用start监视器方法,但它没有重新提示用户,我只是得到了kCLErrorDenied错误. (2认同)