iOS

# 体验提升

# 1. 通话中质量检测

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

# 网络质量检测

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

/**
 * 成员属性更新回调
 *
 * 当房间中有成员的属性发生变化时,房间中的其他成员会收到此回调,例如音频上传状态、视频上传状态、网络状态等发生变化。
 * @param participant JRTCRoomParticipant 成员对象
 * @param changeParam JRTCRoomParticipantChangeParam 更新标识类对象
 * @param room 当前 JRTCRoom 对象
 */
- (void)onParticipantUpdate:(JRTCRoomParticipant*)participant changeParam:(JRTCRoomParticipantChangeParam *)changeParam room:(JRTCRoom *)room;

示例代码:

- (void)onParticipantUpdate:(JRTCRoomParticipant*)participant changeParam:(JRTCRoomParticipantChangeParam *)changeParam room:(JRTCRoom *)room {
    if (changeParam.netStatus) {
        switch (participant.netStatus) {
            case NetStateDisconnected:
                // 断开
                break;
            case NetStateVeryBad:
                // 非常差
                break;
            case NetStateBad:
                // 差
                break;
            case NetStateNormal:
                // 一般
                break;
            case NetStateGood:
                // 好
                break;
            case NetStateVeryGood:
                // 很好
                break;
        }
    }
}

# 音频质量检测

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

示例代码:

- (void)onParticipantUpdate:(JRTCRoomParticipant*)participant changeParam:(JRTCRoomParticipantChangeParam *)changeParam room:(JRTCRoom *)room {
    if (changeParam.volumeStatus) {
        switch (participant.volumeStatus) {
            case VolumeStatusNone:
                // 无声音  1 - 30
                break;
            case VolumeStatusVeryLow:
                // 很低   30 - 40
                break;
            case VolumeStatusLow:
                // 低 	 40 - 50
                break;
            case VolumeStatusMid:
                // 中 	 50- 70
                break;
            case VolumeStatusHigh:
                // 高 	 70 - 80
                break;
            case VolumeStatusVeryHigh:
                // 很高 	80 - 100
                break;
        }
    }
}

# 剩余可用内存检测

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

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

# 2. 文件上传

# 使用老的 upload 服务文件上传

文件上传要先调用 getUploadUrl (opens new window) 获取上传的地址。

/**
* 获取文件上传路径
*
* 调用此接口,fileId 非必须指定时可传空字符串 <br>
* 调用成功后,文件上传路径等具体信息可通过 {@link JRTCClientCallback.onGetUploadUrlResponse:token:url:fileld:offset: onGetUploadUrlResponse} 回调获取 <br>
* @param fileId 文件 id,
* @note 文件 id 用于断点续传,第二次续传文件时需要传递前一次获取到的 fileId
*       首次新文件上传,建议传空,fileId 由服务器自动生成下发
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
- (bool)getUploadUrl:(NSString *_Nullable)fileId;

文件上传地址可在 JRTCClientCallback (opens new window)onGetUploadUrlResponse (opens new window) 中获得。

/**
* 获取文件上传地址等信息回调
*
* 通话中访客可调用 {@link JRTCClient.getUploadUrl: getUploadUrl} 接口获取文件上传的地址等信息,具体信息通过此回调获取。
* @note
* 一般上传本地文件到服务器时,需要先调用 {@link JRTCClient.getUploadUrl: getUploadUrl} 接口,然后通过此回调的信息再上传至服务器。
* @param result 获取结果,true 表示获取成功,false 表示获取失败
* @param token 校验用的token
* @param url 文件上传地址
* @param fileId 文件id
* @param offset 文件续传位置
*/
- (void)onGetUploadUrlResponse:(bool)result token:(NSString *)token url:(NSString *)url fileId:(NSString *)fileId offset:(long)offset;

示例代码:

// 获取文件上传路径信息
[_client getUploadUrl];

// 收到获取文件上传地址等信息回调
- (void)onGetUploadUrlResponse:(bool)result token:(NSString *)token url:(NSString *)url fileId:(NSString *)fileId offset:(long)offset {
    // 获取到文件上传地址等信息后,上传文件至服务器
}

# 使用新的 upload 服务文件上传

# 使用新 upload 服务文件上传

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

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

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

示例代码:

JRTCRequestFileUploadParam *fileUploadParam = [JRTCRequestFileUploadParam new];
fileUploadParam.fileName = @"xxx";

[client requestFileUploadInfo:@"serialId" requestFileUploadParam:fileUploadParam];


- (void)onRequestFileUploadInfoResponse:(int)operatorId result:(bool)result url:(NSString *)url token:(NSString *)token requestTimestamp:(long)requestTimestamp extraInfo:(NSString *)extraInfo fileSize:(long)fileSize offset:(int)offset fileType:(NSString *)fileType serverOid:(NSString *)serverOid reason:(NSString *)reason {
   if (result) {
       // 根据返回 url 进行文件上传
   } else {
        // 查看 reason 值(请求失败原因)
   }
}

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

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

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

示例代码:

JRTCCompleteFileUploadParam *fileUploadParam = [JRTCCompleteFileUploadParam new];
[client completeFileUpload:@"serialId" completeFileUploadParam:fileUploadParam];

- (void)onCompleteFileUploadResponse:(int)operatorId result:(BOOL)result fileName:(NSString *)fileName extraInfo:(NSString *)extraInfo fileType:(NSString *)fileType reason:(NSString *)reason {
    if (result) {
       
   } else {
        // 查看 reason 失败原因
   }
}