iOS

# 实现通话

# 呼叫

在呼叫之前,需要填写一些参数。

参数名 参数含义 是否必填
telNumber 业务号 业务号呼叫时必填
agentUserId 座席ID 点对点呼叫时必填
callType 呼叫类型

# 1. 点对点呼叫

在呼叫之前,需要填写坐席ID —— agentUserId。

在填好坐席ID之后,便可调用 call (opens new window) 方法进行呼叫。调用时需要传递三个对象参数 —— callParams、callAgentSettings (opens new window)mediaSettings (opens new window) 给该方法,当为点对点呼叫时,callType 便为 oneToOneCall,下面是一个示例。

const guestComponent = this.selectComponent('#guest');
const callParams = {
  telNumber: '',
  agentUserId: 'xxxxxx',
  callType: 'oneToOneCall',
};
const callAgentSettings = {
  extraInfo: '',
  heartbeatTime: 20,
  heartbeatTimeout: 60,
  securityType: 0,
  autoRecord: false,
  vipPower: 0,
};
const mediaSettings = {
  isSelfDefined: false,
  videoDefinition: 0,
  captureResolution: 1,
  maxFrameRate: 24,
  svcResolution: '1 90 70 180 180 360 480 720 1350',
  maxResolution: 0,
  renderType: 0,
  videoEncodeType: 0,
  audioEncodeType: 0,
  traceId: '',
};
guestComponent.call(callParams, callAgentSettings, mediaSettings);

# 2. 业务号呼叫

在查询到业务组后,便可以输入获取到的业务号进行业务号呼叫,参数名为 telNumber。

在填好业务号后,便可调用 call (opens new window) 方法进行呼叫。调用时需要传递三个对象参数 —— callParams、callAgentSettings (opens new window)mediaSettings (opens new window) 给该方法,当为业务号呼叫时,callType 便为 serviceCall,下面是一个示例。

const guestComponent = this.selectComponent('#guest');
const callParams = {
  telNumber: 'xxxxxx',
  agentUserId: '',
  callType: 'serviceCall',
};
...
guestComponent.call(callParams, callAgentSettings, mediaSettings);

# 来电

# 1. 接听来电

当坐席或其他用户来电时,可以调用 answer (opens new window) 方法接听来电,调用成功后会进入到通话页面,下面是一个的示例。

const guestComponent = this.selectComponent('#guest');
guestComponent.answer();

# 2. 拒接来电

当坐席或其他用户来电时,也可以调用 term (opens new window) 方法拒绝接听来电,下面是一个的示例。

const guestComponent = this.selectComponent('#guest');
guestComponent.term();

# 获取通话状态

可以使用通话状态的回调获取当前通话状态,它可以获取四个参数 type (opens new window)incomingType (opens new window)inviter (opens new window)reason (opens new window),type 表示当前的通话状态,incomingType 表示来电类型,inviter 表示邀请成员对象,reason 表示挂断原因。下面是一个示例。

/**
 * 通话状态改变回调
 *
 * @param type 访客通话状态改变类型,即以下情况会收到此回调:
 * - {@link GuestCallStateChangeType.CALLING CALLING} 访客呼叫成功
 * - {@link GuestCallStateChangeType.WAITING WAITING} 访客呼叫成功后等待座席接听
 * - {@link GuestCallStateChangeType.INCOMING INCOMING} 作为第三方访客收到通话邀请
 * - {@link GuestCallStateChangeType.TALKING TALKING} 通话接通(第三方访客)或被接通(主访客)
 * - {@link GuestCallStateChangeType.TERMED TERMED} 通话挂断或被挂断
 * @param incomingType 来电类型,当 type == {@link GuestCallStateChangeType.INCOMING INCOMING} 时有效
 * @param inviter 邀请成员对象,当 type == {@link GuestCallStateChangeType.INCOMING INCOMING} 时有效
 * @param reason 挂断原因,只在 type 为 {@link GuestCallStateChangeType.TERMED TERMED} 时需要关注
 */
onCallStateChange(e){
  const { type, incomingType, inviter, reason } = e.detail;
  console.log('onCallStateChange type:', type, 'inviter:', inviter);
}

# 通话参数

在呼叫之前,可以设置通话参数,如下表。

