更新时间:2022-09-07
用户在单聊和群聊中发送完信息后,可以查看该信息的送达和已读状态,了解接收方是否及时收到并阅读了信息。
本文介绍如何使用环信即时通讯 IM Flutter SDK 的消息已读回执和送达回执在 app 中实现上述功能。
环信即时通讯 IM Flutter SDK 通过 EMChatManager
类提供消息已回执功能,回执主要分为两类:已读回执和送达回执。核心方法如下:
EMOptions.requireDeliveryAck
送达回执的全局开关;EMOptions.requireAck
已读回执的全局开关;EMChatManager.sendConversationReadAck
发送会话的已读回执;EMChatManager.sendMessageReadAck
发送单聊消息的已读回执;EMChatManager.sendGroupMessageReadAck
发送群组消息的已读回执;实现送达和已读回执的逻辑分别如下:
EMOptions.requireDeliveryAck
开启送达回执功能onMessageDelivered
回调接收消息送达回执EMOptions.requireAck
开启已读回执功能SendConversationReadAck
或 SendMessageReadAck
发送会话或消息已读回执onConversationRead
或 onMessagesRead
回调接收会话或消息已读回执开始前,请确保满足以下条件:
// sdk app key
String appKey = "appKey";
// 开启消息送达回执
bool requireDeliveryAck = true;
EMOptions options = EMOptions(
appKey: appKey,
requireDeliveryAck: requireDeliveryAck,
);
await EMClient.getInstance.init(options);
发送方监听事件 onMessagesDelivered
回调,收到接收方的送达回执。
// 注册监听
EMClient.getInstance.chatManager.addEventHandler(
"UNIQUE_HANDLER_ID",
EMChatEventHandler(
onMessagesDelivered: (messages) {},
),
);
// 移除监听
EMClient.getInstance.chatManager.removeEventHandler("UNIQUE_HANDLER_ID");
消息已读回执用于告知单聊或群聊中的用户接收方已阅读其发送的消息。为降低消息已读回执方法的调用次数,SDK 还支持在单聊中使用会话已读回执功能,用于获知接收方是否阅读了会话中的未读消息。
单聊既支持消息已读回执,也支持会话已读回执。我们建议你按照如下逻辑结合使用两种回执结合使用,减少发送消息已读回执数量。
参考如下步骤在单聊中实现会话已读回执。
EMOptions options = EMOptions(
appKey: appKey,
requireAck: true,
);
EMClient.getInstance.init(options);
接收方执行会话已读回执操作。进入会话页面,查看会话中是否有未读消息。若有,发送会话已读回执,没有则不再发送。
String convId = "convId";
try {
await EMClient.getInstance.chatManager.sendConversationReadAck(convId);
} on EMError catch (e) {
}
发送方监听 onConversationRead
回调,接收会话已读回执。
// 注册监听
EMClient.getInstance.chatManager.addEventHandler(
"UNIQUE_HANDLER_ID",
EMChatEventHandler(
onConversationRead: (String from, String to) {},
),
);
// 移除监听
EMClient.getInstance.chatManager.removeEventHandler("UNIQUE_HANDLER_ID");
同一用户 ID 登录多设备的情况下,用户在一台设备上发送会话已读回执,服务器会将会话的未读消息数置为0
,同时其他设备会收到onConversationRead
回调。
参考如下步骤在单聊中实现消息已读回执。
EMOptions options = EMOptions(
appKey: "appKey",
requireAck: true,
);
EMClient.getInstance.init(options);
消息发送方监听 onMessagesRead
事件。
// 注册监听
EMClient.getInstance.chatManager.addEventHandler(
"UNIQUE_HANDLER_ID",
EMChatEventHandler(
onMessagesRead: (messages) {},
),
);
// 移除监听
EMClient.getInstance.chatManager.removeEventHandler("UNIQUE_HANDLER_ID");
消息接收方发送已读回执
try {
EMClient.getInstance.chatManager.sendMessageReadAck(msg);
} on EMError catch (e) {
}
对于群组消息,消息发送方(目前为群主和群管理员)可设置指定消息是否需要已读回执。
onGroupMessageRead
事件。// 注册监听
EMClient.getInstance.chatManager.addEventHandler(
"UNIQUE_HANDLER_ID",
EMChatEventHandler(
onGroupMessageRead: (groupMessageAcks) {},
),
);
// 移除监听
EMClient.getInstance.chatManager.removeEventHandler("UNIQUE_HANDLER_ID");
发送群组消息。并设置 needGroupAck
为 true
,表示需要群组消息已读回执。
// 设置消息类型为群消息
msg.chatType = ChatType.GroupChat;
// 设置本条消息需要群消息回执
msg.needGroupAck = true;
try {
await EMClient.getInstance.chatManager.sendMessage(msg);
} on EMError catch (e) {
}
群组里面的接收方收到消息,调用 sendGroupMessageReadAck
告知消息发送方消息已读。成功发送后,消息发送方会收到 onGroupMessageRead
回调。
try {
EMClient.getInstance.chatManager.sendGroupMessageReadAck(msgId, groupId);
} on EMError catch (e) {
}
你可以参考如下文档,在项目中实现更多的消息相关功能: