目录
前言
在跟甲方合作中,需要开发一个App,除了店长管理日常日报和订单退款之外,还需要实现通过消息推送将每笔订单进行语音播报。App开发开始从其他团队借调一个做Android的人过来先完成了Android开发,ios本打算靠后一点发布。刚好遇到组织架构重组,ios就停滞了。离甲方要求的时间只有一个月时间了,产品和运营就来找我们技术团队说App能不能做,但是重新学习一门新的语言,确实一个非常大的挑战。恰好当时我很感兴趣flutter开发app,就主动提出来接这个锅。虽然年龄已经过了30,也想试一试是否还能学得动,学习新的语言和技术毕竟是兴趣使然!最终花了5天入门dart语言,5天熟悉开发环境和调试打包,真机调试等,并在1多个月内完成了Android版本的发布和ios 的开发提测!!!整体感觉不错,特别是ios的语音播报问题,从未接触过swift到最终实现ios的语音播报,特别写下这篇文章表示对自己的一份总结吧。
基于flutter开发,对于大部分功能界面确实能做到开发一套代码,在Android和ios就能做到完全兼容,在涉及到语音播报的时候,就很麻烦了,本来打算使用TTS来实现语音播报的,参考了下网上资料,大多都使用百度语音合成和科大讯飞,可是需要注册,且必须交年费才能使用,于是放弃。最后使用1到10,十,百,千,万等mp3静态资源,使用dart解析订单金额并将mp3读入内存进行语音播报,比如10元,那么解析出来的就是["file://**/1.mp3","file://**/.十.mp3","file://**/yuan.mp3"]。Android中使用flutter_exoplayer,其原理是通过MethodChannel调用原生的播放器进行语音播放,将解析出来的静态资源列表传给flutter_exoplayer插件,就可以完成多mp3无缝连播了。Java核心代码:
但flutter_exoplayer并不支持ios,而且现在该插件好像也不支持更新了,查了很多插件都不满足要求,最后索性自己探索自己搞,写出一个语音播报的功能出来。
swift端Channel实现
为了能在ios支持语音播报,坚持3天swfit的学习,基本掌握了swift语法,并通过FlutterMethodChannel实现语音播报。语音播报最后封装在SpeechPlayer类中,类之间关系如下图所示:
在SpeechPlayer初始化时,首先创建一个具有唯一名称的Channel:
在channel对象的setMethodCallHandler回调中监听dart调用的speech方法,核