跳到主要内容

通话监听

融云 RongCallLib 库提供了 RCCallReceiveDelegateRCCallSessionDelegate 两个协议,用于处理呼叫相关的业务逻辑上报。

来电监听

RCCallClient 中定义了 RCCallReceiveDelegate 协议,负责上报来电或者接收到远程通知的回调。

接口原型

Objective C
/*!
CallLib全局通话呼入的监听器
*/
@protocol RCCallReceiveDelegate <NSObject>

/*!
接收到通话呼入的回调

@param callSession 呼入的通话实体
*/
- (void)didReceiveCall:(RCCallSession *)callSession;

/*!
接收到通话呼入的远程通知的回调

@param callId 呼入通话的唯一值
@param inviterUserId 通话邀请者的UserId
@param mediaType 通话的媒体类型
@param userIdList 被邀请者的UserId列表
@param userDict 远程推送包含的其他扩展信息
*/
- (void)didReceiveCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList
userDict:(NSDictionary *)userDict;

/*!
接收到通话呼入的远程通知的回调

@param callId 呼入通话的唯一值
@param inviterUserId 通话邀请者的UserId
@param mediaType 通话的媒体类型
@param userIdList 被邀请者的UserId列表
@param userDict 远程推送包含的其他扩展信息
@param isVoIPPush 是否 VoIP 推送
*/
- (void)didReceiveCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList
userDict:(NSDictionary *)userDict
isVoIPPush:(BOOL)isVoIPPush;

/*!
接收到取消通话的远程通知的回调

@param callId 呼入通话的唯一值
@param inviterUserId 通话邀请者的UserId
@param mediaType 通话的媒体类型
@param userIdList 被邀请者的UserId列表
*/
- (void)didCancelCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList;

@end

代码示例

Objective C
#import <RongCallLib/RongCallLib.h>

@interface CallManager : NSObject <RCCallReceiveDelegate>
@end

@implementation CallManager

// 设置来电监听
- (void)setupCallReceiveDelegate {
[[RCCallClient sharedRCCallClient] setDelegate:self];
}

// 接收到通话呼入
- (void)didReceiveCall:(RCCallSession *)callSession {
NSLog(@"收到来电,呼叫方:%@", callSession.callerUserId);
// 处理来电逻辑,如显示来电界面
}

// 接收到 voip 远程推送通知,或者应用在后台需要本地弹窗
- (void)didReceiveCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList
userDict:(NSDictionary *)userDict {
NSLog(@"需要本地推送通知,呼叫 ID:%@", callId);
// 处理本地推送通知
}

@end

通话状态监听

RCCallSession 中定义了 RCCallSessionDelegate 协议,支持监听通话状态的变化。

添加和移除监听器

获取 RCCallSession 对象后,可以通过以下方法添加或移除代理。

接口原型

Objective C
/**
添加通话状态的监听器

@param delegate 通话状态变化的监听器
*/
- (void)addDelegate:(id<RCCallSessionDelegate>)delegate;

/**
删除通话状态的监听器

@param delegate 通话状态的监听器
*/
- (void)removeDelegate:(id<RCCallSessionDelegate>)delegate;

代码示例

Objective C
// 添加监听器
[callSession addDelegate:self];

// 移除监听器
[callSession removeDelegate:self];

通话状态回调

通话建立、结束相关回调

