直播间 场景实践
准备工作
在开始之前,请确保已创建应用并完成客户端 SDK 集成。
直播间状态管理
直播间状态通常包括:待开始、直播中、暂停、结束、回放中。直播间状态由业务侧进行维护。
游客模式
适用场景:未在业务册注册登录的用户进入直播间。
建议通过注册用户获取 Token 连接融云,并在业务侧限制游客是否可以发送消息。
创建并加入聊天室
- 应用服务端通过 Server API 创建聊天室,客户端获取聊天室 ID 后可加入聊天室。
- 默认同一用户不能同时加入多个聊天室,可在控制台启用单个用户加入多个聊天室。
- 加入聊天室时可通过客户端 SDK 获取最新的历史消息(默认 10 条,最多 50 条),您无法通过客户端 SDK 拉取指定的消息类型, 但可在控制台设置加入聊天室获取的指定消息。 如需拉取更多消息,可开启聊天室消息云存储。
示例代码:
- Server SDK in Java
- Server SDK in PHP
- Server SDK in Go
RongCloud rongCloud = RongCloud.getInstance("appKey", "appSecret");
//自定义 api地址方式
//RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret,api);
Chatroom chatroom = rongCloud.chatroom;
ChatroomDataModel chatroomDataModel = new ChatroomDataModel().setId("chatroomId3");
ResponseResult result2 = chatroom.createV2(chatroomDataModel);
System.out.println("createV2: " + result2.toString());
require "./../../RongCloud.php";
define("APPKEY", '');
define('APPSECRET','');
use RongCloud\RongCloud;
use RongCloud\Lib\Utils;
/**
* 创建聊天室
*/
function create()
{
$RongSDK = new RongCloud(APPKEY,APPSECRET);
$chatroom = [
['id'=> 'phpchatroom4',//聊天室 id
'name'=> 'phpchatroom1']//聊天室 name
];
$result = $RongSDK->getChatroom()->create($chatroom);
Utils::dump("创建聊天室",$result);
}
create();
func TestRongCloud_ChatRoomCreateNew(t *testing.T) {
rc := NewRongCloud(
os.Getenv("APP_KEY"),
os.Getenv("APP_SECRET"),
)
// 创建聊天室
whiteUserIds := []string{"111", "222", "333"}
err := rc.ChatRoomCreateNew(
"chatroom001",
WithChatroomDestroyType(1),
WithChatroomDestroyTime(120),
WithChatroomIsBan(true),
WithChatroomWhiteUserIds(whiteUserIds),
)
t.Log(err)
}
常见问题:
- 客户端是否支持直接创建聊天室? 不支持,仅服务端可创建聊天室。
- 用户未加入聊天室也能发送消息? 默认允许,开启SDK 用户不在聊天室中不能发送消息功能后,则需加入聊天室才能发送消息。
- 用户加入或退出聊天室时,其他聊天室成员是否有感知? 默认无感知,但您可以通过聊天室成员变化监听功能,开启后用户加入、退出聊天室后,向其他聊天室成员发送回调通知。您可以在控制台可以免费开启此功能,开启 15 分钟后生效。
- 用户多端登录时,其中 1 台设备退出聊天室后,别的设备不会同时退出吗? 默认不会。如您需其他端都退出,可以在控制台免费开启多端同时在线情况下,一端退出聊天室其他端也同步退出聊天室功能,开启 15 分钟后生效。
聊天室销毁(聊天室保活)
- 聊天室具有自动销毁机制,默认 1 个小时内无用户加入或发送消息,会自动将聊天室内所有成员踢出并销毁聊天室,详见聊天室销毁机制。您可调整默认时间销毁时间,最长可设置 24 小时(针对整个 App 设置),设置方式详见调整聊天室销毁等待时间。您也可通过设置“自动销毁类型”来修改销毁时间 ,最长为 7 天 (针对指定聊天室设置),详见设置聊天室自动销毁类型。
- 如果您希望聊天室不会自动销毁,可开启聊天室保活服务。您最多可设置 5 个保活的聊天室,如需增加数量,请联系商务。服务开启 15 分钟后生效,详见保活聊天室。此服务在旗舰版需付费使用,尊享版免费使用。
- 如果您同时使用了音视频服务,可将聊天室绑定音视频房间。当聊天室达到预设的自动销毁条件时,系统会先检测已绑定的音视频房间(RTCRoomId)是否仍存在:如果绑定的音视频房间仍存在,则阻止聊天室自动销毁;如果绑定的音视频房间已销毁,则直接销毁聊天室。详见绑定音视频房间。
聊天室公告
适用场景:通过此功能,您可以让用户在直播间列表页面查看每个直播间的公告,或在直播间内看到直播间的公告。
通过聊天室属性管理(KV)实现公告功能:
- 加入聊天室。
- 通过聊天室属性管理(KV)设置聊天室公告信息。
- 客户端通过获取聊天室 KV 属性来获取当前聊天室公告信息。
- 通过
KVStatusListener
中的onChatRoomKVUpdate
事件来同步被更改的聊天室 KV 属性,以达到通知所有聊天室成员的效果。详见添加聊天室 KV 监听器。
客户端示例代码:
- Android
- iOS
- Web
// 设置聊天室属性(KV)
String chatRoomId = "聊天室 ID";
// 聊天室属性名称,Key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符
String key = "自定义了聊天室key";//上下麦状态也可使用聊天室属性(KV) 实现。
// 聊天室属性对应的值,最大长度 4096 个字符
String value = "这是一则聊天室公告";
// true 发送通知; false 不发送。如果发送通知,SDK 会接收到类型标识为 RC:chrmKVNotiMsg 的聊天室属性通知消息(ChatRoomKVNotiMessage),并且消息内容中包含 K,V
boolean sendNotification = false;
// 退出后是否删除
boolean isAutoDel = false;
//通知的自定义字段, sendNotification 为 ture 时有效
String notificationExtra = "通知的自定义字段";
RongChatRoomClient.getInstance().setChatRoomEntry(chatRoomId, key, value, sendNotification, isAutoDel, notificationExtra, new IRongCoreCallback.OperationCallback() {
@Override
public void onSuccess() {
}
@Override
public void onError(IRongCoreEnum.CoreErrorCode coreErrorCode) {
}
});
//接收端接收:
//在加入聊天室之前设置聊天室属性(KV)状态监听器,
RongChatRoomClient.getInstance().addKVStatusListener(new RongChatRoomClient.KVStatusListener() {
@Override
public void onChatRoomKVSync(String roomId) {
//聊天室属性(KV)列表同步完成时触发。
}
@Override
public void onChatRoomKVUpdate(String roomId, Map<String, String> chatRoomKvMap) {
//onChatRoomKVUpdate 中监听感知 KV 更新
//聊天室属性(KV)列表更新完成时触发,首次同步 KV 时返回全量 KV,后续触发时仅返回新增、修改的 KV。
}
@Override
public void onChatRoomKVRemove(String roomId, Map<String, String> chatRoomKvMap) {
//KV 被删除时触发。
}
});
//发送方设置:
//聊天室 Id 即聊天室会话的 targetId
NSString *chatRoomId = @"chatRoomId";
//聊天室属性名称,Key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符
NSString *chatRoomNoticeKey = @"chatRoomNotice";
//聊天室属性对应的值,最大长度 4096 个字符
NSString *chatRoomNoticeValue = @"这是一则聊天室公告";
//是否需要发送通知, 设置为 ture 时,会在设置 Key、Value 值的同时发送一条 RCChatroomKVNotificationMessage 消息
BOOL isSendNotification = false;
//设置用户掉线或退出时,是否自动删除该 Key、Value 值;自动删除时不会发送通知
BOOL isAutoDel = false;
//通知的自定义字段, sendNotification 为 ture 时有效
NSString *extra = @"通知的自定义字段";
[[RCChatRoomClient sharedChatRoomClient] setChatRoomEntry:chatRoomId
key:chatRoomNoticeKey
value:chatRoomNoticeValue
sendNotification:isSendNotification
autoDelete:isAutoDel
notificationExtra:extra
success:^{
// 聊天室公告 KV 设置成功,可以进行业务上的操作
} error:^(RCErrorCode nErrorCode) {
}];
//接收端接收:
// 在加入聊天室之前设置聊天室属性(KV)代理,并实现对应的代理方法
[[RCChatRoomClient sharedChatRoomClient] addChatRoomKVStatusChangeDelegate:self];
/**
IMLib 聊天室属性(KV)变化的回调
@param roomId 聊天室 Id
@param entry KV 字典,如果刚进入聊天室时存在 KV,会通过此回调将所有 KV 返回,再次回调时为其他人设置或者修改 KV
*/
- (void)chatRoomKVDidUpdate:(NSString *)roomId entry:(NSDictionary<NSString *, NSString *> *)entry {
// 通过该方法获取对应 roomId 下,房间 KV 的变化
}
// 设置聊天室属性(KV)监听器
const listener = (event) => {
if (event.rejoinedRoom) {
console.log('SDK 内部重连聊天室信息:', event.rejoinedRoom)
}
if (event.updatedEntries) {
console.log('监听到的聊天室属性(KV)更新:', event.updatedEntries)
}
if (event.userChange) {
console.log('加入退出的用户通知:', event.userChange)
}
if (event.chatroomDestroyed) {
console.log('聊天室销毁:', event.chatroomDestroyed)
}
}
RongIMLib.addEventListener(Events.CHATROOM, listener)
// 设置单个属性
const entry = {
key: 'key',
value: 'value',
notificationExtra: 'extra',
isAutoDelete: true,
isSendNotification: false
}
RongIMLib.setChatRoomEntry(chatRoomId, entry).then(res => {
// 设置聊天室单个属性成功
if(res.code === 0){
console.log(res.code)
} else {
console.log(res.code, res.msg)
}
}).catch(error => {
console.log(error)
})
服务端代码示例:
- Server SDK in Java
- Server SDK in PHP
- Server SDK in GO
RongCloud rongCloud = RongCloud.getInstance("appKey", "appSecret");
//自定义 api地址方式
//RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret,api);
ChatroomEntry entry = rongCloud.chatroom.entry;
ChatroomEntryModel model = new ChatroomEntryModel();
model.setChatroomId("chatroomId1");
model.setUserId("userId1");
model.setKey("key1");
model.setValue("value1");
model.setAutoDelete(0);// 可选
model.setObjectName("RC:TxtMsg");// 可选
model.setContent("{\"key1\":\"value1\"}");// 可选
ResponseResult result = entry.set(model);
System.out.println("chatroomEntrySet Result: " + result.toString());
/**
* 聊天室属性设置
*/
use RongCloud\Lib\Utils;
use RongCloud\RongCloud;
require "./../../RongCloud.php";
define("APPKEY", '');
define('APPSECRET', '');
/**
* 设置聊天室属性(KV)
*/
function set() {
$RongSDK = new RongCloud(APPKEY, APPSECRET);
// 创建聊天室
$RongSDK->getChatroom()->create(['id' => 'chatroom001', 'name' => 'RongCloud']);
$params = [
'id' => 'chatroom001',//聊天室 id
'userId' => 'userId01',//操作用户 Id
'key' => 'key01',//聊天室属性名称
'value' => 'value01',//聊天室属性对应的值
];
$Entry = $RongSDK->getChatroom()->Entry()->set($params);
Utils::dump("设置聊天室属性(KV)", $Entry);
}
func TestRongCloud_ChatRoomEntrySet(t *testing.T) {
rc := NewRongCloud(os.Getenv("APP_KEY"), os.Getenv("APP_SECRET"))
t.Logf("app key: %s; app secret: %s", os.Getenv("APP_KEY"), os.Getenv("APP_SECRET"))
if err := rc.ChatRoomEntrySet("chrm01", "abc", "aaa", "bbb", false); err != nil {
t.Errorf("failed to chatroom entry set. err: %v", err)
} else {
t.Log("success")
}
}