iOS

# 体验提升

# 通话中质量检测

在通话场景中,开发者经常需要了解当前通话的通话质量、设备状态等信息,监测通话的整体体验;也可将部分质量数据在 UI 层面展示给用户,使用户能够及时了解当前通话的整体质量。Juphoon RTC SDK 支持将关键的音视频状况、网络状况、设备状态的相关指标实时回调给 APP 应用层,应用层可以将收到的数据进行展示或统计。

# 网络质量检测

视频通话过程中,通话中成员的网络状态发生变化导致视频通话出现质量波动的时候,SDK 会通JRTCCallCallback (opens new window)onParticipantUpdate (opens new window) 回调进行上报。

/**
* 成员更新回调
*
* @param participant  成员对象
* @param changeParam  更新标识类
*/
onParticipantUpdate?: (participant: JRTCRoomParticipant, changeParam: JRTCRoomParticipantChangeParam) => void;

示例代码

onParticipantUpdate(participant: JRTCRoomParticipant, changeParam: JRTCRoomParticipantChangeParam) {
  if (changeParam.netStatus) {
      switch (participant.netStatus) {
        case JRTCNetStatus.DISCONNECTED:
          // 断开
          break;
        case JRTCNetStatus.VERY_BAD:
          // 非常差
          break;
        case JRTCNetStatus.BAD:
          // 差
          break;
        case JRTCNetStatus.NORMAL:
          // 一般
          break;
        case JRTCNetStatus.GOOD:
          // 好
          break;
        case JRTCNetStatus.VERY_GOOD:
          // 非常好
          break;
      }
    }
}

# 音频质量检测

视频通话过程中,通话中成员的说话声音状态发生变化,SDK 会通过 JRTCCallCallback (opens new window)onParticipantUpdate (opens new window) 回调进行上报。

示例代码:

onParticipantUpdate:(participant: JRTCRoomParticipant, changeParam: JRTCRoomParticipantChangeParam) => {
  if (changeParam.volumeStatus) {
    switch (participant.volumeStatus) {
      case JRTCVolumeStatus.NONE:
        // 无声音 1-30
        break;
      case JRTCVolumeStatus.VERY_LOW:
        // 很低 30-40
        break;
      case JRTCVolumeStatus.LOW:
        // 低 40-50
        break;
      case JRTCVolumeStatus.MID:
        // 中 50-70
        break;
      case JRTCVolumeStatus.HIGH:
        // 高 70-80
        break;
      case JRTCVolumeStatus.VERY_HIGH:
        // 很高 >80
        break;
    }
  }
}

# 剩余可用内存检测

通话建立后,JRTCMediaDeviceCallback (opens new window)onMemoryAvailable (opens new window) 将定时上报系统中的内存剩余情况,检测系统的运行情况。

/**
 * 上报剩余可用内存回调
 *
 * 周期性上报一次内存剩余情况
 * @param { number } memorySize  当前剩余可用内存空间(MB)
 */
onMemoryAvailable?: (memorySize: number) => void;

示例代码

onMemoryAvailable(memorySize: number) {
  if (memorySize < 100) {
    // 内存已严重不足,已不足100M,可能影响软件正常使用
  } else if (memorySize < 200) {
    // 剩余内存紧张,已不足200M
  } else if (memorySize < 300) {
    // 剩余内存低,已不足300M
  } else {
    return;
  }
}

# 文件上传

获取文件上传或断点续传信息 requestFileUploadInfo (opens new window)

/**
* 获取文件上传或断点续传信息
*
* @param { string } serialId 业务id,必选,如果是通话业务相关文件,需要传通话唯一标识 callId
* @param { JRTCRequestFileUploadParam } requestFileUploadParam 请求文件上传信息参数,必选
* @return { boolean } 接口调用结果
*  - 操作id: 接口调用成功,对应 {@link JRTCClientCallback.onRequestFileUploadInfoResponse onRequestFileUploadInfoResponse } 回调的 operatorId 参数
*  - -1: 接口调用异常,不会收到回调
* @note 目前仅支持视频和图片类型文件上传,服务端会通过文件后缀名判断
*/
public abstract requestFileUploadInfo(serialId: string, requestFileUploadParam: JRTCRequestFileUploadParam): number;