当通话状态发生变化时,如接通、结束、对方振铃、有人加入通话、有人挂断等都会进行回调。支持的回调事件包括:

  • 电话已拨出,返回当前通话的详细信息
  • 已建立通话,返回当前通话的详细信息
  • 通话结束。己方挂断
  • 通话结束。对方挂断,或者通话过程网络异常造成的通话中断。建议实现 callDidDisconnectWithReason,该回调可返回结束原因(RCCallDisconnectReason
  • 通话中的远端参与者离开,返回离开者的信息和离开原因(RCCallDisconnectReason)。在多人通话与 1v1 通话中,对端挂断均会先回调 remoteUserDidLeft,再触发其他回调
  • 被叫端正在振铃,返回振铃用户的用户 ID
  • 通话中的某一个参与者,邀请好友加入通话。返回被邀请者的信息与媒体类型
  • 被叫端加入通话,返回加入者的用户信息和媒体类型
  • 当通话中的某一个参与者切换通话类型,例如由视频切换至音频。返回切换操作者的信息、切换后的媒体类型等
  • 通话过程中,发生异常。返回错误码(RCCallErrorCode
接口原型
Objective C
/*!
通话已接通
*/
- (void)callDidConnect;

/*!
通话已结束
*/
- (void)callDidDisconnect;

/*!
通话已结束

@param reason 挂断原因
@discussion 通话已结束

@warning 这个接口和 callDidDisconnect 回调方法相同,增加返回挂断原因。
同时实现本回调,通话已结束将不会再通过 callDidDisconnect 处理。

@remarks 代理
*/
- (void)callDidDisconnectWithReason:(RCCallDisconnectReason)reason;

/*!
对端用户离开

@param userId 用户ID
@param reason 挂断的原因
*/
- (void)remoteUserDidLeft:(NSString *)userId reason:(RCCallDisconnectReason)reason;

/*!
对端用户正在振铃

@param userId 用户ID
*/
- (void)remoteUserDidRing:(NSString *)userId;

/*!
有用户被邀请加入通话

@param userId 被邀请的用户ID
@param mediaType 希望被邀请者使用的媒体类型
*/
- (void)remoteUserDidInvite:(NSString *)userId mediaType:(RCCallMediaType)mediaType;

/*!
对端用户加入了通话

@param userId 用户ID
@param mediaType 用户的媒体类型
*/
- (void)remoteUserDidJoin:(NSString *)userId mediaType:(RCCallMediaType)mediaType;

/*!
对端用户切换了媒体类型

@param userId 用户ID
@param mediaType 切换至的媒体类型
*/
- (void)remoteUserDidChangeMediaType:(NSString *)userId mediaType:(RCCallMediaType)mediaType;

/*!
通话过程中的错误回调

@param error 错误码
@warning 这个接口回调的错误码主要是为了提供必要的log以及提示用户,如果是不可恢复的错误,SDK会挂断电话并回调callDidDisconnect,App可以在callDidDisconnect中统一处理通话结束的逻辑。
*/
- (void)errorDidOccur:(RCCallErrorCode)error;
代码示例
Objective C
#pragma mark - RCCallSessionDelegate

// 通话已接通
- (void)callDidConnect {
NSLog(@"通话已接通");
// 隐藏呼叫等待界面,显示通话界面
}

// 通话已结束(推荐使用带原因的回调)
- (void)callDidDisconnectWithReason:(RCCallDisconnectReason)reason {
NSLog(@"通话已结束,原因:%ld", (long)reason);
// 关闭通话界面,清理资源
}

// 对端用户加入通话
- (void)remoteUserDidJoin:(NSString *)userId mediaType:(RCCallMediaType)mediaType {
NSLog(@"用户 %@ 加入通话,媒体类型:%ld", userId, (long)mediaType);
// 更新通话界面,显示新加入的用户
}

// 通话错误处理
- (void)errorDidOccur:(RCCallErrorCode)error {
NSLog(@"通话发生错误:%ld", (long)error);
// 根据错误码处理相应逻辑
}

设备状态回调

远端参与者的设备状态变化回调:

  • 远端参与者摄像头状态发生变化时,回调 remoteUserDidDisableCamera 通知状态变化
  • 远端参与者麦克风状态发生变化时,回调 remoteUserDidDisableMicrophone 通知状态变化
接口原型
Objective C
/*!
对端用户开启或关闭了麦克风的状态

@param disabled 是否关闭麦克风
@param userId 用户ID
*/
- (void)remoteUserDidDisableMicrophone:(BOOL)disabled byUser:(NSString *)userId;

/*!
对端用户开启或关闭了摄像头的状态

@param disabled 是否关闭摄像头
@param userId 用户ID
*/
- (void)remoteUserDidDisableCamera:(BOOL)disabled byUser:(NSString *)userId;
代码示例
Objective C
// 麦克风状态变化
- (void)remoteUserDidDisableMicrophone:(BOOL)disabled byUser:(NSString *)userId {
if (disabled) {
NSLog(@"用户 %@ 关闭了麦克风", userId);
} else {
NSLog(@"用户 %@ 开启了麦克风", userId);
}
// 更新 UI 显示麦克风状态
}

// 摄像头状态变化
- (void)remoteUserDidDisableCamera:(BOOL)disabled byUser:(NSString *)userId {
if (disabled) {
NSLog(@"用户 %@ 关闭了摄像头", userId);
} else {
NSLog(@"用户 %@ 开启了摄像头", userId);
}
// 更新 UI 显示摄像头状态
}

网络质量回调

网络质量相关回调包括:

  • 当前通话网络状态上下行数据质量的回调,返回 RCCallQuality。该回调方法每秒触发一次
  • 远端当前通话网络状态上下行数据质量的回调,返回 RCCallQuality。该回调方法每秒触发一次
  • 收到某个用户的第一帧视频数据,返回用户信息
接口原型
Objective C
/*!
当前通话网络状态的回调,该回调方法每秒触发一次

@param txQuality 上行网络质量
@param rxQuality 下行网络质量, 接收到的所有远端用户网络质量的平均值
*/
- (void)networkTxQuality:(RCCallQuality)txQuality rxQuality:(RCCallQuality)rxQuality;

/*!
当前通话网络状态的回调,该回调方法每秒触发一次

@param txQuality 上行网络质量
@param rxQuality 下行网络质量, 接收到的某个远端用户的网络质量
@param userID 远端用户
*/
- (void)networkTxQuality:(RCCallQuality)txQuality rxQuality:(RCCallQuality)rxQuality remoteUserID:(NSString *)userID;

/*!
当前通话视频通话时, 收到远端用户的第一个视频帧的回调.
@param userId 远端用户ID
*/
- (void)receiveRemoteUserVideoFirstKeyFrame:(NSString *)userId;
代码示例
Objective C
// 网络质量监控
- (void)networkTxQuality:(RCCallQuality)txQuality rxQuality:(RCCallQuality)rxQuality {
NSLog(@"上行质量:%ld,下行质量:%ld", (long)txQuality, (long)rxQuality);
// 根据网络质量调整 UI 显示或给出提示
}

// 收到首帧视频
- (void)receiveRemoteUserVideoFirstKeyFrame:(NSString *)userId {
NSLog(@"收到用户 %@ 的首帧视频", userId);
// 开始显示远端视频画面
}

音量监听回调

本端用户的发送音量与对端音量均在同一个回调中反馈。该回调方法每两秒触发一次。

接口原型
Objective C
/*!
当前通话某用户声音音量回调,该回调方法每两秒触发一次

@param level 声音级别: 0~9, 0为无声, 依次变大
@param userID 用户ID, 本端用户ID(发送音量) 或 远端用户ID(接收音量)
*/
- (void)audioLevel:(NSInteger)level userID:(NSString *)userID;
代码示例
Objective C
// 音量变化监听
- (void)audioLevel:(NSInteger)level userID:(NSString *)userID {
NSLog(@"用户 %@ 的音量等级:%ld", userID, (long)level);
// 更新 UI 显示音量指示器
// level 范围:0-9,0 为无声,数值越大音量越大
}

自定义流回调

自定义媒体流相关回调:

  • 远端用户发布了自定义视频流,返回视频流相关信息
  • 远端用户取消发布自定义视频流,返回取消发布的视频流的相关信息
接口原型
Objective C
/*!
对端用户发布自定义媒体流

@param streamId 自定义流ID
@param tag 自定义流标签
@param mediaType 媒体类型
*/
- (void)remoteUserDidPublishCustomMediaStream:(NSString *)streamId streamTag:(NSString *)tag mediaType:(RCCallMediaType)mediaType;

/*!
对端用户取消发布自定义媒体流

@param streamId 自定义流ID
*/
- (void)remoteUserDidCancelPublishCustomMediaStream:(NSString *)streamId;

铃声控制回调

铃声相关回调包括:

  • 播放彩铃
  • 来电铃声
  • 停止播放铃声(通话接通或挂断)
接口原型
Objective C
/*!
彩铃
*/
- (void)shouldAlertForWaitingRemoteResponse;

/*!
来电铃声
*/
- (void)shouldRingForIncomingCall;

/*!
停止播放铃声(通话接通或挂断)
*/
- (void)shouldStopAlertAndRing;
代码示例
Objective C
// 铃声控制
- (void)shouldAlertForWaitingRemoteResponse {
// 播放等待对方接听的彩铃
}

- (void)shouldRingForIncomingCall {
// 播放来电铃声
}

- (void)shouldStopAlertAndRing {
// 停止所有铃声播放
}

视频数据处理回调

当前通话本地视频数据,用于 GPU 滤镜处理。

接口原型
Objective C
/*!
上报本地视频帧数据。

@param pixelBuffer 需要上报的本地视频帧。
@discussion
该接口为当前视频通话发送本地视频帧数据的回调。您的修改会同步到发送的视频帧数据。

@remarks 代理
*/
- (void)processVideoFrame:(nullable CVPixelBufferRef)pixelBuffer;
代码示例
Objective C
// 视频帧处理
- (void)processVideoFrame:(nullable CVPixelBufferRef)pixelBuffer {
if (pixelBuffer) {
// 对视频帧进行自定义处理,如添加滤镜
// 注意:此处的修改会影响发送给对方的视频数据
NSLog(@"处理本地视频帧数据");
}
}
注意事项
  • 建议优先使用 callDidDisconnectWithReason: 而非 callDidDisconnect,前者提供了更详细的挂断原因
  • 网络质量和音量回调频率较高,在实现时注意性能优化
  • 视频帧处理回调在主线程执行,处理时间不宜过长
  • 及时移除不需要的监听器,避免内存泄漏