2022.12
业务背景
用户在实际使用云信音视频通话 2.0 服务中,常常会遇到弱网,掉线等情况,对于这类情况,云信 SDK 提供了自动重连的相关策略,业务层不需要单独处理重连,只需要监听并做好相应的 UI 逻辑。所以如何感知当前通话状态,做好提示以优化用户体验,并联动管理自身的业务逻辑,如计费等,是业务上必须要考虑的问题。
本文以安卓为例,给各位开发者介绍云信音视频 2.0 SDK 状态管理的相关逻辑,希望可以给大家带来便利。
功能介绍
1. 本地通话状态介绍
当通话过程中遇到弱网抖动等因素,导致掉线或者无法加入房间,业务层需要通过一些提示信息优化用户体验,所以做好状态监听和获取尤其重要。
以安卓为例,目前云信音视频 2.0 SDK 提供了 5 种通话链接状态,分别为:
参考:
https://doc.yunxin.163.com/nertc/api-refer/android/doxygen/Latest/zh/html/interfacecom_1_1netease_1_1lava_1_1nertc_1_1sdk_1_1_n_e_rtc_constants_1_1_connection_state.html#af2e10c186b2706e28192ea5d996557a3
2. 本地通话状态图
为了帮助大家更好的理解 SDK 内部状态的变化逻辑,本文绘制了一份本地通话状态图可供参考。
其中,绿色线条是需要业务层手动调用,黑色线条为 SDK 内部处理,业务层不需要额外关注。
3. 本地通话状态监听/获取方式
那么,客户端 SDK 如何获取上述通话状态呢,主要有两种方式:
通过注册 NERtcCallbackEx 观察者,监听 onConnectionStateChanged() 回调。
初始化 NERtcSDK 后,主动调用 NERtcEx#getConnectionState() 获取。
4. 远端通话状态图
对于音视频通话场景,如果房间内成员遇到弱网抖动等因素,也需要让其他成员感知并做好提示。下图梳理了常规流程和异常流程下的回调逻辑参考。
5. 服务器状态管理
绝大部分的音视频通话业务,尤其涉及到计费等相关的,都需要由业务服务器维护当前的通话状态。但是实际业务生产过程中,可能会遇到比较多的用户主动杀进程,或者 APP 崩溃等情况,此时是无法依赖客户端上报来实现状态维护。云信音视频通话 2.0 提供了通话状态相关的服务器抄送,可以实现相应的状态管理的补充。
参考文档:
https://doc.yunxin.163.com/jcyOTA0ODM/docs/DUyOTg1NDI?platform=server
最佳实践:一对一通话计费状态维护
1. 准备工作
申请开通音视频进出房间抄送。
在云信后台配置准备接收消息抄送的服务器公网地址,用户进出房间的通知会抄送到这台服务器。
2. 通话状态与计费逻辑整合
业务服务器通过用户进入房间抄送中携带的 uid、channelName、timestamp 判断用户的身份以及加入的房间和时间,等待双方均已加入房间后,计费开始。
如果在计费过程中,发现用户余额不足,则可以调用删除房间接口销毁房间,将通话双方踢出房间。
如果用户余额充足,在通话结束后通过用户离开房间抄送中携带的 uid、channelName、timestamp 判断用户的身份以及加入的房间和时间来结束计费。对于一对一场景来说,只需要有一方成员退出,计费即停止。
出于逻辑健壮性考虑,客户端可以增加额外的业务心跳逻辑,每隔 1 分钟上报一次,如果扣钱方异常或者离开房间没有上报,就不再扣费。
参考流程图:
3. 高保障抄送补充
为了保障抄送在网络链路异常等情况的稳定性,云信提供了高保障的抄送策略,详情可以咨询商务经理。
标题:关于 IM 服务端消息抄送的重试机制
链接:https://faq.yunxin.163.com/#KB0163
4. 异常 Case 处理
一对一呼叫计费异常 Case 包括但不仅限于:
主叫被叫弱网,请求超时。此时 RTC 的超时时间是 40 秒左右,超时时间过后,服务器会抄送对应的离开房间信息,其中包含 reason 为超时离开。
主叫被叫主动杀进程,或者客户端崩溃,同超时离开的 case,对于服务器而言无异。
抄送由于网络因素、处理不及时等出现丢失:
考虑额外补充 3.3 版本的高保障抄送。
考虑增加客户端计费心跳的逻辑,增强健壮性。