已读回执

单聊与群聊支持已读回执:接收方上报已读,发送方查询已读人数与已读用户列表。

平台调用风格

双语言同契约:Swift 用 async -> RcResult<T>(错误码在 RcResult.code,返回 null 的 op 用 RcResult<Void>);Objective-C 用 - (void)opWithParam:... completion:(void (^)(RcResult *))completion,回调在主线程投递。

接口一览​

操作语义传输返回
sendReadReceipt上报已读回执;服务端记录唯一读者并推送给消息发送者。WS 长连接{messageIds:string[], readCounts?:map<string,uint32>, totalMembers?:uint32}
getMessageReadCount查询消息已读人数。REST(客户端){messageId:string, readCount:uint32, totalMembers:uint32}
getMessageReadUsers查询已读用户明细(分页)。REST(客户端){messageId:string, readCount:uint32, totalMembers:uint32, readers:UserProfile[]}

本页 3 个操作,其中 3 个在本平台绑定中声明了方法签名。

跨端方法名​

操作AndroidWebElectronmacOSFlutterNative (C ABI)iOS
sendReadReceiptsendReadReceiptsendReadReceiptsendReadReceiptsendReadReceiptsendReadReceiptim_client_send_read_receiptfunc
getMessageReadCountgetMessageReadCountgetMessageReadCountgetMessageReadCountgetMessageReadCountgetMessageReadCount—func
getMessageReadUsersgetMessageReadUsersgetMessageReadUsersgetMessageReadUsersgetMessageReadUsersgetMessageReadUsers—func

方法名在 GA 平台之间保持一致(规则 A);Native C ABI 只覆盖部分操作,其余操作以 — 标注。

sendReadReceipt​

上报已读回执;服务端记录唯一读者并推送给消息发送者。

func sendReadReceipt(conversationType: IMPConversationType, targetId: String, messageIds: [String]) async -> RcResult<IMPSendReadReceiptResult>
WS 长连接since 1.0.0
参数
参数类型说明
conversationTypeConversationType必填;会话类型枚举(ConversationType)
targetIdstring必填;目标会话 ID:单聊为对方 userId,群聊为 groupId,聊天室为 chatroomId
messageIdsstring[]必填;消息 ID 列表
返回

{messageIds:string[], readCounts?:map<string,uint32>, totalMembers?:uint32} 成功返回的数据;失败时按错误码处理

示例(Swift / Objective-C)​

let res = await client.sendReadReceipt(conversationType: .privateChat, targetId: "user2", messageIds: ["m_10001"])
if res.code != 0 { print("IM 调用失败:\(res.msg ?? "")") }
[client sendReadReceiptWithConversationType:1 /* 单聊 */ targetId:@"user2" messageIds:@[@"m_10001"] completion:^(IMPOSResult *result) {
    if (result.code != 0) { NSLog(@"IM 调用失败:%ld %@", (long)result.code, result.msg); }
}];
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1003FORBIDDEN客户端 / 参数 / 权限403否无权限
1004USER_NOT_FOUND客户端 / 参数 / 权限404否用户不存在
3001SDK_NOT_CONNECTEDSDK 本地0是长连接未就绪

getMessageReadCount​

查询消息已读人数。

func getMessageReadCount(messageId: String) async -> RcResult<IMPMessageReadCount>
REST(客户端)since 1.0.0
参数
参数类型说明
messageIdstring必填;消息 ID(服务端生成)
返回

{messageId:string, readCount:uint32, totalMembers:uint32} 已读人数与群成员总数

示例(Swift / Objective-C)​

let res = await client.getMessageReadCount(messageId: "m_10001")
if res.code != 0 { print("IM 调用失败:\(res.msg ?? "")") }
[client getMessageReadCountWithMessageId:@"m_10001" completion:^(IMPOSResult *result) {
    if (result.code != 0) { NSLog(@"IM 调用失败:%ld %@", (long)result.code, result.msg); }
}];
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1003FORBIDDEN客户端 / 参数 / 权限403否无权限
1004USER_NOT_FOUND客户端 / 参数 / 权限404否用户不存在

getMessageReadUsers​

查询已读用户明细(分页)。

func getMessageReadUsers(messageId: String, options: IMPPageOptions?) async -> RcResult<IMPMessageReadUsers>
REST(客户端)since 1.0.0
参数
参数类型说明
messageIdstring必填;消息 ID(服务端生成)
options{offset?:uint32, limit?:uint32}可选;选项对象(字段见类型列):{ offset?:uint32, limit?:uint32 }
返回

{messageId:string, readCount:uint32, totalMembers:uint32, readers:UserProfile[]} 已读用户明细(分页)

示例(Swift / Objective-C)​

let res = await client.getMessageReadUsers(messageId: "m_10001", options: nil)
if res.code != 0 { print("IM 调用失败:\(res.msg ?? "")") }
[client getMessageReadUsersWithMessageId:@"m_10001" options:nil completion:^(IMPOSResult *result) {
    if (result.code != 0) { NSLog(@"IM 调用失败:%ld %@", (long)result.code, result.msg); }
}];
错误码
错误码名称分类HTTP可重试说明
1001INVALID_PARAMETER客户端 / 参数 / 权限400否参数错误
1003FORBIDDEN客户端 / 参数 / 权限403否无权限
1004USER_NOT_FOUND客户端 / 参数 / 权限404否用户不存在

相关文档​