Google Maps iOS SDK/Capacitor插件标记异常与渲染性能问题
iOS端Capacitor Google Maps标记渲染异常与性能问题
近期将应用迁移至Capacitor框架,使用@capacitor/google-maps插件对接Google Maps SDK时,仅iOS端出现标记异常问题(Android端运行正常):标记加载时偶现错误图标,在每秒更新位置的调试过程中,标记会随机切换图标、出现渲染伪影。
异常表现
- 每次更新时标记随机切换图标
- 地图上出现部分渲染的标记伪影
- 标记数量较多(不足100个)时触发该问题,移除至20个以内则恢复正常,重新添加后问题重现
相关Swift代码(含自定义逻辑)
// 更新标记位置的方法 func updateMarkerPosition(id: String, position: LatLng) throws { if let marker = self.markers[id] { DispatchQueue.main.sync { marker.position = CLLocationCoordinate2D(latitude: position.lat, longitude: position.lng) } } else { throw GoogleMapErrors.markerNotFound } }
private func decodeBase64ToUIImage(base64String: String) -> UIImage? { guard let data = Data(base64Encoded: base64String, options: .ignoreUnknownCharacters) else { return nil } return UIImage(data: data) } // 将Base64图片设置为标记图标的方法 private func buildMarker(marker: Marker) -> GMSMarker { let newMarker = GMSMarker() newMarker.position = CLLocationCoordinate2D(latitude: marker.coordinate.lat, longitude: marker.coordinate.lng) newMarker.title = marker.title newMarker.snippet = marker.snippet newMarker.isFlat = marker.isFlat ?? false newMarker.opacity = marker.opacity ?? 1 newMarker.isDraggable = marker.draggable ?? false newMarker.zIndex = marker.zIndex if let iconAnchor = marker.iconAnchor { newMarker.groundAnchor = iconAnchor } if let iconUrl = marker.iconUrl { if iconUrl.starts(with: "data:image") { let base64String = iconUrl.components(separatedBy: ",").last ?? "" if let base64Image = decodeBase64ToUIImage(base64String: base64String) { print("Adding new icon for marker: \(marker.uniqueID)") newMarker.icon = getResizedIcon(base64Image, marker) } } } }
// 在地图上添加标记的方法 func addMarker(marker: Marker) throws -> String { var markerHash = "nil" DispatchQueue.main.sync { let newMarker = self.buildMarker(marker: marker) newMarker.map = self.mapViewController.GMapView self.markers[marker.uniqueID] = newMarker markerHash = marker.uniqueID } return markerHash }
修复更新与新问题
采用以下方式设置图标后,原标记异常问题已修复:
let markerView = UIImageView(image: newMarker.icon) newMarker.iconView = markerView newMarker.tracksViewChanges = true // 此代码解决了原问题
但现在出现新问题:当标记数量较多时(仍不足100个),地图渲染性能显著下降。
内容的提问来源于stack exchange,提问作者Alex Predescu
相关产品推荐
相关产品推荐