/**
* 获取文件上传或断点续传信息响应
*
* @param { number } operatorId 操作id,对应 {@link JRTCClient.requestFileUploadInfo requestFileUploadInfo} 的返回值
* @param { boolean } result 请求是否成功
*                           - true:请求成功
*                           - false:请求失败
* @param { string } url 上传地址,分片录制文件上传场景,首次请求分片上传信息时有效
* @param { string } token 文件上传所需token,用于校验上传合法性,需要在上传文件的时候携带
* @param { number } requestTimestamp 本次请求发起时间戳,用于控制上传地址有效期,需要在上传文件的时候携带
* @param { string } extraInfo 随路参数
* @param { number } fileSize 文件大小
* @param { number } offset 偏移量
* @param { string } fileType 文件类型
* @param { string } serverOid 上传目标服务Oid
* @param { string } reason 请求失败原因描述,当 result 为 false 时有效
*/
onRequestFileUploadInfoResponse?: (operatorId: number, result: boolean, url: string, token: string, requestTimestamp: number, extraInfo: string, fileSize: number, offset: number, fileType: string, serverOid: string, reason: string) => void;

示例代码

// 创建上传文件参数对象
const fileUploadParam = new JRTCRequestFileUploadParam();
fileUploadParam.setFileName("");
// ...
// 获取文件上传或断点续传信息
client.requestFileUploadInfo("serialId", fileUploadParam);

  onRequestFileUploadInfoResponse: (operatorId: number, result: boolean, url: string, token: string, requestTimestamp: number, extraInfo: string, fileSize: number, offset: number, fileType: string, serverOid: string, reason: string) => {
  if (result) {
    // 根据返回 url 进行文件上传
  } else {
    // 查看 reason 值(请求失败原因)
  }
}

文件上传成功后,再调用 completeFileUpload (opens new window) 接口确认文件已上传

/**
* 文件上传完成确认
*
* @param { string } serialId 业务id,必选,如果是通话业务相关文件,需要传通话唯一标识 callId
* @param { JRTCCompleteFileUploadParam } completeFileUploadParam 文件上传完成确认参数,必选
* @return { boolean } 接口调用结果
*  - 操作id: 接口调用成功,对应 {@link JRTCClientCallback.onCompleteFileUploadResponse onCompleteFileUploadResponse} 回调的 operatorId 参数
*  - -1: 接口调用异常,不会收到回调
* @note 通过 http 上传文件完成后,需要调用该接口确认完成,否则上传文件将无法在平台查询到
*/
public abstract completeFileUpload(serialId: string, completeFileUploadParam: JRTCCompleteFileUploadParam): number;

/**
* 文件上传完成确认响应
*
* @param { number } operatorId 操作id,对应 {@link JRTCClient.completeFileUpload completeFileUpload} 的返回值
* @param { boolean } result 请求是否成功
*                           - true:请求成功
*                           - false:请求失败
* @param { string } fileName 服务器合并后的文件名
* @param { string } extraInfo 随路参数
* @param { string } fileType 文件类型
* @param { string } reason 请求失败原因描述,当 result 为 false 时有效
*/
onCompleteFileUploadResponse?: (operatorId: number, result: boolean, fileName: string, extraInfo: string, fileType: string, reason: string) => void;

示例代码

// 文件上传完成确认
const fileUploadParam = new JRTCCompleteFileUploadParam();
client.completeFileUpload("serialId", fileUploadParam);

// 文件上传完成确认响应
onCompleteFileUploadResponse: (operatorId: number, result: boolean, fileName: string, extraInfo: string, fileType: string, reason: string) => {
  if (result) {
    // 处理上传成功的情况
  }
}