在 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)
这样你就可以处理每一个案例,无论用户是刚刚授予许可还是撤销许可。
我正在尝试实现一个基本的地图视图并将用户的当前位置作为注释添加到地图中。我已将 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)
这样你就可以处理每一个案例,无论用户是刚刚授予许可还是撤销许可。