作者丨
关联:
之前我答应过会发一篇关于微信付款到账语音提醒的总结文章,但一直拖着不写。 一方面还没有上线,另一方面我们一直在做红包项目。 现在两个项目都已经成功上线了,我终于可以停下来总结一下开发过程中的具体计划和遇到的问题了。
一、背景
随着苹果老爸发布了新的,两年前的这个解决方案就不能再用了。
微信iOS支付收款语音提醒开发总结
具体原因是苹果不再允许在非voip电话上使用voip推送。 如果需要使用,则需要访问该接口。 这样,接收到 Voip Push 就会发起呼叫。 全屏界面。 在国内发布过应用的同学应该知道,这个接口是不允许拉起的。 本文总结了以下语音播报迁移方案以及需要注意的一些问题。 目前微信7.0.10版本已经带来了这些功能。
2、技术方案
新的解决方案主要采用(以下简称NSE)。 当apns上的“-”值为1时,会输入NSE代码。 我们可以在这里更改后台推送的通知内容。 包括通知铃声。 与Voip方案最大的区别在于NSE无法唤醒主应用,也无法访问主应用的文件空间,只能处理进程中的相应逻辑。
在 NSE 中,您可以通过为 t 中的属性分配值,在弹出通知时播放自定义音频。
// 该文件要用于 . 必须位于应用程序数据的 / 或应用程序数据的 / 中。 如果文件不在 a 中,则会在应用程序的 .
文档中明确描述了音频文件的存储路径,以及读取的优先级:
在主应用程序的 / 文件夹中
在共享目录的/文件夹中
在主要
自定义铃声支持的声音格式包括aiff、wav、wav格式。 铃声长度必须小于30秒,否则系统将播放默认铃声。
而且由于是通知铃声,声音默认设置为静音开关,所以不需要像以前一样使用黑魔法来判断静音开关(黑魔法在不同机型上偶尔会误判静音开关)。
由于我们在NSE中自定义铃声,因此无法访问1和3这两个文件路径。/文件夹中只能存放合成或下载的语音音频文件。 您需要在以下位置打开此功能
of:该方法访问的根目录。
语音合成
微信的支付收据语音依赖于我们自主开发的强大的离线语音合成库。 apns携带需要合成的文本内容。 通过离线语音合成库生成wav音频文件后,将文件写入/文件夹,最后更改属性,使通知播放定制的收款语音。
如果一些小企业没有能力进行离线合成(我看到市面上几个比较强大的离线合成服务是需要收费的),可以使用在线合成,然后通过http下载。 科大讯飞和微信提供免费服务。 这种方案的缺点是依赖于后台和当前的网络环境,可能会导致消息广播延迟的问题。 如果30秒内没有成功,需要在方法中进行处理。 最好的解决方案是播放默认语音。
3.开发过程中遇到的问题:消息播放队列
NSE方案的一个问题是,当客户端在短时间内收到多个广播通知时,后面的通知会覆盖前面的通知,导致前面的通知广播不完整。 这种情况对于商家来说是相当麻烦的。 。 因此,需要添加一个消息队列,并将所有需要广播的通知添加到队列中。 播放完上一条消息后,将播放下一条消息。 音频的播放时间可以通过后台推送。 如果是自己合成的wav,可以通过播放时间=(音频大小-音频头)/(采样频率*采样精度*通道数)来计算。
多线程问题
需要注意的是,NSE的代码逻辑并不是在主线程上执行的。 苹果的设计非常合理。 一方面避免了NSE中开发人员因代码设计问题而导致其他前端应用接口出现问题。 另一方面,主项目此时已被暂停或终止。 本来,主线程的执行时间也不应该交给NSE。
因此,我们在处理上面提到的消息播放队列以及文件的读写时,需要对相应的代码逻辑加锁,否则会出现多线程问题。
消息去重
由于支付消息比普通消息对可达性和实时性有更高的要求,因此在最初的设计中采用了双通道,以减少VoIP偶尔出现的消息丢失和延迟问题。 之前的Voip解决方案是客户端会收到两条相同的Voip消息,消息会通过记录中的单个号码进行重复数据删除。 然而,在NSE中,客户端无法主动删除重复项。 根本原因是NSE的设计理念只是修改内容,并不能阻止通知的弹出。 这从超时处理方法的文档中可以看出:
如果(_::)渴望它,这个就给你最后一个。 将其用于 as as 。 所以意味着一些。 因为,如果您的文件的 的 是 的,那么您的文本就是该的。 如果您未能及时到达 from (_::),则 the s 。
如果您在30秒内没有调用该方法且没有执行该方法,系统会在后台帮您主动推送推送到客户端的原始内容。
这里的解决方案是让后台,让双通道触发的apns消息携带相同的apns--id,后续的通知会覆盖之前的通知。 但这里还有另一个问题。 尽管用户看到一条消息,但声音仍会播放两次。 这里可以把播放的消息票号记录下来,然后设置为空白音频,重现重复的票号就可以了。
三、总结
事实上,现在回想起来,NSE 是一个比 Voip 更优雅的解决方案。 NSE方案整体代码量也比Voip少很多。 您为什么不首先选择这个解决方案? 这其实是有历史原因的。 一方面,NSE是一个后来才出现的新产品。 第一个版本的解决方案做出来的时候,刚刚发布,大家对它的理解还不够。 另一方面,当时的微信还不具备离线合成语音的能力。 只能通过Cgi拉取在线语音合成,而微信当时不具备请求Cgi的能力。 改用NSE方案后,最好的体验就是语音播报和静音开关可以完美配合。 另一方面,备受诟病的消息延迟问题也得到了改善。
推荐↓↓↓
长的
根据
关闭
笔记
涵盖:程序员、源码阅读、程序员共读、数据结构与算法、黑客技术与网络安全、大数据技术、编程前端、Java、Web编程开发、iOS开发、数据库开发、幽默程序员等。
千山万水,爱情总在,你能点击“寻找”吗?