在 swift 中即时处理位置权限

handling location permissions instantaneously in swift

我正在尝试实现一个基本的地图视图并将用户的当前位置作为注释添加到地图中。我已将 requestwheninuse 密钥添加到我的 info.plist 并导入了 coreLocation。

在我的视图控制器的加载方法中,我有以下内容:

locManager.requestWhenInUseAuthorization()
var currentLocation : CLLocation

if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse){

    currentLocation = locManager.location
    println("currentLocation is \(currentLocation)")      
}
else{
    println("not getting location")
    // a default pin
}

我收到重新提示。检索位置的权限。发生这种情况时,我得到打印说明未获取位置,显然是因为它在用户有机会点击确定之前运行。如果我关闭该应用程序并返回,我可以检索位置并将其添加到地图中。但是,我希望当用户第一次点击确定时能够获取当前位置并将其添加到地图中。我怎样才能做到这一点?我有以下添加图钉的方法:

func addPin(location2D: CLLocationCoordinate2D){
    self.mapView.delegate = self
    var newPoint = MKPointAnnotation()
    newPoint.coordinate = location2D
    self.mapView.addAnnotation(newPoint)
}

为此,您需要为您的位置管理器委托实施方法didChangeAuthorizationStatus,该方法在 CLLocationManager 初始化后不久被调用。

首先,不要忘记在文件顶部添加:import CoreLocation

为此,在您使用该位置的 class 中,添加委托协议。然后在 viewDidLoad 方法中(或 applicationDidFinishLaunching 如果你在 AppDelegate 中)初始化你的位置管理器并将其 delegate 属性 设置为 self :

class myCoolClass: CLLocationManagerDelegate {
    var locManager: CLLocationManager!

    override func viewDidLoad() {
        locManager = CLLocationManager()
        locManager.delegate = self
    }
 }

最后,在您之前声明的 class 的正文中实现 locationManager(_ didChangeAuthorizationStatus _) 方法,当授权状态更改时将调用此方法,因此一旦您用户点击了按钮。你可以这样实现它:

private func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined:
        // If status has not yet been determied, ask for authorization
        manager.requestWhenInUseAuthorization()
        break
    case .authorizedWhenInUse:
        // If authorized when in use
        manager.startUpdatingLocation()
        break
    case .authorizedAlways:
        // If always authorized
        manager.startUpdatingLocation()
        break
    case .restricted:
        // If restricted by e.g. parental controls. User can't enable Location Services
        break
    case .denied:
        // If user denied your app access to Location Services, but can grant access from Settings.app
        break
    default:
        break
    }
}

Swift 4 - 新的枚举语法

对于Swift4,只需将每个枚举大小写的首字母切换为小写(.notDetermined、.authorizedWhenInUse、.authorizedAlways、.restricted 和.denied)

这样你就可以处理每一个案例,无论用户是刚刚授予许可还是撤销许可。