最近的项目中研究iOS地图已经有些时日了,这里记录下获得用户位置权限的基本步骤与参考资料。
如文章有误或你的经验分享,欢迎指出与评论。
导入
import Mapkit 与CoreLocation
权限申请
iOS的权限设置需在info.plist进行设置:
iOS8-10:LocationWhenInUseUsageDescription:应用前台更新位置信息
iOS11+:LocationAlwaysUsageDescription,应用前后台均可获得位置更新信息
若同时希望,则可全部添加,代码检查权限,在下文中提到
注意:业务逻辑若有两个Map,第二个出现“是否保持XX选择“,而不弹出多个选项。
初始化
let locationManager = CLLocationManager() //创建获取位置实例
locationManager.delegate = self //创建一个实例
locationManager.desiredAccuracy = kCLLocationAccuracyBest
//设置定位精度
根据实际需求撰写:
locationManager.startUpdatingLocation()
//开始更新用户位置信息,并调用
协议
需增加Map与地图的delegate,可作为扩展:
extension ViewController: CLLocationManagerDelegate { }
不同权限用户申请的不同相应
添加代理方法(参考资料-踩坑-链接1):
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
}
此处有几个可选的种类:
- .authorizedWhenInUse:用户选择使用时启用
- .denied: 用户拒绝
- .notDetermined: 未选择
- .authorizedAlways:总是获取位置信息
此处为通常使用switch语句,若用户未响应,可添加UIAlertView:
let alert = UIAlertController(title: "xx",
message:"请转到设置>隐私>位置服务允许位置",
preferredStyle: .alert)
let action = UIAlertAction(title: "我知道了", style: .default)
alert.addAction(action)
present(alert,animated: true,completion: nil)
调用位置成功之后
更新用户位置方法:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
}
此处写法部分遇坑:使用以下方法设置区域:
let location = locations.last else { return }
//若最近位置返回0,则返回为空
MKCoordinateRegion.init(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000)
center:设置center用户位置中心点
遇坑
- 申请定位权限窗口不弹出:可能是未添加所需权限(我已添加仍未弹出)
- 调用成功后写法
参考资料
获取iOS用户位置:
Documentation - MapKit - MKMapView
踩坑: