iOS 8 Swift 将用户从警报对话框直接发送到位置服务
iOS 8 Swift sending user directly to location services from an Alert dialog
当用户关闭位置服务时,我想提示使用 UIAlertController 打开它们。警报控制器中的一个选项应该将它们直接带到定位服务(对于 OS,而不是应用程序)。现在,我已经能够将用户发送到我的特定应用程序的权限,而不是整体 OS 位置设置。有没有办法将用户从 UIAlertController 直接发送到 OS 位置设置?
这是当前代码(位于 viewDidAppear 中):
if (CLLocationManager.locationServicesEnabled())
{
daMap.delegate = self
daMap.mapType = MKMapType.Satellite
daMap.showsUserLocation = true
// do some other things...
} else {
let alertController = UIAlertController(
title: "We Can't Get Your Location",
message: "Turn on location services on your device.",
preferredStyle: .Alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
alertController.addAction(cancelAction)
let openAction = UIAlertAction(title: "Location Settings", style: .Default) { (action) in
if let url = NSURL(string:UIApplicationOpenSettingsURLString) {
UIApplication.sharedApplication().openURL(url)
}
}
alertController.addAction(openAction)
self.presentViewController(alertController, animated: true, completion: nil)
}
正如 "Matt" 评论的那样,这个问题的答案是 "NO"。出于某种原因,在网络上更难找到对此的具体答案,可能是因为没有解决方案(至少没有 UIAlertController)。
但是,我发现最可接受的替代方法是将 NSLocationWhenInUseUsageDescription 字符串添加到 plist 文件(无论如何都是必需的),并给出您想要的消息的值。
因此,将 plist 添加为信息 属性 列表下的条目:
key: NSLocationWhenInUseUsage
String value: Turn on location services on your device.
如果您使用 all-the-time 定位权限级别,则为:
key: NSLocationAlwaysUsageDescription
String value: Turn on location services on your device.
在使用位置服务时,iOS8 需要这两个,但我看到的大多数教程都没有为字符串添加值,这最终成为对我来说最接近的解决方案。
字符串可以是您想要说服用户在应用中打开其位置设置的任何内容。这样做会通过警报对话框的 OS 系统消息版本,因此您不能对其进行太多自定义(即标题中的自定义文本、按钮的自定义文本等),但您至少可以直接发送给用户到正确的地方。
一个对我来说不是问题的警告是,您的字符串显示在对用户的初始权限请求(访问他们的位置数据)和任何基于位置的持续警报中被关闭设备。
当用户关闭位置服务时,我想提示使用 UIAlertController 打开它们。警报控制器中的一个选项应该将它们直接带到定位服务(对于 OS,而不是应用程序)。现在,我已经能够将用户发送到我的特定应用程序的权限,而不是整体 OS 位置设置。有没有办法将用户从 UIAlertController 直接发送到 OS 位置设置?
这是当前代码(位于 viewDidAppear 中):
if (CLLocationManager.locationServicesEnabled())
{
daMap.delegate = self
daMap.mapType = MKMapType.Satellite
daMap.showsUserLocation = true
// do some other things...
} else {
let alertController = UIAlertController(
title: "We Can't Get Your Location",
message: "Turn on location services on your device.",
preferredStyle: .Alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
alertController.addAction(cancelAction)
let openAction = UIAlertAction(title: "Location Settings", style: .Default) { (action) in
if let url = NSURL(string:UIApplicationOpenSettingsURLString) {
UIApplication.sharedApplication().openURL(url)
}
}
alertController.addAction(openAction)
self.presentViewController(alertController, animated: true, completion: nil)
}
正如 "Matt" 评论的那样,这个问题的答案是 "NO"。出于某种原因,在网络上更难找到对此的具体答案,可能是因为没有解决方案(至少没有 UIAlertController)。
但是,我发现最可接受的替代方法是将 NSLocationWhenInUseUsageDescription 字符串添加到 plist 文件(无论如何都是必需的),并给出您想要的消息的值。
因此,将 plist 添加为信息 属性 列表下的条目:
key: NSLocationWhenInUseUsage
String value: Turn on location services on your device.
如果您使用 all-the-time 定位权限级别,则为:
key: NSLocationAlwaysUsageDescription
String value: Turn on location services on your device.
在使用位置服务时,iOS8 需要这两个,但我看到的大多数教程都没有为字符串添加值,这最终成为对我来说最接近的解决方案。
字符串可以是您想要说服用户在应用中打开其位置设置的任何内容。这样做会通过警报对话框的 OS 系统消息版本,因此您不能对其进行太多自定义(即标题中的自定义文本、按钮的自定义文本等),但您至少可以直接发送给用户到正确的地方。
一个对我来说不是问题的警告是,您的字符串显示在对用户的初始权限请求(访问他们的位置数据)和任何基于位置的持续警报中被关闭设备。