参数名 参数含义 是否必填
extraInfo (opens new window) 随路参数
heartbeatTime (opens new window) 心跳间隔
heartbeatTimeout (opens new window) 心跳超时
securityType (opens new window) 加密方式 (opens new window)(Number)
autoRecord (opens new window) 是否开启服务器录制
vipPower (opens new window) 呼叫权重

下面是一个示例:

callAgentSettings: {
  extraInfo: '', // 随路参数
  heartbeatTime: 20, // 通话心跳间隔
  heartbeatTimeout: 60, // 通话心跳超时时间
  securityType: 0, // 媒体加密方式
  autoRecord: false, // 服务器录制
  vipPower: 0, // 呼叫权重
},

# 媒体参数

在呼叫之前,还可以设置媒体参数,如下表。

参数名 参数含义 是否必填
isSelfDefined 自定义配置
videoDefinition (opens new window) 视频清晰度
captureResolution 采集分辨率 (opens new window)(Number) 自定义配置开启时必填
frameRate (opens new window) 帧率(0-30)
svcResolution (opens new window) SVC(说明 (opens new window))
maxResolution (opens new window) 最大分辨率 (opens new window)(Number) 自定义配置关闭时必填
renderType 渲染模式 (opens new window)(Number)
videoEncodeType (opens new window) 视频编解码 (opens new window)(Number)
audioEncodeType (opens new window) 音频编解码 (opens new window)(Number)
traceId (opens new window) 日志跟踪ID

下面是一个示例:

mediaSettings: {
  isSelfDefined: false, // 自定义配置
  videoDefinition: 0, // 房间视频清晰度
  captureResolution: 1, // 采集分辨率
  maxFrameRate: 24, // 最大帧率
  svcResolution: [ // svc 分辨率
    { resolution: 90, bitRate: 70 },
    { resolution: 180, bitRate: 180 },
    { resolution: 360, bitRate: 480 },
    { resolution: 720, bitRate: 1350 },
  ],
  maxResolution: 0, // 最大分辨率
  renderType: 0, // 渲染模式
  videoEncodeType: 0, // 通话视频编码
  audioEncodeType: 0, // 通话视音频编码
  traceId: '', // 日志跟踪ID
},

# 发送在线消息

在发送在线消息时,需要填写两个参数,如下表。

参数名 参数含义 是否必填
userId 接收者账号
message 消息内容

​ 在填好账号消息内容后,即可调用 sendOnlineMessage (opens new window) 方法发送在线消息,调用时需要把这些参数作为一个对象传给 sendOnlineMessage (opens new window) 方法。下面是一个示例。

const guestComponent = this.selectComponent('#guest');
const sendOnlineMessageInfo = {
  userId: '',
  message: '',
};
guestComponent.sendOnlineMessage(sendOnlineMessageInfo);

# 预检测功能

使用预检测功能需要引入 checked 组件,该组件可用于检测设备扬声器、麦克风和摄像头是否有用。

<view wx:if="{{isChecking}}">
  <checked 
    id="checked" 
    bindischeckingchanged="isCheckingChanged">
  </checked>
</view>

当需要控制 checked 组件的显示隐藏时,可以传入 ischeckingchanged 方法,并定义一个参数 —— isChecking。下面是一个示例。

data: {
  isChecking: false,
},
isCheckingChanged() {
  this.setData({
    isChecking: !this.data.isChecking,
  });
},

# 获取版本号信息

引入组件后,可调用 getVersion 方法获取当前组件版本信息,下面是一个示例。

const guestComponent = this.selectComponent('#guest')
const version = guestComponent.getVersion()
console.log('version:', version);

# 回调函数

配置如下:

<guest 
  id="guest"
  bindonlogin="onLogin"
  bindonlogout="onLogout"
  bindonclientstatechanged="onClientStateChanged"
  bindononlinemessagereceived="onOnlineMessageReceived"
  bindononlinemessagesendresult="onOnlineMessageSendResult"
  bindongetallgroups="onGetAllGroups"
  bindoncallstatechange="onCallStateChange"
  bindonmemberjoin="onMemberJoin"
  bindonmemberleave="onMemberLeave"
  bindonmemberupdate="onMemberUpdate"
  bindonurgentresult="onUrgentResult"
  bindonholdstatechange="onHoldStateChange"
  bindoncalltypechange="onCallTypeChange"
  bindonerror="onError">
</guest>

# 1. 登录的回调

