iOS地图开发踩坑

最近的项目中研究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) { 
}

此处有几个可选的种类:

  1. .authorizedWhenInUse:用户选择使用时启用
  2. .denied: 用户拒绝
  3. .notDetermined: 未选择
  4. .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用户位置中心点

遇坑

  1. 申请定位权限窗口不弹出:可能是未添加所需权限(我已添加仍未弹出)
  2. 调用成功后写法

参考资料

获取iOS用户位置:

Documentation - MapKit - MKMapView

[iOS] 位置情報の取得 (Swift3編)

CoreLocation框架详解| Cowboy Tech

iOS App地图功能开发(1)

踩坑:

iOS 解决iOS 地图获取位置提示框不弹出

FelixXiong wechat
产品北里,讲述产品和人性、涉及设计、技术和运营的公众号。
你们的赞赏是我更新的动力~