我面临的问题是,当我按下UIButton时 - 需要位置服务来启动操作。但是,如果用户在应用程序首次启动时拒绝定位服务 - 应用程序将崩溃。
我试过找到一种方法来实现CLAuthorizationStatus .Denied但我似乎无法找到一种方法。我似乎可以实现的唯一代码是didChangeAuthorizationStatus,它只在首次启动应用程序时启动请求。
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus)
{
if status == .AuthorizedAlways || status == .AuthorizedWhenInUse
{
manager.startUpdatingLocation()
}
else
{
manager.requestWhenInUseAuthorization()
}
}
如果按UIButton发送API请求,如果位置服务被拒绝,应用程序将崩溃。
我的问题是如何在按钮的IBAction中实现一种方法,该方法将引导用户转到他们的设置并启用位置服务。 :)
答案 0 :(得分:5)
CLLocationManager
有一个静态函数authorizationStatus()
,您可以使用它来获取当前授权状态,甚至无需初始化CLLocationManager
对象。
因此,在用户按下按钮时调用的功能中,您可以检查授权状态并采取相应措施:
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
lazy var locationManager = CLLocationManager()
...
func didPressButton(sender: UIButton) {
switch CLLocationManager.authorizationStatus() {
case .AuthorizedAlways, .AuthorizedWhenInUse:
locationManager.delegate = self
locationManager.startUpdatingLocation()
case .NotDetermined:
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
case .Denied:
print("Show Alert with link to settings")
case .Restricted:
// Nothing you can do, app cannot use location services
break
}
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status == .AuthorizedWhenInUse {
manager.startUpdatingLocation()
}
}
}