话单

更新时间: 2022/05/19 03:30:55

呼叫组件提供通话话单功能,在一通通话结束后,您会收到对应的通话话单。通话话单是一条事件通知消息,标记此次呼叫的状态。话单以 IM 会话类型消息抄送的形式发送,收到话单后,您可以解析消息体,获得通话时间等通话详情。

下图为常见话单示例,从上至下分别对应主叫取消话单、被叫拒绝话单、超时未接听话单、被叫占线话单、正常通话带有时长的话单。

多人通话默认未封装话单功能。若您需要使用话单,请通过其他方式自行实现。

接入流程

步骤1 开通话单功能

具体步骤请参见开通服务

步骤2 发送话单

开通话单功能后,默认发送话单消息。

话单消息共有 5 类,其中 4 类为未接通时的话单,如拒接话单、占线话单、超时未接听话单、主叫取消话单,此类话单均由主叫方客户端发送;另外一类为带有通话时长的正常话单,此类话单为服务端直接发送。话单结构见话单解析部分。

步骤3 接收并解析话单

呼叫组件不包含话单接收及解析功能,用户需要参考示例项目源码自行实现。详细说明请参考消息接收

话单消息同普通消息一样通过 IM SDK 进行消息接收,示例代码如下:

objective-c@interface NEMenuViewController ()<NIMChatManagerDelegate>
@end

@implementation NEMenuViewController

- (void)dealloc {
    [[NIMSDK sharedSDK].chatManager removeDelegate:self];
}

- (void)viewDidLoad {
    [[NIMSDK sharedSDK].chatManager addDelegate:self];
}

#pragma mark - IM delegate

- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages {

    for (NIMMessage *message in messages) {
        if (message.messageType == NIMMessageTypeRtcCallRecord) {
            NECallStatusRecordModel *record = [[NECallStatusRecordModel alloc] init];
            if ([message.from isEqualToString:[NEAccount shared].userModel.imAccid]) {
                return;
            }
            if ([message.messageObject isKindOfClass:[NIMRtcCallRecordObject class]]) {
              [self parseObject:message];
            }
        }
    }
}

@end

云信话单消息结构

话单类型:

代码
话单类型 说明
NIMRtcCallStatusComplete 1 正常通话话单,通话双方都进入音视频通话后进行挂断。由组件服务器发送。
NIMRtcCallStatusCanceled 2 主叫取消话单,主叫呼叫后主动取消的话单。由客户端主叫方发送。
NIMRtcCallStatusRejected 3 被叫拒接话单,被叫拒接接听后的话单。客户端主叫方收到被叫拒接消息后进行发送。
NIMRtcCallStatusTimeout 4 超时话单,被叫收到通话邀请后不操作等待超时产生的话单。客户端主叫方发送。
NIMRtcCallStatusBusy 5 占线话单(用户忙),当主叫呼叫被叫时,被叫仍处于通话以及呼叫/被叫中,此时被叫会拒绝主叫的通话邀请。客户端主叫收到消息后会发送占线话单。

话单以 IM 消息抄送的形式发送,抄送类型为会话类型,即 eventType 为 1。会话类型的消息体中一般包含 eventType、convType、to、fromAccount、msgTimestamp、msgType、msgidClient、msgidServer、attach 等字段,其中:

  • 话单消息的 msgType 字段的值 为 NRTC_NETCALL,表示音视频话单消息抄送。
  • 话单消息中 attach 字段中包含通话类型、呼叫状态等通话详情。
  • 其他字段说明请参考会话类型消息抄送

attach 字段说明:

字段 类型 示例 说明

type

Number

1

通话类型。

  • 1:音频通话。
  • 2:视频通话。
channelId Number 123 房间 ID。

status

Number

1

呼叫状态。

  • 1:通话正常结束。
  • 2:主叫取消呼叫。
  • 3:被叫拒绝通话。
  • 4:被叫未接听呼叫,呼叫因超时被取消。
  • 5:被叫忙线,通话未接通。

durations

JsonArray

通话过程详情,JSON 数组格式,其中包括:

  • accid:通话成员的 accid。
  • duration:对应成员的通话时长。

收到的话单的 JSON 结构:

json{
   "type": 1,                       //1 表示音频,2 表示视频
   "channelId": 123,                //G2的channelId
   "status": 1,                     //1 表示正常结束通话话单,对应上表的话单类型
   "durations": [
           {
               "accid":"acc01",
               "duration":10
           },
           {
               "accid":"acc02",
               "duration":12
           }
   ]
}

接收到消息后进行消息解析。示例代码如下:

java- (void)parseObject:(NIMMessage *)message{
    NIMRtcCallRecordObject *recordObject = (NIMRtcCallRecordObject *)message.messageObject;

    // 音频/视频 类型通话
    NIMRtcCallType type = recordObject.callType;

    // 话单类型
    NIMRtcCallStatus status = recordObject.callStatus;

    //// 时长列表
    NSDictionary<NSString *, NSNumber *> *durations = recordObject.durations;

    switch (status) {
        case NIMRtcCallStatusComplete:
            // 成功接听
            break;
        case NIMRtcCallStatusCanceled:
            // 主叫用户取消
            break;
        case NIMRtcCallStatusRejected:
            // 被叫用户拒接
            break;
        case NIMRtcCallStatusTimeout:
            // 被叫接听超时
            break;
        case NIMRtcCallStatusBusy:
            // 被叫用户在通话中,占线
            break;
        default:
            break;
    }
}
此文档是否对你有帮助?
有帮助
去反馈
  • 接入流程
  • 步骤1 开通话单功能
  • 步骤2 发送话单
  • 步骤3 接收并解析话单
  • 云信话单消息结构