升级至Xcode13后MapKit无法显示用户位置问题求助
Xcode13升级后MapKit不显示用户位置解决方案
核心原因
Xcode13配套iOS15 SDK存在两个未明确写入官方文档的变更:
- 废弃的
CLLocationManager.authorizationStatus()类方法调用时会出现返回值异常,导致权限判断逻辑失效 - MapKit的用户位置渲染存在时序问题,权限刚授权时直接设置
showsUserLocation = true不会触发定位点渲染
修复步骤
- 替换废弃的类方法权限判断,改用
CLLocationManager实例的authorizationStatus属性获取权限状态 - 权限校验通过后,增加短延迟再开启用户位置显示,规避渲染时序问题
- 确认Info.plist中已添加
NSLocationWhenInUseUsageDescription字段且填写了非空的权限申请说明,Xcode13打包时会校验该字段合法性,为空会导致权限申请静默失败 - 全局深色模式下系统默认蓝色定位点辨识度较低,可自定义用户位置标注样式避免被误认为不显示
关键代码修改
1. 权限判断逻辑修改
func checkLocationAuthorization() { // 替换废弃的类方法,使用实例属性获取权限状态 switch locationManager.authorizationStatus { case .authorizedWhenInUse, .authorizedAlways: // 增加0.1秒延迟规避MapKit渲染时序问题 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in guard let self = self else { return } self.mapView.showsUserLocation = true self.followUserLocation() self.locationManager.startUpdatingLocation() } case .denied: // 补充权限被拒绝的提示逻辑 break case .notDetermined: locationManager.requestWhenInUseAuthorization() case .restricted: // 补充权限被限制的提示逻辑 break @unknown default: break } }
2. 可选:自定义用户位置标注(适配深色模式)
首先声明遵守MKMapViewDelegate协议:
class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {
在setupMapView方法中设置代理:
func setupMapView() { view.addSubview(mapView) mapView.delegate = self // 新增代理设置 mapView.translatesAutoresizingMaskIntoConstraints = false // 原有约束逻辑保持不变 }
实现标注渲染代理方法:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { // 只处理用户位置标注 guard annotation is MKUserLocation else { return nil } let reuseId = "UserLocationAnnotation" var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) if annotationView == nil { annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) // 自定义高辨识度的定位点样式 annotationView?.image = UIImage(systemName: "location.circle.fill")?.withTintColor(.systemRed, renderingMode: .alwaysOriginal) annotationView?.frame.size = CGSize(width: 24, height: 24) } else { annotationView?.annotation = annotation } return annotationView }
内容的提问来源于stack exchange,提问作者bigyoshi
相关产品推荐
相关产品推荐

