iOS Swift中Google Map点击位置后崩溃/冻结问题求助
解决iOS Swift Google Maps点击冻结/崩溃问题
你碰到的这个问题我之前帮不少开发者排查过,主要是两个报错点在搞事情:一个是Google Maps内部类的重复实现,另一个是缓存属性的转换器不安全。下面给你一步步的解决方案:
1. 彻底清理依赖与项目缓存
这类重复实现的报错,大概率是Pod依赖缓存或者Xcode衍生数据搞的鬼,先把这些清干净:
- 打开终端,进入项目目录,依次执行这些命令:
rm Podfile.lock pod deintegrate pod install - 清理Xcode的Derived Data:打开Xcode → 顶部菜单栏选择
Xcode > Preferences > Locations,找到Derived Data那一行,点击右边的箭头打开文件夹,全选删除里面的内容;或者直接在终端跑:rm -rf ~/Library/Developer/Xcode/DerivedData - 重启模拟器,并且清除模拟器的内容与设置(模拟器顶部菜单
Device > Erase All Content and Settings)
2. 统一并更新Google Maps SDK版本
版本不一致或者使用旧版SDK是常见诱因:
- 打开你的Podfile,确保GoogleMaps(以及相关的GooglePlaces等库)使用最新稳定版本,比如:
注意所有Google相关的库版本要保持一致,不要混用不同版本。pod 'GoogleMaps', '~> 7.0' pod 'GooglePlaces', '~> 7.0' - 执行
pod update GoogleMaps强制更新到最新版,Google通常会在新版本里修复这类内部类冲突和缓存相关的bug。
3. 处理GMSCacheProperty的NSValueTransformer问题
这个报错要么是你自定义的转换器有问题,要么是SDK内部的bug:
- 检查你自己的代码里,有没有针对
GMSCacheProperty自定义过NSValueTransformer,如果有,确保它不会返回nil,并且是线程安全的。 - 如果是SDK内部的问题,更新到最新版SDK后基本能解决;如果还是存在,可以尝试在App启动时(比如
AppDelegate的didFinishLaunchingWithOptions里)添加一行代码清除相关缓存配置:UserDefaults.standard.removeObject(forKey: "GMSCacheProperty")
4. 关闭NSZombie调试模式
有时候开启Zombie Objects调试会触发这类重复实现的警告,进而导致崩溃:
- 打开Xcode的Scheme设置(顶部菜单栏
Product > Scheme > Edit Scheme),选择Run标签页,切换到Diagnostics面板,取消勾选Zombie Objects,然后重新运行项目。
5. 检查地图交互的代码逻辑
点击地图时的崩溃也可能是你的业务代码有问题:
- 确保所有操作Google Maps UI的代码都在主线程执行,比如更新标记、调整地图视角等,用
DispatchQueue.main.async包裹:DispatchQueue.main.async { // 这里写地图相关的UI操作 self.mapView.addMarker(marker) } - 检查是否存在循环引用:比如地图的delegate设置成了当前ViewController,但没有用弱引用,导致内存泄漏。可以用Xcode的
Memory Graph Debugger(调试栏里的箭头图标)检查内存情况。
如果以上步骤都试过还是不行,可以创建一个全新的测试项目,只引入GoogleMaps SDK,写最简单的点击地图逻辑,看是否能复现问题——如果测试项目没问题,那就是你现有项目的代码或者依赖冲突导致的,需要逐步排查引入的其他第三方库。
内容的提问来源于stack exchange,提问作者Vrujesh Modi
相关产品推荐
相关产品推荐

