iOS

实时互动频道

更新时间: 2024/11/21 15:43:37

实时互动频道模块,是基于圈组,在文字基础上新增的,用于提供产品能力、丰富社区运营、提升用户活跃的,适用于百万用户量级、多场景、多能力的在线实时互动的多媒体插件。

网易云信 NIM SDK 通过插件的方式引入实时互动频道模块,通过接口的融合,帮助用户在圈组中实现在线实时互动,用户无需独立对接。

实时互动频道模块(QChatMedia)中主要包含以下三类接口,分别实现不同的功能。

本文介绍如何在圈组中引入实时互动频道模块,并在实时互动频道中实现实时音视频通话功能。

技术原理

图中的圈组服务器并非传统意义上的服务器,它是社群本身。所有的内容、兴趣、话题、关系都是以此为基础进行发展的。在圈组的场景下,任何行为的开始前都应该先创建一个圈组服务器。圈组详细信息,请参见圈组介绍

实时互动频道与频道的关联逻辑

实时互动频道是频道的一种类型,通过参数 NIMQChatChannelType 来区分(NIMQChatChannelTypeRTC = 1)。

频道的管理需要在 NIMQChatChannelManager 中进行,包括创建、删除实时互动频道,以及管理权限等,具体请参见频道管理

实时互动频道内的音视频相关功能需要在实时互动频道模块 (QChatMedia) 中实现。

使用实时互动频道模块相关接口,需要拥有音视频权限(具体权限类型请参见NIMQChatPermissionType),可通过更新身份组来实现。

实时互动频道可见机制

实时互动频道的可见机制与频道相同,分以下两种情况:

  • 如果实时互动频道为公开频道,那么只要用户未被加入频道黑名单,实时互动频道就对其可见。
  • 如果实时互动频道为私密频道,那么用户需被加入频道白名单,实时互动频道才对其可见。

频道黑白名单相关操作,请参见频道管理

实现方法

本节以实时互动频道创建者与实时互动频道成员之间的交互为例,介绍在圈组中实现音视频通话功能的流程。

前提条件

时序图

sequenceDiagram



用户A ->> 圈组: 初始化并登录圈组
用户B ->> 圈组: 初始化并登录圈组
用户A ->> 圈组: 创建圈组服务器(自动生成@everyone身份组)
用户B ->> 圈组: 加入圈组服务器
用户A ->> 圈组: 修改服务器身份组并设置实时互动相关权限
用户A ->> 圈组: 创建实时互动频道
note over 用户A: 频道类型为NIMQChatChannelTypeRTC
note over 圈组: 实现音视频通话功能(以共享屏幕和打开音频为例) 
用户A ->> 圈组: 引入NIMQChatMedia模块
用户B ->> 圈组: 引入NIMQChatMedia模块
用户A ->> 圈组: 初始化NIMQChatMedia模块
用户A ->> 圈组: 连接已创建的实时互动频道
用户B ->> 圈组: 初始化NIMQChatMedia模块
用户B ->> 圈组: 连接实时互动频道
用户A ->> 圈组: 监听成员屏幕共享状态和成员音频状态
用户B ->> 圈组: 开启本端屏幕共享和音频
圈组 ->> 用户A: 返回成员屏幕共享状态和音频状态回调

这里主要介绍部分步骤,其余步骤请参考对应的文档。

实现流程

1.用户 A 通过调用 updateServerRole: 方法修改服务器身份组并设置实时互动相关权限(NIMQChatPermissionType)。示例代码如下:

// 连接权限
NIMQChatPermissionStatusInfo *connectPermission = [[NIMQChatPermissionStatusInfo alloc] init];
connectPermission.type = NIMQChatPermissionTypeRTCChannelConnect;
connectPermission.status = NIMQChatPermissionStatusAllow;

// 开启麦克风权限
NIMQChatPermissionStatusInfo *microPhonePermission = [[NIMQChatPermissionStatusInfo alloc] init];
microPhonePermission.type = NIMQChatPermissionTypeRTCChannelOpenMicrophone;
microPhonePermission.status = NIMQChatPermissionStatusAllow;

// 开启摄像头权限
NIMQChatPermissionStatusInfo *cameraPermission = [[NIMQChatPermissionStatusInfo alloc] init];
cameraPermission.type = NIMQChatPermissionTypeRTCChannelOpenCamera;
cameraPermission.status = NIMQChatPermissionStatusAllow;

NIMQChatUpdateServerRoleParam *param = [[NIMQChatUpdateServerRoleParam alloc] init];
param.serverId = 56435;
param.roleId = 765436;
param.commands = @[connectPermission, microPhonePermission, cameraPermission];

//修改权限
[[NIMSDK sharedSDK].qchatRoleManager updateServerRole:param completion:^(NSError * _Nullable error, NIMQChatServerRole * _Nullable result) {
    //修改完成后的code            
}];

修改服务器身份组权限需要拥有管理身份组的权限(NIMQChatPermissionTypeManageRole)。具体请参见身份组

  1. 用户 A 调用 createChannel: 方法创建实时互动频道。示例代码如下:
objcid<NIMQChatChannelManager> qchatChannelManager = [[NIMSDK sharedSDK] qchatChannelManager];
NIMQChatCreateChannelParam * param = [[NIMQChatCreateChannelParam alloc] init];
param.serverId = 123456;
param.name = @"云信Channel";
param.type = NIMQChatChannelTypeRTC;
//反垃圾业务id
param.antispamBusinessId = @"{\"picbid\": \"804265342b7425324f53425c343454\", \"txtbid\": \"804265342b7425324f53425c343454\"}";
[qchatChannelManager createChannel:param
    completion:^(NSError *__nullable error, NIMQChatChannel *__nullable result) {
    // your code
}];
  • 创建实时互动频道需要拥有管理频道的权限(NIMQChatPermissionTypeManageChannel)。具体请参见身份组
  • 实时互动频道的类型为 NIMQChatChannelTypeRTC
  • 创建的实时互动频道需要对用户 B 可见,后续用户 B 才能进行连接。具体请参见实时互动频道可见机制
  1. 引入实时互动频道功能插件(NIMQChatMediaKit)。示例代码如下:
