HERE iOS Premium SDK语音导航英里/英尺单位配置问题
你找的方向没错——美式单位(英里/英尺)的语音播报确实依赖对应地区的语音包,但在语音包的获取和配置环节可能还有遗漏,我来帮你梳理完整的解决步骤:
1. 筛选并获取美式英语语音包
NMAVoiceCatalog返回语音包数量少,大概率是因为默认只加载了基础语音资源,你需要在更新完成后主动筛选美式英语(en-US)的语音条目:
- 在
voiceCatalog(_ catalog: NMAVoiceCatalog, didFinishUpdatingWith voices: [NMAVoice]?)代理方法中,遍历返回的voices列表,找到语言代码为en-US的语音(通常ID格式类似en-US-male-1或en-US-female-1)。 - 如果列表里没有美式语音包,先检查HERE开发者后台的配置:确认已开启对应语音资源的权限,或者当前SDK版本是否包含该地区的语音包。
2. 下载并设置目标语音包
找到美式语音包后,执行下载并将其设为当前导航语音:
// 遍历语音列表筛选美式英语语音 if let targetVoice = voices?.first(where: { $0.languageCode == "en-US" }) { // 检查语音包状态,已下载则直接设置 if targetVoice.state == .downloaded { voiceCatalog?.setVoice(targetVoice, completion: { error in if let error = error { print("语音设置失败: \(error.localizedDescription)") } else { print("成功切换为美式英语语音") } }) } else { // 未下载则启动下载流程 voiceCatalog?.downloadVoice(targetVoice, progress: { progress in print("语音包下载进度: \(progress)%") }, completion: { error in guard error == nil else { print("语音包下载失败: \(error!.localizedDescription)") return } // 下载完成后设置语音 self.voiceCatalog?.setVoice(targetVoice, completion: nil) }) } }
3. 显式配置导航单位系统(关键补充)
即使使用了美式语音包,建议主动设置导航的单位偏好为英制,确保播报和显示的单位统一:
if let navManager = NMANavigationManager.sharedInstance() { navManager.preferredUnitSystem = .mile }
常见问题排查
- 若
NMAVoiceCatalog始终仅返回1个语音包:尝试清理SDK缓存后重新调用update(),同时检查设备网络连接(语音包列表需要联网获取)。 - 播报仍使用公制单位:确认选中的语音包确实是
en-US地区的,同时检查preferredUnitSystem是否正确设置为.mile。
内容的提问来源于stack exchange,提问作者Peter Fabry
相关产品推荐
相关产品推荐