示例代码:

/**
 * 登录结果回调
 *
 * @param result true 表示登录成功,false 表示登录失败
 * @param reason 登录失败原因,当 result 为 false 时该值有效
 */
onLogin(e){
  const { result, reason } = e.detail;
  console.log('onLogin result: ', result, ' reason: ', reason);
},

# 2. 登出的回调

示例代码:

/**
 * 登出回调
 *
 * @param reason 登出原因
 */
onLogout(e){
  const { reason } = e.detail;
  console.log('onLogout reason: ', reason);
},

# 3. 登录状态的回调

示例代码:

/**
 * 登录状态变化通知
 *
 * @param state    当前状态值
 * @param oldState 之前状态值
 */
onClientStateChanged(e){
  const { state, oldState } = e.detail;
  console.log('onClientStateChanged oldState: ', oldState, 'state: ', state);
},

# 4. 发送在线消息的回调

示例代码:

/**
 * 在线消息发送结果回调
 *
 * @param result     发送结果是否成功
 *                   - true:发送成功
 *                   - false:发送失败
 * @param operatorId 操作id,对应 {@link JRTCClient.sendOnlineMessage sendOnlineMessage} 的返回值
 */
onSendOnlineMessageResult(e){
  const { result, operatorId } = e.detail;
},

# 5. 收到在线消息的回调

示例代码:

/**
 * 收到在线消息回调
 *
 * @param message 消息内容
 * @param userId  对方用户ID
 */
onOnlineMessageReceived(e){
  const { userId, message } = e.detail;
},

# 6. 获取业务组的回调

示例代码:

/**
 * 获取业务号列表结果回调
 *
 * 访客调用 {@link JRTCGuest.queryAllGroups queryAllGroups} 接口获取业务号列表,会收到此回调。
 * @param groups 座席业务实体对象列表,获取失败时为 undefined
 * @param result 获取结果,true 表示获取成功,false 表示获取失败
 */
onGetAllGroups(e){
  const { result, groups } = e.detail;
  console.log('onGetAllGroups result, groups', result, groups);
}

# 7. 通话状态的回调

示例代码:

/**
 * 通话状态改变回调
 *
 * @param type 访客通话状态改变类型,即以下情况会收到此回调:
 * - {@link GuestCallStateChangeType.CALLING CALLING} 访客呼叫成功
 * - {@link GuestCallStateChangeType.WAITING WAITING} 访客呼叫成功后等待座席接听
 * - {@link GuestCallStateChangeType.INCOMING INCOMING} 作为第三方访客收到通话邀请
 * - {@link GuestCallStateChangeType.TALKING TALKING} 通话接通(第三方访客)或被接通(主访客)
 * - {@link GuestCallStateChangeType.TERMED TERMED} 通话挂断或被挂断
 * @param incomingType 来电类型,当 type == {@link GuestCallStateChangeType.INCOMING INCOMING} 时有效
 * @param inviter 邀请成员对象,当 type == {@link GuestCallStateChangeType.INCOMING INCOMING} 时有效
 * @param reason 挂断原因,只在 type 为 {@link GuestCallStateChangeType.TERMED TERMED} 时需要关注
 */
onCallStateChange(e){
  const { type, incomingType, inviter, reason } = e.detail;
  console.log('onCallStateChange type:', type, 'inviter:', inviter);
}

# 8. 成员加入的回调

示例代码:

/**
 * 通话中有新成员加入回调
 *
 * 当第三方成员加入时,已在通话中的所有成员会收到此回调,而新加入的成员不会收到此回调。
 * @param participant 新加入的成员对象
 */
onMemberJoin(e){
  const { participant } = e.detail;
  console.log('onMemberJoin participant: ', participant);
},

# 9. 成员离开的回调

示例代码:

/**
 * 通话中有成员离开回调
 *
 * 通话中有成员离开通话时,剩余的成员会收到此回调,而离开的成员不会收到此回调。
 * @param participant 离开的成员对象
 */
onMemberLeave(e){
  const { participant } = e.detail;
  console.log('onMemberLeave participant: ', participant);
},

# 10. 成员属性更新的回调

示例代码:

/**
 * 通话中成员属性更新回调
 *
 * 常用的有 {@link JRTCRoomParticipantChangeParam.audio audio}、{@link JRTCRoomParticipantChangeParam.video video}等。<br>
 * 例如当通话中有成员关闭视频传输,通话中所有成员都会收到此回调。
 * @param participant 属性更新的成员对象
 * @param changeParam 更新的属性对象
 */
