消息没有收到或消息丢失如何处理?
收不到离线推送怎么处理?
红包消息怎么处理?
红包消息与 @ 消息类似,可以通过
TIMCustomElem
来实现。需要应用在 UI 上做相应的特殊处理,例如检查到当前消息为红包消息后,消息展示为红包的样式。
另外,红包消息作为重要消息,最好在发送消息的时候将其设置为高优先级消息,以最大程度保证消息在触达频率限制的情况下仍可以送达(目前群内消息默认限制频率40条/s, 单聊消息默认限制频率为5条/s)。注意:
红包消息涉及支付的部分,请自行实现或集成第三方支付 SDK,IM SDK 暂不提供相关功能。
一个简单的红包消息的构建过程如下(Android):
try {// 填充自定义的消息协议JSONObject redPacket= new JSONObject();redPacket.put("type", "RED_PACKET");redPacket.put("amount", 2018);redPacket.put("msg", "Happy new year!");V2TIMMessage message = V2TIMManager.getMessageManager().createCustomMessage(redPacket.toString().getBytes("utf-8"),"red packet",null);} catch (Exception e) {Log.e(TAG, "build custom message failed");}
即时通信 IM 消息存储时长是多久?
体验版:7天,不支持延长。
专业版:7天,支持延长。
旗舰版:30天,支持延长。
为什么发送者已经被拉入黑名单但消息依旧显示发送成功?
即时通信 IM 在控制台的 黑名单检查 管理中提供发送消息后展示发送成功功能,当启用该功能时被拉黑用户侧发消息后仍展示发送成功 (实际对方不会收到消息) 。RestAPI 接口下发消息,该接口不会检查发送者和接收者的好友关系(包括黑名单),需要加
WithBlackListCheck
表示该条消息会检查发送者和接收者的黑名单。停用本设置项,则被拉黑用户侧发消息后会提示失败,SDK 会收到 错误码 20007 。具体配置请参照文档 黑名单检查。如何通过 COS 将图片地址变成可下载的域名格式?
即时通信 IM 的消息唯一标识的规则是怎样的?
即时通信 IM 客户端单聊/群聊消息,Web 端单聊/群聊消息及服务端单聊消息唯一标识分别对应 msg_id,msgID 及 msgKey。各端不同类型消息唯一标识的规则不同,具体规则如下:
客户端单聊/群聊消息 msg_id 的组成是:tinyid-clientTime-random。
Web 端单聊/群聊消息 msgID 的组成是(v2.17.0及以下):会话 id-msgSeq-random-1(我发送的消息) / 0(非我发送的消息)。
Web 端单聊/群聊消息 msgID 的组成是(v2.18.0及以上):tinyid-clientTime-random。
服务端单聊消息 msgKey 的组成是:clientSeq_random_serverTime。
服务端群聊消息通过群 id + msgSeq 来进行唯一标识。
消息编辑 & 消息扩展 & 消息回应有什么区别?
消息功能 | 是否需要旗舰版 | 存储方式 | 拉取方式 | 并发设置是否会冲突 |
消息编辑 | 不需要 | 编辑信息直接存在消息体内,共用消息存储,单条消息最大 12K | 编辑信息直接通过消息体返回,无需单独拉取 | 会有冲突 |
消息扩展 | 需要 | 扩展信息独立存储,单条消息最大支持设置 300 个扩展,单个扩展最大支持 1K | 扩展信息需要单独拉取,仅支持逐条消息拉取 | 同一个扩展设置会冲突,不同的扩展设置不会冲突 |
消息回应 | 需要 | 回应信息独立存储,单条消息最大支持设置 10 个回应,单个回应最大支持 100 个用户 | 回应信息需要单独拉取,支持多条消息批量拉取 | 不会冲突 |
消息编辑
优势:简单易用。
劣势:
如果多个用户同时编辑一条消息,可能会导致编辑冲突。
如果编辑后的消息内容过大,可能会导致消息大小超限(单条消息最大支持 12K)。
总结:消息编辑适合单个用户操作且存储需求较小的场景,例如订单消息场景,可以通过编辑消息的
cloudCustomData
字段来存储和修改订单的状态。消息扩展
优势:
单条消息可以设置多个扩展,不同的扩展同时设置不会冲突。
扩展信息独立存储,不占用消息体大小,单条消息最大支持设置 300 个扩展,单个扩展最大支持 1K。
劣势:
同一个扩展同时设置,也会有冲突问题。
扩展信息不支持多条消息批量拉取。
总结:消息扩展适合多个用户操作且存储量较大的场景,例如问卷调查场景,每个扩展信息都是 {userID : 问卷调查内容} 的集合,不同的用户填写问卷调查不会冲突。
消息回应
优势:
单条消息可以添加多个回应,回应添加不冲突。
回应信息独立存储,不占用消息体大小,单条消息最大支持添加 10 个回应,单个回应最大支持 100 个用户。
回应信息支持多条消息批量拉取。
支持单独拉取使用同一个回应的用户列表。
劣势:
回应信息只支持设置回应 ID,其他信息均不支持设置,SDK 会自动统计使用同一回应 ID 的用户列表。
总结:消息回应适合需要统计用户列表的场景,例如表情回应场景,用户添加表情回应只需传入表情 ID,SDK 会自动统计使用同一表情 ID 的用户列表。
聊天消息时间格式
TUIKit 时间戳展示逻辑(以 Web & uni-app 为例) :
1. 若当前消息与上一条消息间隔超过10分钟,会进行新的时间戳展示,否则归为上一个聊天单元。
2. 对于满足条件1,需要展示的时间戳会根据与当前时间的差值进行展示,计算和显示规则如下:
差值计算结果 | 显示规则 |
今天 | 时 + 分。 示例: 8:30 |
昨天 | 昨天 + 时 + 分。 示例: 昨天 8:30 |
一周内(7天,以天为单位计算) | 星期 + 时 + 分。 示例: 星期一 8:30 |
超过一周,在本年内 | 月/日 + 时 + 分。 示例: 9/1 8:30 |
不在本年 | 年/月/日 + 时 + 分。 示例: 2024/9/1 8:30 |
为什么同一秒级内的消息,接收方接收消息时,可能存在乱序?
原因:
1. 终端到 sso 接入机之间走 tcp,这两个节点之间的数据能保证顺序。
2. sso 接口机和消息业务服务器之间走 udp,引起乱序的原因之一。
3. 乱序不同消息也有可能分发给不同的消息业务服务器处理,引起乱序的原因之二。
架构:
终端 => sso => 消息业务服务器 => push 服务器 => sso => 终端
为什么弱网情况下发送消息失败(实际消息发送成功)?
原因:
SDK 已经成功把请求包发给后台,但后台的回包在回来的路上被丢掉了。客户端因为没有收到回包,本地将消息状态重置为失败。
解决方案:
等网络恢复后,拉取漫游历史消息时 SDK 会覆盖之前发送失败的消息(实际发送成功的)。这个问题本质上是 ACK 确认问题。
弱网情况下进入聊天“加载历史消息耗时久”,怎么优化?
进入聊天页面拉取消息优化方案:
1. 每次进入聊天页面,都同时调用
getHistoryMessageList
和(getC2CHistoryMessageList
或 getGroupHistoryMessageList
拉取消息)。2.
getHistoryMessageList
接口设置仅拉取本地缓存,当本地存在消息缓存时,仅用于 UI 快速预览。3.
getC2CHistoryMessageList
或 getGroupHistoryMessageList
返回的消息作为最终显示的消息(因为这两个接口是将本地和漫游消息做合并之后返回的,所以弱网情况下耗时会久一些)。4. 之后下拉查看历史消息只调用
getC2CHistoryMessageList
或 getGroupHistoryMessageList
即可。(查看历史消息时把
getC2CHistoryMessageList
或 getGroupHistoryMessageList
替换成 getHistoryMessageList
拉漫游也可以。)为什么调用 sendMessage
接口立刻并行设置 localCustomData
内容不生效?
SDK 内部限制:不能在
sendMessage
之后同步调用设置,应在 sendMessage
之前或响应回调之后再设置。原因:
sendMessage
发送时会将消息内容 Copy 一份,发送成功后才更新内容并存入数据库。语音消息发送成功后,调用 convertVoiceToText
语音转文字接口报 40001 错误,如何解决?
IM 服务端针对语音转文字消息有限制,语音文件时长不能超过60s且大小不能超过3MB,否则会报 40001 错误。
加载会话列表,实现会话 lastMessage
消息,对于当前登录的用户,如何判断显示已读或未读状态?
拉取会话列表,
V2TIMConversation
中会携带 getC2CReadTimestamp
(已读时间戳、单聊使用)、getGroupReadSequence
(已读Sequence,群聊使用)、lastMessage
(最后一条消息,可能为空) 这三个。判断单聊会话
lastMessage
是否已读: getC2CReadTimestamp > lastMessage.getTimestamp
表示已读,反之未读。判断群聊会话
lastMessage
是否已读: getGroupReadSequence >= lastMessage.getSeq
表示已读,反之未读。在发消息失败的情况下,怎么获取到失败的 Code 码?


TUIKit 接入时,群组解散、用户退群或被踢出群,群聊消息会都被清空,如何保留本地缓存的历史消息?
以解散群为例,调了
dismissGroup
全员会 onGroupDismissed
回调,TUI 组件在收到 onGroupDismissed
回调里调了删除会话接口 deleteConversation
,想保留群聊天记录的话可以注释掉 deleteConversation
的调用,退群或者被踢都类似,移除 deleteConversation
接口调用逻辑。iOS 客户端调用 SDK 的拉取历史消息,msgID 有重复,如何解决?
客户端 msgID 由
tinyid
+ clientTime
+ random
拼接而成,主要关注下 random
字段赋值。看看消息是不是通过服务端接口发送,Rest API 接口参数
MsgRandom
为上层必填参数,发送时 MsgRandom
不能固定不变,否则会出现 msgID 重复。(通过客户端发送消息不需要设置 random
,SDK 内部会确保 random
随机。)Flutter Web 端 UIKit 集成,发送图片报 “Error from TUIKit: Only JPG/PNG/JPEG/GIF images can be uploaded, Code: 2252”
错误。图片格式是 jpg, 还是报错,要如何解决?
修改 image_picker 插件版本为:^0.8.5+3。此问题由客户自行解决。IM Flutter Demo Web 端发送无问题。
问题原因:IM UIKit 组件中 image_picker 选择图片插件,客户升级使用高版本后报错。
Flutter UIKit 接入,发送消息必报错:The message read receipt feature is available only to the Premium Edition. Please upgrade.
,如何解决?
IM Harmony SDK 发送图片失败,是什么问题?
初始化 IM SDK 传入的
getContext()
要和 缓存是应用根目录传入的 context
一致,否则会报错。