pod 'NIMQChatMediaKit'
  1. 调用 initWithCompletion: 方法初始化实时互动频道模块,添加相关代理监听方法。示例代如下:
[[NIMQChatMediaKit shared] initWithCompletion:^(NSError * _Nullable error) {
       //初始化完成后的code
}];
[[NIMQChatMediaKit shared].channelManager addMediaChannelListener:self];
  1. 调用 connectChannel:ofServer:completion: 方法连接已创建的实时互动频道。示例代码如下:
[[NIMQChatMediaKit shared].channelManager connectChannel:4235654 ofServer:5325432 completion:^(NSError * _Nullable error) {
        //进入实时互动频道后的code
}];
  1. 在实时互动频道中实现具体的音视频功能(以共享屏幕和打开音频为例)。

    a. 注册成员共享屏幕状态(onMemberScreenShareStateChangedWithMember:isSharing:operateBy:)和成员音频状态(onMemberAudioMuteChangedWithMember:mute:operateBy: )回调方法监听事件。

    b. 调用 startScreenShareWithCompletion:unmuteAudioWithAccId:completion: 方法开启本端屏幕共享并打开成员音频。

    c. 触发回调,服务器返回成员共享屏幕状态和成员音频状态信息。

// 成员共享屏幕状态回调
- (void)onMemberScreenShareStateChangedWithMember:(NSString *)memberAccId isSharing:(BOOL)isSharing operateBy:(NSString *)operateByAccId
{
    
}
// 成员音频状态回调
- (void)onMemberAudioMuteChangedWithMember:(NSString *)memberAccId mute:(BOOL)mute operateBy:(NSString *)operateByAccId
{
    
}

****

// 开启本端屏幕共享
[[NIMQChatMediaKit shared].channelManager startScreenShareWithCompletion:^(NSError * _Nullable error) {
    dispatch_async(dispatch_get_main_queue(),^{
        if (!error) {
            // 打开屏幕共享成功
        } else {
            // 打开屏幕共享失败
        }
    });
}];
// 打开成员音频
[[NIMQChatMediaKit shared].channelManager unmuteAudioWithAccId:@"zhangsan" completion:^(NSError * _Nullable error) {
    dispatch_async(dispatch_get_main_queue(),^{
        //更新UI
    });
}];
  1. 调用 disconnectCompletion: 方法与实时互动频道断开连接。示例代码如下:
[[NIMQChatMediaKit shared].channelManager disconnectCompletion:^(NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(),^{
            if (!error) {
                // 退出房间成功
            } 
        });
    }];

实时互动频道功能列表

以上流程中只针对共享屏幕和打开音频进行了具体说明,实时互动频道还支持以下功能,可参考上述示例实现用户所需的其他音视频功能。

功能
描述
切换摄像头 switchCamera
打开音频 unmuteAllAudioWithCompletion:(所有成员);unmuteMyAudio:(自己);unmuteAudioWithAccId:(指定成员)
打开视频 unmuteAllVideoWithCompletion:(所有成员);unmuteMyVideo:(自己); unmuteVideoWithAccId:completion:(指定成员)
共享屏幕 startScreenShareWithCompletion:
订阅远端视频流/辅流视频 subscribeRemoteVideoStreamWithAccIdsubscribeRemoteVideoSubStreamWithAccId:
设置用户画布 setupLocalVideoCanvas:(本端画布);setupRemoteVideoCanvas:(远端画布);setupRemoteSubStreamVideoCanvas:(远端辅流画布)
打开扬声器 setSpeakerphoneOn:
启动说话者音量提示 enableAudioVolumeIndicationWithEnable:

API 参考

以下为本文涉及的实时互动频道相关 API。

API
说明
updateServerRole: 修改服务器身份组
createChannel: 创建实时互动频道
initWithCompletion: 初始化实时互动频道模块
connectChannel:ofServer:completion: 连接实时互动频道
disconnectCompletion: 取消连接实时互动频道
addMediaChannelListener: 添加实时互动频道事件监听
removeMediaChannelListener: 移除实时互动频道监听
unmuteAudioWithAccId:completion: 打开成员音频
muteVideoWithAccId:completion: 关闭成员音频
startScreenShareWithCompletion: 开启本端屏幕共享
stopScreenShareWithCompletion: 关闭本端屏幕共享
onMemberScreenShareStateChangedWithMember:isSharing:operateBy: 成员屏幕共享状态回调
onMemberAudioMuteChangedWithMember:mute:operateBy: 成员音频状态回调

更多实时互动频道相关接口如下:

常见问题

调用connectChannel: 方法连接已创建的实时互动频道时报错,提示需要 token。

问题原因:连接的频道不是实时互动频道,即频道类型不是 NIMQChatChannelTypeRTC,请重新连接类型为 NIMQChatChannelTypeRTC 的频道。

此文档是否对你有帮助?
有帮助
去反馈
  • 技术原理
  • 实时互动频道与频道的关联逻辑
  • 实时互动频道可见机制
  • 实现方法
  • 前提条件
  • 时序图
  • 实现流程
  • 实时互动频道功能列表
  • API 参考
  • 常见问题