onMemberUpdate(e) {
  const { participant, changeParam } = e.detail;
  console.log('onMemberUpdate participant, changeParam:', participant, changeParam);
},

# 11. 加急申请的回调

示例代码:

/**
 * 座席处理加急的结果回调
 *
 * 访客调用 {@link JRTCGuest.requestUrgent requestUrgent} 接口请求加急后,座席同意或拒绝加急请求,访客会收到此回调获得加急请求应答结果。
 * @param agree 加急是否通过,true 表示座席同意了访客的加急请求,false 表示不同意
 */
onUrgentResult(e){
  const { agree } = e.detail
  console.log('onUrgentResult agree: ', agree);
},

# 12. 通话保持的回调

示例代码:

/**
 * 收到通话保持或取回的回调
 *
 * 通话中座席通过保持通话或取回通话,通话中所有成员都会收到此回调。
 * @param hold true 表示通话被保持,false 表示通话取回
 */
onHoldStateChange(e){
  const { hold } = e.detail;
  console.log('onHoldStateChange hold:', hold);
},

# 13. 通话类型的回调

示例代码:

/**
 * 音视频通话切换回调
 *
 * 通话中的访客和座席切换音视频通话模式,通话中所有成员都会收到此回调。
 * @param callType 通话模式
 * - {@link CallType.AUDIO AUDIO} 语音通话模式
 * - {@link CallType.VIDEO VIDEO} 视频通话模式
 */
onCallTypeChange(e){
  const { callType } = e.detail;
  console.log('onCallTypeChange callType:', callType);
},

# 14. 错误事件的回调

示例代码:

/**
 * 上报事件回调
 *
 * @param event 事件对象
 */
onError(e) {
  const { event } = e.detail;
  console.log('onError:', event);
},

# 参数

# securityType(加密方式)

securityType 说明
0 不加密
1 SRTP
2 SM4

# captureResolution(采集分辨率)

captureResolution 说明
0 360p
1 720p
2 1080p

# maxResolution(最大分辨率)

maxResolution 说明
0 360p
1 720p
2 1080p

# renderType(渲染模式)

renderType 说明
0 FullContent
1 FullScreen

# videoEncodeType(视频编解码方式)

videoEncodeType 说明
0 H264
1 AV1

# audioEncodeType(音频编解码方式)

audioEncodeType 说明
0 OPUS
1 PCMA
2 PCMU

# reason

参数值 含义
NONE = 0 正常
OTHER 其他原因
INVALID_PARAM 参数错误
CLI_STATE_CANNOT_LOGIN 当前状态无法再次登录
CLI_TIMEOUT 登录超时
CLI_NETWORK 登录网络异常
ROOM_TIMEROUT 接入房间网络超时
ROOM_NERWORK 接入房间网络异常
ROOM_KICKED 被踢出房间
ROOM_OFFLINE 接入房间掉线
ROOM_QUIT 主动离开房间
ROOM_OVER 房间关闭
ROOM_FULL 房间满员
ROOM_INVALID_PASSWORD 房间密码无效
REASON_CONF_NUMBER_NOT_FOUND 该房间号的房间不存在
ROOM_APP_CONCURRENCY_FUL 服务器房间成员总数上限(移动端房间人数)
ROOM_ALL_CONCURRENCY_FUL 服务器房间成员总数上限(总房间人数)
ROOM_INTERNAL_ERROR 房间异常(服务端下发)
ROOM_JOIN_LICENCE_LIMIT 会场人员上限,licence限制
ROOM_AGENT_RELEASE 录制cd被释放

# clientState(登录参数)

参数值 含义
1 未登录
2 登录中
3 已登录
4 登出中

# participant(成员信息)

参数名 含义
userId 成员的账号
userUri 成员的地址
virtual 是否为虚拟用户

# callState(通话状态)

参数值 含义
CALLING(0) 呼叫中
WAITING(1) 呼叫等待中
INCOMING(2) 收到来电
TALKING(3) 通话中
TERMED(4) 通话挂断/结束/空闲

# callType(通话类型)

参数值 含义
AUDIO(0) 音频通话
VIDEO(1) 视频通话