iOS端Google Maps运行报kCLErrorDomain Code=1错误且地图不显示
错误诱因
kCLErrorDomain Code=1属于CoreLocation框架的权限错误,对应官方定义的kCLErrorDenied,也就是位置请求被拒绝,你的问题由以下几个原因共同导致:
- 权限判断逻辑颠倒:
viewDidLoad中判断系统位置服务启用就直接调用requestLocation(),但此时应用本身还没有拿到用户的位置授权,直接请求位置必然触发报错 - 授权通过后没有发起位置请求:在
locationManagerDidChangeAuthorization回调中,判断到授权状态为已授权时直接return,没有触发位置拉取,导致位置更新回调不执行,地图无法加载对应视角内容 - 潜在配置缺失:Info.plist未添加位置权限对应的描述字段,导致授权请求直接被系统驳回;或是谷歌地图SDK的APIKey未正确配置,导致地图本身无法加载
修复方案
1. 修正权限判断逻辑
替换viewDidLoad中的逻辑,优先检查应用本身的授权状态,再决定是申请权限还是直接拉取位置:
override func viewDidLoad() { super.viewDidLoad() locationManager.delegate = self let currentAuthStatus = locationManager.authorizationStatus if currentAuthStatus == .authorizedWhenInUse || currentAuthStatus == .authorizedAlways { // 已获得授权,直接请求位置 locationManager.requestLocation() } else { // 未授权,先申请权限 locationManager.requestWhenInUseAuthorization() } }
2. 补全授权回调逻辑
在授权状态变更回调中,拿到授权后立刻发起位置请求:
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { switch manager.authorizationStatus { case .authorizedAlways, .authorizedWhenInUse: // 授权通过,发起位置请求 locationManager.requestLocation() case .denied: // 可选:新增提示引导用户到系统设置开启位置权限 return case .restricted, .notDetermined: locationManager.requestWhenInUseAuthorization() default: locationManager.requestWhenInUseAuthorization() } }
3. 校验项目配置
- 打开项目的Info.plist,确认已经添加
NSLocationWhenInUseUsageDescription字段,字段值填写申请位置权限的合理用途(比如"需要获取您的位置来展示当前位置地图") - 确认AppDelegate的
didFinishLaunchingWithOptions方法中已经正确配置谷歌地图APIKey:GMSServices.provideAPIKey("你的谷歌地图iOS SDK密钥"),且该密钥已经在谷歌云控制台开启了Google Maps iOS SDK的使用权限
4. 模拟器配置校验
打开模拟器的「设置-隐私与安全性-定位服务」,找到你的应用,确认权限设置为「使用App期间允许」;也可以在Xcode顶部菜单栏选择「Debug - Simulate Location」给模拟器指定一个模拟位置,避免模拟器无默认位置的问题。
内容的提问来源于stack exchange,提问作者Huzaifa Aliyash
相关产品推荐
相关产品推荐

