iOS项目集成Google Maps 8.3.0 CocoaPods崩溃问题求助
Google Maps 8.3.0 崩溃问题:key cannot be nil in GMSStyleTableService
项目使用Google Maps 8.3.0版本,原本运行正常,突然出现崩溃,错误日志如下:
*** -[__NSDictionaryM setObject:forKeyedSubscript:]: key cannot be nil -[GMSStyleTableService checkStyleTableMemoryCacheForKey:callbackQueue:handler:]
已尝试通过判断self.mapView是否为空排查,但问题仍存在,相关代码如下:
if(self.mapView==nil) return; self.mapView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); GMSPath *path = [GMSPath pathFromEncodedPath:pathString]; GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithPath:path]; GMSPolyline *polyline = [GMSPolyline polylineWithPath:path]; polyline.strokeWidth = 3; polyline.strokeColor = color.blue; polyline.map = self.mapView; GMSCameraPosition *camera = [self.mapView cameraForBounds:bounds insets:UIEdgeInsetsMake(32, 32, 32, 32)]; self.mapView.camera = camera; GMSMarker *myMarker = [[GMSMarker alloc] init]; myMarker.position = self.myCoords; myMarker.icon = [UIImage imageNamed:@"dot.png"]; myMarker.map = self.mapView;
问题分析
这个崩溃的核心是GMSStyleTableService在操作字典时传入了nil的key,和你贴出的polyline、marker操作逻辑无直接关联,更偏向地图样式加载或缓存的底层问题:
- 可能是自定义地图样式(JSON格式)存在语法错误,或包含空的样式key
- Google Maps 8.3.0版本本身存在样式缓存相关的已知bug
- 地图初始化或样式设置时机不当,比如mapView未完全初始化就触发了样式相关操作
解决方案
排查自定义地图样式
- 如果项目使用了
GMSMapStyle自定义样式,检查JSON文件的语法,确保featureType、elementType等必填字段无空值 - 暂时切换回默认地图样式,测试是否还会崩溃,确认是否是样式文件导致的问题
- 如果项目使用了
补全代码中的nil判断
- 当前代码中
pathString或self.myCoords为空时,会导致后续对象初始化异常,虽然不一定直接触发当前崩溃,但建议补充判断:if (!pathString.length || !self.myCoords) { return; } GMSPath *path = [GMSPath pathFromEncodedPath:pathString]; if (!path) { return; }
- 当前代码中
清理地图缓存
- 尝试清理App沙盒中Google Maps相关的缓存目录,或调用
[GMSServices clearCache];(注意该方法在8.3.0版本中的可用性)
- 尝试清理App沙盒中Google Maps相关的缓存目录,或调用
升级Maps版本
- 8.3.0属于较旧版本,存在不少已知bug,升级到最新稳定版本可大概率解决这类底层缓存问题
内容的提问来源于stack exchange,提问作者SiOS
相关产品推荐
相关产品推荐

