房间消息集成
集成房间消息功能需要先 初始化SDK 。
主要功能为加入房间,收发房间消息、离开房间、具体流程如下:
加入房间
用户必须加入房间才能收发该房间的消息,通过房间ID
唯一标识某个房间。成功返回0,失败则返回非0。
代码示例
[[LVIMSDK sharedInstance] joinChatroom:roomId context:nil callback:^(int ecode, int rcode, int64_t cmsgid, int64_t smsgid, int64_t stime) {
/* 消息回调 */
}];
LVIM_SEND_MESSAGE_CALLBACK
参数说明:
typedef void(^LVIM_SEND_MESSAGE_CALLBACK)(int ecode, int rcode, int64_t lvsgid, int64_t smsgid, int64_t stime);
ecode
- 错误码,如果为0则代表发送消息成功,非0为失败。详见错误码
rcode
- 服务端返回码
lvsgid
- 客户端消息id
smsgid
- 服务端消息id
stime
- 发送时间戳(毫秒)
joinChatRoom
参数说明:
rid
- 待加入的房间ID。
context
- 发送消息的对象。
callback
- 消息回调。
发送房间消息
构建消息
构建成功result
为0,失败为非0。
LVIMMessage *msg = [[LVIMMessage alloc] init];
int result = [msg buildChatroomRequest:uid tid:tid type:type content:content];
buildChatroomRequest
参数说明:
uid
- 用户id。
tid
- 房间ID。此处需传成功加入的房间ID,否则该消息会发送失败。
type
- 消息类型,提供给您使用的消息扩展类型字段,您可以使用这个字段自定义消息类型。可传任意
字符串
,但不能传空串或null
。由于房间消息可能数量巨大,此时部分消息可能会被丢弃,若要保证某些类型的消息百分百到达,请联系我们商定该字段的传值以满足该需求。
- 消息类型,提供给您使用的消息扩展类型字段,您可以使用这个字段自定义消息类型。可传任意
content
- 消息内容。
代码示例
[[LVIMSDK sharedInstance] sendMessage:msg context:self callback:^(int ecode, int rcode, int64_t lvsgid, int64_t smsgid, int64_t stime) {
/* 消息回调 */
}];
callback
数据结构与进入直播间 joinChatroom callback
相同,同为 LVIM_SEND_MESSAGE_CALLBACK
类型。
sendMessage
参数说明:
msg
- 步骤1构建的消息对象。
context
- 发送消息的对象。
callback
- 消息回调。
接收房间消息
- 加入房间成功后需设置房间消息代理才能收到房间消息。
[[LVIMSDK sharedInstance] setChatroomReceiveMessageDelegate:delegateObject];
-(int)onIMReceiveMessageHandler:(NSString*)owner
immsg:(LVIMMessage*)cmimmsg
waitings:(int)waitings
packetSize:(int)packetSize
waitLength:(int)waitLength
bufferSize:(int)bufferSize
{
/* 处理收到的消息 */
return(0);
}
- 在过滤回调方法中您可以根据各参数对消息进行过滤。
-(BOOL)onIMReceiveMessageFilter:(int32_t)diytype
fromid:(const char*)fromid
toid:(const char*)toid
msgtype:(const char*)msgtype
content:(const char*)content
waitings:(int)waitings
packetSize:(int)packetSize
waitLength:(int)waitLength
bufferSize:(int)bufferSize
{
/*
* 根据此回调方法的参数进行消息过滤
* 比如当前有超过1000条消息待处理并且消息所占字节数大于10K,则丢弃该消息。
*/
if ( waitings > 1000 && packetSize > 10000 )
{
return(YES);
}
return(NO);
}
建议在初始化 sdk
时设置全局消息代理,如不设置,私信消息和房间消息都将无法收到。若设置了房间消息代理,则房间消息只会回调房间消息代理方法。在过滤回调方法中您可以根据各参数对消息进行过滤。
详细说明
-
onIMReceiveMessageFilter
消息过滤回调,对消息进行过滤。return
YES
表示丢弃消息。returnNO
则会继续处理。
-(BOOL)onIMReceiveMessageFilter:(int32_t)diytype
fromid:(const char*)fromid
toid:(const char*)toid
msgtype:(const char*)msgtype
content:(const char*)content
waitings:(int)waitings
packetSize:(int)packetSize
waitLength:(int)waitLength
bufferSize:(int)bufferSize
return(NO);
}
参数解析
diytype
- SDK处理消息加速策略用,请忽略。
fromid
- 消息发送者用户ID
toid
- 接收者用户ID(如果是房间消息则是房间ID)
msgtype
- 消息类型,提供给您使用的消息扩展类型字段,您可以使用这个字段自定义消息类型。可传任意
字符串
,但不能传空串或null
。
- 消息类型,提供给您使用的消息扩展类型字段,您可以使用这个字段自定义消息类型。可传任意
content
- 消息内容,是消息内容字符串对应的
字节数组
。
- 消息内容,是消息内容字符串对应的
waitings
- 当前收到的消息队列中等待处理的消息数量。如果待处理的消息量特别大,建议适当丢弃部分消息。
packetSize
- 此条消息数据包所占字节数。在内存紧张的情况下,建议丢弃占字节数特别大的消息。
waitLength
- 当前读取消息的缓冲区中等待处理的
字节数
大小。
- 当前读取消息的缓冲区中等待处理的
bufferSize
- 当前读取消息的
缓冲区
的大小。
- 当前读取消息的
onIMReceiveMessageHandler
消息处理回调,如果消息未被丢弃,则调用此方法。
-(int)onIMReceiveMessageHandler:(NSString*)owner
immsg:(LVIMMessage*)msg
waitings:(int)waitings
packetSize:(int)packetSize
waitLength:(int)waitLength
bufferSize:(int)bufferSize
{
return(0);
}
参数解析
owner
- 当前登录IM的用户ID。
msg
- LVIMMessage消息对象,详见LVIMMessage API
waitings
- 当前收到的消息队列中等待处理的
消息数量
。
- 当前收到的消息队列中等待处理的
packetSize
- 此条消息数据包所占
字节数
大小。
- 此条消息数据包所占
waitLength
- 当前读取消息的缓冲区中等待处理的
字节数
大小。
- 当前读取消息的缓冲区中等待处理的
bufferSize
- 当前读取消息的
缓冲区
的大小。
- 当前读取消息的
离开房间
离开房间和加入房间对应,当用户退出房间时调用此方法。离开房间后将无法收发该房间的消息。
[[LVIMSDK sharedInstance] leaveChatroom:rid context:nil callback:^(int ecode, int rcode, int64_t lvsgid, int64_t smsgid, int64_t stime) {
/* 消息回调 */
}];
callback
数据结构与进入直播间 joinChatroom callback
相同,同为 LVIM_SEND_MESSAGE_CALLBACK
类型。
详细说明
eaveChatRoom
参数详解:
rid
- 待离开的房间ID。
context
- 发送消息的对象。
callback
- 消息回调。