使用HERE API计算ETA未收到回调问题求助
解决HERE iOS SDK中NMACoreRouter计算路由无回调的问题
我之前也踩过一模一样的坑——调用calculateRoute后完全没反应,既没进回调,控制台也没错误输出,折腾半天才找到根源。咱们一步步来排查解决:
最常见的原因:核心路由器实例被提前释放
这是90%概率会碰到的问题:你代码里的coreRouter是局部变量,当calculateRoute所在的函数执行完毕后,这个局部变量会被系统销毁。而路由计算是异步操作,闭包默认对coreRouter是弱引用,实例销毁后回调自然永远不会触发。
解决方法:把coreRouter改成类的属性
在你的ViewController或者管理路由的类里,把coreRouter声明为实例属性,确保它能被持有到回调执行完成:
// 在类的顶部声明属性 var coreRouter: NMACoreRouter? // 路由计算方法 func calculateETA() { let routeMode = NMARoutingMode() routeMode.transportMode = NMATransportMode.car routeMode.routingOptions.insert(NMARoutingOption.avoidHighway) routeMode.routingType = NMARoutingType.fastest routeMode.resultLimit = 1 let startPoint = NMAGeoCoordinates(latitude: 52.562755700200796, longitude: 13.34599438123405) let endPoint = NMAGeoCoordinates(latitude: 52.520720371976495, longitude: 13.332345457747579) guard startPoint.isValid, endPoint.isValid else { print("坐标无效,请检查经纬度格式") return } let stops: [NMAGeoCoordinates] = [startPoint, endPoint] // 初始化类属性而非局部变量 coreRouter = NMACoreRouter() coreRouter?.calculateRoute(withStops: stops, routingMode: routeMode) { (routeResult, error) in // 现在就能正常进入回调了 if let error = error { print("路由计算出错:\(error.localizedDescription)") return } if let route = routeResult?.routes?.first { let etaMinutes = route.duration / 60 print("预估到达时间:\(etaMinutes)分钟") } else { print("未找到可用路由") } } }
其他需要排查的点
如果改了属性还是没反应,再检查这几个地方:
- SDK初始化与API Key:确保HERE SDK已经用有效的API Key完成初始化,初始化失败的话所有SDK操作都会静默失效。可以加个检查:
NMAApplicationContext.setApiKey("你的API Key") guard NMAApplicationContext.sharedInstance().isInitialized else { print("HERE SDK初始化失败,请检查API Key是否有效") return } - 路由参数兼容性:确认
routingOptions和transportMode是否匹配,比如avoidHighway和car模式是兼容的,但如果设置了和当前交通方式冲突的选项,也可能导致无结果。
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

