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) 视频通话