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 系统消息版本,因此您不能对其进行太多自定义(即标题中的自定义文本、按钮的自定义文本等),但您至少可以直接发送给用户到正确的地方。

一个对我来说不是问题的警告是,您的字符串显示在对用户的初始权限请求(访问他们的位置数据)和任何基于位置的持续警报中被关闭设备。