- Android
- iOS
- JavaScript
- 鸿蒙
消息相关监听
可以设置多个监听。
JIM.getInstance().getMessageManager().addListener("main", new IMessageManager.IMessageListener() {
/// 接收消息的回调
@Override
public void onMessageReceive(Message message) {
Log.d("TAG", "onMessageReceive, conversationType is " + message.getConversation().getConversationType() + ", conversationId is " + message.getConversation().getConversationId());
MessageContent content = message.getContent();
if (content instanceof TextMessage) {
Log.d("TAG", "text did receive, content is " + ((TextMessage) content).getContent());
} else if (content instanceof ImageMessage) {
Log.d("TAG", "image did receive, url is " + ((ImageMessage) content).getUrl());
} else if (content instanceof FileMessage) {
Log.d("TAG", "file did receive, name is " + ((FileMessage) content).getName());
} else if (content instanceof VoiceMessage) {
Log.d("TAG", "voice did receive");
}
}
/// 消息撤回回调
@Override
public void onMessageRecall(Message message) {
Log.d("TAG", "onMessageRecall, messageId is " + message.getMessageId());
}
@Override
public void onMessageUpdate(Message message) {
Log.d("TAG", "onMessageUpdate, messageId is " + message.getMessageId());
}
/// 消息删除回调
/// conversation: 会话标识
/// clientMsgNos: 列表(本端消息唯一编号)
@Override
public void onMessageDelete(Conversation conversation, List<Long> clientMsgNos) {
Log.d("TAG", "onMessageDelete, conversation is " + conversation.getConversationId() + ", clientMsgNo is " + clientMsgNos);
}
/// 消息清除回调,表示清除特定会话中某个时间点之前的所有消息
/// conversation: 会话标识
/// timestamp: 时间戳(毫秒),timestamp 之前的消息被清除
/// senderId: 若不为空,表示只清除发送者 id 为 senderId 的消息
@Override
public void onMessageClear(Conversation conversation, long timestamp, String senderId) {
Log.d("TAG", "onMessageClear, conversation is " + conversation.getConversationId() + ", timestamp is " + timestamp + ", senderId is " + senderId);
}
/// 新增消息回应的回调
/// conversation: 所属会话
/// reaction: 新增的消息回应
@Override
public void onMessageReactionAdd(Conversation conversation, MessageReaction reaction) {
}
/// 删除消息回应的回调
/// conversation: 所属会话
/// reaction: 删除的消息回应
void onMessageReactionRemove(Conversation conversation, MessageReaction reaction) {
}
/// 消息置顶的回调
/// message: 对应的消息
/// operator: 操作置顶的用户
/// isTop: true false 表示取消置顶
void onMessageSetTop(Message message, UserInfo operator, boolean isTop) {
}
});
消息阅读状态相关监听
可以设置多个监听。
JIM.getInstance().getMessageManager().addReadReceiptListener("main", new IMessageManager.IMessageReadReceiptListener() {
/// 单聊消息阅读回调
/// conversation: 所在会话
/// messageIds: 消息 id 数组
@Override
public void onMessagesRead(Conversation conversation, List<String> messageIds) {
Log.d("TAG", "onMessageRead, count is " + messageIds.size() + ", conversationType is " + conversation.getConversationType() + ", conversationId is " + conversation.getConversationId());
}
/// 群消息阅读回调
/// conversation: 所在会话
/// messages: key 为 messageId
@Override
public void onGroupMessagesRead(Conversation conversation, Map<String, GroupMessageReadInfo> messages) {
Log.d("TAG", "onGroupMessagesRead, conversationType is " + conversation.getConversationType() + ", id is " + conversation.getConversationId() + ", count is " + messages.size());
}
});
消息销毁相关监听
可以设置多个监听。
JIM.getInstance().getMessageManager().addDestroyListener("main", new IMessageManager.IMessageDestroyListener() {
/**
* 消息销毁时间更新回调(一般发生在阅后即焚之类的场景)
* @param messageId 消息 id
* @param conversation 所在会话
* @param destroyTime 更新后的销毁时间
*/
@Override
public void onMessageDestroyTimeUpdate(String messageId, Conversation conversation, long destroyTime) {
}
});
消息加解密相关回调
消息加解密只能设置一个监听。
JIM.getInstance().getMessageManager().setPreprocessor(new IMessageManager.IMessagePreprocessor() {
/**
* 消息加密的回调
* 回调时机:消息入库之后,发送之前
* @param content 待发送的消息内容,已序列化成 byte[]
* @param conversation 所在会话
* @param contentType 消息类型
* @return 处理后的消息内容。
*/
@Override
public byte[] encryptMessageContent(byte[] content, Conversation conversation, String contentType) {
}
/**
* 消息解密的回调
* 回调时机:接收到消息,入库之前
* @param content 接收到的消息内容, byte[] 类型,还没反序列化
* @param conversation 所在会话
* @param contentType 消息类型
* @return 处理后的消息内容。
*/
@Override
public byte[] decryptMessageContent(byte[] content, Conversation conversation, String contentType) {
}
});
消息相关监听
可以设置多个代理。
[JIM.shared.messageManager addDelegate:self];
/// 接收消息的回调
- (void)messageDidReceive:(JMessage *)message {
NSLog(@"messageDidReceive conversationType is %d, conversationId is %@", message.conversation.conversationType, message.conversation.conversationId);
JMessageContent *content = message.content;
if ([content isKindOfClass:[JTextMessage class]]) {
NSLog(@"text messageDidReceive, content is %@", ((JTextMessage *)content).content);
} else if ([content isKindOfClass:[JImageMessage class]]) {
NSLog(@"image messageDidReceive, url is %@", ((JImageMessage *)content).url);
} else if ([content isKindOfClass:[JFileMessage class]]) {
NSLog(@"file messageDidReceive");
} else if ([content isKindOfClass:[JVoiceMessage class]]) {
NSLog(@"voice messageDidReceive");
}
}
/// 消息撤回的回调
- (void)messageDidRecall:(JMessage *)message {
NSLog(@"messageDidRecall");
}
/// 消息修改的回调
- (void)messageDidUpdate:(JMessage *)message {
NSLog(@"messageDidRecall");
}
/// 消息删除的回调
- (void)messageDidDelete:(JConversation *)conversation
clientMsgNos:(NSArray <NSNumber *> *)clientMsgNos {
}
/// 消息清除回调,表示清除特定会话中某个时间点之前的所有消息
/// - Parameters:
/// - conversation: 被清除消息所属的会话标识
/// - timestamp: 时间戳(毫秒),timestamp 之前的消息被清除
/// - senderId: 若不为空,表示只清除发送者 id 为 senderId 的消息
- (void)messageDidClear:(JConversation *)conversation
timestamp:(long long)timestamp
senderId:(NSString *)senderId {
}
/// 新增消息回应的回调
/// - Parameter reaction: 新增的消息回应
/// - Parameter conversation: 所属会话
- (void)messageReactionDidAdd:(JMessageReaction *)reaction
inConversation:(JConversation *)conversation {
}
/// 删除消息回应的回调
/// - Parameter reaction: 删除的消息回应
/// - Parameter conversation: 所属会话
- (void)messageReactionDidRemove:(JMessageReaction *)reaction
inConversation:(JConversation *)conversation {
}
/// 消息置顶的回调
/// - Parameters:
/// - isTop: YES 表示置顶,NO 表示取消置顶
/// - message: 对应的消息
/// - userInfo: 操作置顶的用户
- (void)messageDidSetTop:(BOOL)isTop
message:(JMessage *)message
user:(JUserInfo *)userInfo {
}
消息阅读状态相关监听
可以设置多个代理。
[JIM.shared.messageManager addReadReceiptDelegate:self];
/// 单聊消息阅读回调
/// - Parameters:
/// - messageIds: 消息 id 数组
/// - conversation: 所在会话
- (void)messagesDidRead:(NSArray<NSString *> *)messageIds inConversation:(JConversation *)conversation {
NSLog(@"messagesDidRead");
}
/// 群消息阅读回调
/// - Parameters:
/// - msgs: key 为 messageId
/// - conversation: 所在会话
- (void)groupMessagesDidRead:(NSDictionary<NSString *,JGroupMessageReadInfo *> *)msgs inConversation:(JConversation *)conversation {
NSLog(@"groupMessagesDidRead, groupId is %@", conversation.conversationId);
}
消息销毁相关监听
可以设置多个代理。
[JIM.shared.messageManager addDestroyDelegate:self];
/// 消息销毁时间更新回调(一般发生在阅后即焚之类的场景)
/// - Parameters:
/// - messageId: 消息 id
/// - conversation: 所在会话
/// - destroyTime: 更新后的销毁时间
- (void)messageDestroyTimeDidUpdate:(NSString *)messageId
inConversation:(JConversation *)conversation
destroyTime:(long long)destroyTime {
}
消息加解密相关回调
消息加解密只能设置一个代理。
[JIM.shared.messageManager setPreprocessor:self];
/// 消息加密的回调
/// 回调时机:消息入库之后,发送之前
/// - Parameter content: 待发送的消息内容,已序列化成 NSData
/// - Parameter conversation: 所在会话
/// - Parameter contentType: 消息类型
/// - Return: 处理后的消息内容。
- (NSData *)encryptMessageContent:(NSData *)content
inConversation:(JConversation *)conversation
contentType:(NSString *)contentType {
}
/// 消息解密的回调
/// 回调时机:接收到消息,入库之前
/// - Parameter content: 接收到的消息内容,NSData 格式,还没反序列化
/// - Parameter conversation: 所在会话
/// - Parameter contentType: 消息类型
/// - Return: 处理后的消息内容。
- (NSData *)decryptMessageContent:(NSData *)content
inConversation:(JConversation *)conversation
contentType:(NSString *)contentType {
}
全局只需设置一次,多次设置会覆盖,其他人给当前用户发送消息会触发消息监听,消息格式请查看 Message 结构,Event 说明请查看 监听枚举
let { Event } = JIM;
### 消息接收监听
jim.on(Event.MESSAGE_RECEIVED, (message) => {
console.log(message);
});
### 消息已读监听
jim.on(Event.MESSAGE_READ, (notify) => {
/*
处理逻辑:
1、此处可以更新内存中的消息 isRead 状态为 true
2、历史消息中的消息状态 SDK 会自动处理
3、获取历史消息会返回最新的阅读状态
notify 示例:
{
conversationType: 1,
conversationId: "dDshdk1d4",
// 对方已读的消息 Id 列表,通过 messageId 变更消息已读状态
messages: [ { messageId:"na4d4nfa2d6gnn28" } ]
}
*/
console.log(notify);
});
### 消息清除监听
jim.on(Event.MESSAGE_CLEAN, (notify) => {
/*
notify 示例:
{
conversationType: 1,
conversationId: "dDshdk1d4",
cleanTime: 1716471002135
}
*/
console.log(notify);
});
### 消息撤回监听
jim.on(Event.MESSAGE_RECALLED, (notify) => {
/*
处理逻辑:开发者只需更新内存中的消息撤回状态,SDK 会自动处理本地及服务端存储的历史消息
notify 示例:
{
conversationType: 1,
conversationId: "dDshdk1d4",
content: {
// 被撤回的消息的 UID
messageId: "nq4d9xsfgeghvtnd",
// 被撤回消息的消息时间
sentTime: 1712903378965
},
sender: {
id: 'dkdosd',
name: 'chater',
portrait: 'https://xxx.example.com/avatar.png'
}
}
*/
console.log(notify);
});
### 消息删除监听
jim.on(Event.MESSAGE_REMOVED, (notify) => {
/*
notify 示例:
{
conversationType: 1,
conversationId: "dDshdk1d4",
content: {
messages: [{ messageId: "nq4d9xsfgeghvtnd" }],
}
}
*/
console.log(notify);
});
### 消息修改监听
jim.on(Event.MESSAGE_UPDATED, (notify) => {
/*
处理逻辑:
1、开发者需要将内存中 message 的 isUpdated 更新为 true
2、获取历史消息时 SDK 会自动将 isUpdated 设置为 true
3、此处更新内存即可,如内存无被修改的消息,可忽略
notify 示例:
{
conversationType: 1,
conversationId: "dDshdk1d4",
// 被修改的消息 Id,通过消息 ID 更新 UI 已展示的消息
messageId: 'nq4d9xsfgeghvtnd',
content: {
// 最新的消息内容
content: 'new content'
},
}
*/
console.log(notify);
});
可以设置多个监听。
//收到新消息
JuggleIm.instance.getMessageManager().addMsgReceivedListener((msg)=>{
})
//消息撤回监听
JuggleIm.instance.getMessageManager().addMsgRecalledListener((msg)=>{
})
//消息修改监听
JuggleIm.instance.getMessageManager().addMsgModifiedListener((msg)=>{
})
//消息删除监听
JuggleIm.instance.getMessageManager().addMsgDeletedListener((conver,msgIds)=>{
})
//消息清除监听
JuggleIm.instance.getMessageManager().addMsgCleanedListener((conver,cleanTime,senderId)=>{
})