导图社区 腾讯IM整体方案
这是梳理的腾讯IM的整体方案,对于做即时通信的朋友有帮助。
编辑于2020-12-24 15:56:20腾讯IM整体方案反推
用户账号体系
账号体系设计
登录鉴权
鉴权流程
登录用户体系
用户账号/密码
用户账号/授权密码
这里的密码相当于授权码。通过账号密码直接进行交互的授权验证信息
用户
账号在线状态管理
在线状态类型
后台运行状态(PushOnline)
后台运行状态(PushOnline),是指客户端和即时通信 IM 服务端的 TCP 长连接断开。此时可收到消息的离线推送。
以下场景用户的状态为后台运行状态
用户使用完 App ,把 App 切后台后进程被手机操作系统 kill 掉,或者用户主动 kill 掉 App 进程。
如果 App 在手机操作系统的保活白名单中,用户把 App 切后台,进程并不会被手机操作系统 kill 掉。此时状态仍然为前台运行状态(Online)。前台运行状态(Online)和后台运行状态(PushOnline)判断的标准之一是 App 进程是否被 kill ,即客户端和即时通信 IM 服务端的 TCP 长连接是否断开。
用户主动关闭客户端网络(例如打开手机飞行模式),或者客户端网络完全不可用(例如进入完全没有网络信号的隧道)。
在这种特殊情况下,客户端连 TCP 协议的 FIN 包或 RST 包都无法发出,即时通信 IM 服务端需要等待 400 秒后发现心跳包超时,状态才会变成后台运行状态(PushOnline)。
后台运行状态(PushOnline)只有手机端(Android/iOS)会存在,PC、小程序和 Web 端不存在该种状态。
前台运行状态(Online)
前台运行状态(Online),是指客户端和即时通信 IM 服务端保持有顺畅的 TCP 网络连接,客户端可以发消息给即时通信 IM 服务端,也可以收到来自即时通信 IM 服务端推送的消息。
当用户打开 App 后,状态即为前台运行状态。
App 启动后,客户端和即时通信 IM 服务端建立 TCP 长连接,即时通信 IM 服务端保存客户端的在线信息,例如客户端的网络链路信息,客户端的平台版本等。App 在运行过程中,IM SDK 会定时发送心跳来确认用户的在线状态。
未登陆状态(Offline)
未登录状态(Offline),是指用户没有输入帐号和密码登录前的状态,此时无法收到消息的在线推送,也无法收到消息的离线推送。
以下场景用户的状态为未登录状态
用户主动登出,或下载 App 后还未进行过登录时。
用户状态变成后台运行状态(PushOnline)后,7天内没有再登录过,此时状态变为未登录状态(Offline)。
在线状态交互凭证
心跳
客户端与服务器的心跳链接是2分钟一次心跳包
查询用户在线状态
只提供rest api接口查询用户在线状态
接口请求参数
To_Account
To_Account:类型是array,属于必填字段 需要查询这些 UserID 的登录状态,一次最多查询500个 UserID 的状态
IsNeedDetail
IsNeedDetail:类型为int,作为选填字段,默认为0 是否需要返回详细的登录平台信息。0表示不需要,1表示需要
接口返回信息
如果不需要详细信息
user_id
status
返回的用户状态,目前支持的状态有: 前台运行状态(Online):客户端登录后和即时通信 IM 后台有长连接 后台运行状态(PushOnline):iOS 和 Android 进程被 kill 或因网络问题掉线,进入 PushOnline 状态,此时仍然可以接收消息的离线推送。客户端切到后台,但是进程未被手机操作系统 kill 掉时,此时状态仍是 Online 未登录状态(Offline):客户端主动退出登录或者客户端自上一次登录起7天之内未登录过 如果用户是多终端登录,则只要有一个终端的状态是 Online ,该字段值就是 Online
如果需要详细信息
user_id
status
返回的用户状态,目前支持的状态有: 前台运行状态(Online):客户端登录后和即时通信 IM 后台有长连接 后台运行状态(PushOnline):iOS 和 Android 进程被 kill 或因网络问题掉线,进入 PushOnline 状态,此时仍然可以接收消息的离线推送。客户端切到后台,但是进程未被手机操作系统 kill 掉时,此时状态仍是 Online 未登录状态(Offline):客户端主动退出登录或者客户端自上一次登录起7天之内未登录过 如果用户是多终端登录,则只要有一个终端的状态是 Online ,该字段值就是 Online
detail
platform
登录的平台类型。可能的返回值有:"iPhone", "Android", "Web", "PC", "iPad", "Mac"。
status
返回的用户状态,目前支持的状态有: 前台运行状态(Online):客户端登录后和即时通信 IM 后台有长连接 后台运行状态(PushOnline):iOS 和 Android 进程被 kill 或因网络问题掉线,进入 PushOnline 状态,此时仍然可以接收消息的离线推送。客户端切到后台,但是进程未被手机操作系统 kill 掉时,此时状态仍是 Online 未登录状态(Offline):客户端主动退出登录或者客户端自上一次登录起7天之内未登录过 如果用户是多终端登录,则只要有一个终端的状态是 Online ,该字段值就是 Online
IM SDK 暂时无法获取用户的在线状态。
关于在线状态的特别说明
即时通信 IM 后台只会保存 PushOnline 状态7天时间,若从掉线时刻起7天之内未登录过,则进入 Offline 状态。
用户在线状态变更通知
触发条件
用户上线(TCP 连接建立)
用户注销下线或者用户网络断开(TCP 连接断开)
App 心跳超时(App 异常被 kill 或者 Crash)
可能触发的场景
用户通过客户端发起登录的上线请求。
用户通过客户端发起登出的下线请求。
用户主动 kill 客户端进程,或者切后台后进程被手机操作系统 kill 掉,或者 crash 导致进程异常退出,云服务器检测到客户端网络断开后触发网络断开回调。
客户端心跳超时,如关闭网络,或网络完全不可用,云服务器检测到客户端的心跳超时触发连接断开回调。心跳超时时间为 400 秒。
在线状态感知的实时性
实时场景
用户主动登录,状态变成前台运行状态(Online)。
用户主动登出, 状态变成未登录状态(Offline)。
用户主动 kill 客户端进程,或者用户切后台后,客户端进程被手机操作系统 kill 掉,状态变成后台运行状态(PushOnline)。
非实时场景
IM 云服务器需要等待400秒的心跳超时时间才能感知状态变更:
当网络完全不可用时,客户端连 TCP 协议层的 FIN 包或 RST 包都无法发出时,IM 云服务器需要等待400秒的心跳超时时间才能感知到状态变成后台运行状态(PushOnline)。常见的场景有用户主动关闭客户端的网络(例如开启手机的飞行模式),或者进入完全没有网络信号的隧道。
互踢
默认情况,IM SDK 在同时登录多个终端(如同时登录 PC、Android)时,会进行互踢,只有最后一个登录的设备可以在线,之前登录的都会被踢下线
同时在线
即时通信 IM 支持在 控制台 修改同时在线策略,通过配置可以做到 PC 端和手机端同时在线,或者 PC、iOS 和 Android 都可以同时在线。开启同时在线登录不同终端后不会互踢,但是两个相同终端(例如两个 iOS 端登录)仍然会互踢。
用户资料
相关的字段
user_id(用户名)
nick(用户昵称)
face_url(用户头像url)
gender(性别)
男/女/unknow
birthDay(生日)
例如:20190419
location(所在地)
后台实际保存的是4个 uint32_t 类型的数字 其中第一个 uint32_t 表示国家 第二个 uint32_t 用于表示省份 第三个 uint32_t 用于表示城市 第四个 uint32_t 用于表示区县 总长度不超过16位,如以下案例: 0000 0001 0002 0003 中国 四川 成都 高新区
SelfSignature(个人签名)
长度不得超过500个字节 注意是500字节,不是500字
AllowType(加好友验证方式)
AllowType_Type_NeedConfirm:需要经过自己确认对方才能添加自己为好友
AllowType_Type_AllowAny:允许任何人添加自己为好友
AllowType_Type_DenyAny:不允许任何人添加自己为好友
Language(语言)
MsgSettings(消息设置)
置0表示接收消息
置1则不接收消息
AdminForbidType(管理员禁止加好友标识)
AdminForbid_Type_None:默认值,允许加好友
AdminForbid_Type_SendOut:禁止该用户发起加好友请求
好友
好友联系链映射字段
IM_Group(好友分组)
1. 最多支持 32 个分组;
2. 不允许分组名为空;
3. 分组名长度不得超过 30 个字节;
4. 同一个好友可以有多个不同的分组
IM_Remark(好友备注)
1. 备注长度最长不得超过 96 个字节
IM_AddSource(添加好友来源)
1. 加好友来源字段包含前缀和关键字两部分;
2. 加好友来源字段的前缀是:AddSource_Type_ ;
3. 关键字:必须是英文字母,且长度不得超过 8 字节,建议用一个英文单词或该英文单词的缩写;
4. 示例:加好友来源的关键字是 Android,则加好友来源字段是:AddSource_Type_Android
IM_AddWording(加好友的附言)
1. 加好友附言的长度最长不得超过 256 个字节
添加好友
添加好友模式
批量加好友
一回合加好友
如果帐号 A 设置的加好友验证方式是 AllowType_Type_AllowAny,那么任何人添加 A 为好友都可以直接添加成功,这种一个请求就添加好友成功的场景称作一回合加好友。
两回合加好友
如果帐号 A 设置的加好友验证方式是 AllowType_Type_NeedConfirm,那么任何人添加 A,A 都会收到一个请求加好友验证消息,这是第一个回合,然后 A 对这个请求加好友验证消息进行同意操作时,这是第二个回合,这种需要验证的加好友场景就被称为两回合加好友。
双向好友
用户 A 的好友表中有用户 B,B 的好友表中也有 A。
单向好友
用户 A 的好友表中有用户 B,但 B 的好友表中却没有 A。
删除好友
单向删除好友
只将 To_Account 从 From_Account 的好友表中删除,但不会将 From_Account 从 To_Account 的好友表中删除
双向删除好友
将 To_Account 从 From_Account 的好友表中删除,同时将 From_Account 从 To_Account 的好友表中删除
拉取好友
不带好友的增量拉取模式
全量分页拉取模式
带好友拉取模式
校验好友
单向校验好友关系
只会检查 From_Account 的好友表中是否有 To_Account,不会检查 To_Account 的好友表中是否有 From_Account
验证结果
From_Account 的好友表中没有 To_Account,但无法确定 To_Account 的好友表中是否有 From_Account
From_Account 的好友表中有 To_Account,但无法确定 To_Account 的好友表中是否有 From_Account
双向校验好友关系
既会检查 From_Account 的好友表中是否有 To_Account,也会检查 To_Account 的好友表中是否有 From_Account
验证结果
From_Account 的好友表中有 To_Account,To_Account 的好友表中也有 From_Account
From_Account 的好友表中有 To_Account,但 To_Account 的好友表中没有 From_Account
From_Account 的好友表中没有 To_Account,但 To_Account 的好友表中有 From_Account
From_Account 的好友表中没有 To_Account,To_Account 的好友表中也没有 From_Account
黑名单
每个用户都有一份黑名单,用于保存被该用户屏蔽的帐号。 用户 A 将用户 B 加入黑名单后,A 与 B 之间的好友关系会被解除(如果有),且 A 与 B 之间无法再发起加好友请求。
添加黑名单
删除黑名单
拉取黑名单
校验黑名单
单向校验黑名单关系
只会检查 From_Account 的黑名单中是否有 To_Account,不会检查 To_Account 的黑名单中是否有 From_Account
验证结果
From_Account 的黑名单中有 To_Account,但无法确定 To_Account 的黑名单中是否有 From_Account
From_Account 的黑名单中没有 To_Account,但无法确定 To_Account 的黑名单中是否有 From_Account
双向校验黑名单关系
既会检查 From_Account 的黑名单中是否有 To_Account,也会检查 To_Account 的黑名单中是否有 From_Account
验证结果
From_Account 的黑名单中有 To_Account,To_Account 的黑名单中也有 From_Account
From_Account 的黑名单中有 To_Account,但 To_Account 的黑名单中没有 From_Account
From_Account 的黑名单中没有 To_Account,但 To_Account 的黑名单中有 From_Account
From_Account 的黑名单中没有 To_Account,To_Account 的黑名单中也没有 From_Account
账号相关功能
导入单个账号
导入单个账户,主要应用于将 App 自有帐号导入即时通信 IM 帐号系统,同时为该帐号创建一个对应的内部 ID,使该帐号能够使用即时通信 IM 服务。
导入账号规则
1、同一账号导入仅需要创建一次id
2、每一个账号的唯一性通过 identifier_id进行判别
消息管理
单聊消息
消息发送场景
App 内双人聊天
单聊消息适用于 App 内双人聊天,类似 QQ 好友、微信好友的聊天方式。
App 管理员发送消息
单聊消息可以由 App 管理员在后台发送消息,也可以模拟其他用户身份发送消息。
App 管理员模拟系统消息
通过 App 管理员在后台发送消息,可以模拟系统消息,以系统消息的形式给用户下达通知,App 端收到 App 管理员的自定义消息可做特殊处理。
单聊消息类型
文本消息
消息内容是普通文本
表情消息
表情消息为开发者自定义
地理位置消息
消息内容为地理位置标题、经度、纬度信息
图片消息
消息内容为图片的 URL 地址、尺寸、图片大小等信息,最大支持大小为28M的图片
语音消息
消息内容为语音文件的 URL 地址、大小、时长等信息,最大支持大小为28M的语音文件
文件消息
消息内容为文件的 URL 地址、大小、格式等信息,格式不限,最大支持大小为100M的文件
短视频消息
消息内容为短视频文件的 URL 地址、时长、大小、格式等信息,最大支持大小为100M的短视频文件
自定义消息
开发者自定义的消息类型,例如红包消息、石头剪刀布等形式的消息
系统通知消息
包含内置的系统通知消息和开发者自定义系统通知消息
单聊消息能力
发送单聊消息
App 内双人聊天
App 管理员发送消息
App 管理员模拟系统消息
接收单聊消息
接收在线消息
接收离线消息
查询历史消息
单聊消息权限控制
App 内任意两个用户之间发送单聊消息
陌生人发送消息
App 管理员发送单聊消息
App管理员模拟其他用户发送消息
App 管理员模拟系统消息
只允许给好友发送消息
好友发送消息
拒绝来自某人的消息
解除好友关系
拒绝某人消息
单聊消息扩展能力
获取聊天记录
获取实时聊天记录
定期下载消息记录
多终端同步
用户多终端消息同步
单聊消息离线推送
消息离线推送
单聊消息中携带发送者资料
展示发送者昵称、头像等
单聊离线消息处理流程
处理流程图
处理流程描述
1、用户 A 调用 sendMessage 给用户 B 发送消息,用户 B 处于下线状态。
把用户 A 添加进用户 B 的最近联系人,缓存大小为100条。
把消息存入离线缓存中,缓存大小30K,时间限制7天。
把消息存入漫游服务器中,时间限制7天。
2、用户 B 调用 login 接口登录即时通信 IM。
3、SDK 自动拉取离线缓存中的消息,通过 OnNewMessage 抛出。
4、SDK 自动拉取最近联系人,通过 OnNewMessage 接口抛出。
5、同步消息过程完成,通过 OnRefresh 接口通知用户已完成消息同步。
6、用户调用 getMessage,如果本地消息不完整,SDK 自动拉取漫游服务器。
消息存储
特殊说明
即时通信 IM 支持离线消息缓存,即当用户不在线时,下次登录仍会拉取到离线消息。离线消息默认保存7天,如果用户7天内未登录,再次登录时将不能获取到7天前的离线消息。对于单聊消息,每个用户的离线消息缓存最多保存100个单聊会话的未读消息,每个单聊会话最多保存100条未读消息。超出限制的部分不会被计入未读计数,但这些消息仍会存到消息漫游中。对于群消息,则没有这些条数限制。
默认情况下,一个终端通过 SDK 把离线消息拉取到本地后,即时通信 IM 服务器便会删除这些离线消息。如果需要支持多终端,或更换终端后仍想拉取未读的离线消息,需要用户自行管理这些离线消息。禁用 SDK 自动已读上报功能后,只有用户显式调用已读上报接口时,即时通信 IM 服务器才会删除这些离线消息,否则这些离线消息将在到期后自动删除。如果用户没有显式调用已读上报接口,更换终端后,仍然可以拉取到未读的离线消息。
漫游消息存储
即时通信 IM 支持消息漫游,即用户更换终端的情况下,也可以获取到跟其他用户或者某个群的聊天记录。
默认情况下,单聊消息和群聊消息有7天漫游,超过漫游时长的消息会被删除。
即时通信 IM 支持在控制台修改消息漫游时长,延长消息漫游时长是增值服务
最近联系人消息
最近联系人消息类似 QQ 的最近联系人列表中,可展示最近跟用户联系过的用户以及最后一条消息。
客户端默认情况下会在登录时通过 SDK 拉取最近联系人消息,如果本地之前没有存储过,会通过 onNewMessage 回调取得。
最近联系人默认存储最近100个联系人,但是保存时长跟最近联系人中的最后一条消息保存时间一致
例如默认如果超过7天跟联系人没有消息,最后一条消息过期后便无法在最近联系人中获取到此用户。
app本地存储
本地缓存排序补齐断层
离线推送
概述
在 App 退后台或者进程被 kill 的情况下,有新消息需要提醒用户时,可使用离线推送功能
群组消息
应用场景
群内收发消息
群成员在群内收发消息,类似 QQ 群、微信群的聊天方式。
App 管理员发送消息
群聊消息可以由 App 管理员在后台发送消息
管理员模拟其他用户身份发送消息
App 管理员模拟系统消息
通过 App 管理员在后台发送消息,可以模拟系统消息,以系统消息的形式给指定的群内在线成员,App 端收到 App 管理员的自定义消息可做特殊处理。
群消息的 SEQ 机制
即时通信 IM 会为每个群维护一个消息 SEQ。SEQ 的初始值为 1。
群内每产生一条普通消息,即时通信 IM 后台会将当前 SEQ 的值作为该消息的 SEQ,并且将该 SEQ 自增 1。
群组 ID + SEQ,相当于是一条消息的唯一标识。
群聊消息类型
文本消息
消息内容是普通文本
图片消息
消息内容为图片 URL 地址、尺寸、图片大小等信息
表情消息
表情消息是由开发者自定义
语音消息
语音数据需要提供时长信息,以秒为单位
地理位置消息
消息内容为地理位置标题、经度、纬度信息
文件消息
消息内容为文件的 URL 地址、大小、格式等信息,格式不限,最大支持100M
短视频消息
消息内容为短视频文件的 URL 地址、时长、大小、格式等信息,最大支持100M
自定义消息
开发者自定义的消息类型,例如红包消息、石头剪刀布等形式的消息
系统通知消息
包含内置的系统通知消息和开发者自定义系统通知消息
群聊消息能力
发送群普通消息
群成员在群内发送消息,App 管理员向任意群组发送消息
发送群系统消息
App 管理员群内部分或者全部在线成员推送一条时效性较高的提醒
群消息离线推送
群聊消息离线推送
接收群在线消息
在线群成员实时接收群消息
群成员获取离线/历史消息
群成员上线接收离线消息,群成员查看群聊天记录
App 后台获取群消息
App 定期备份消息记录的场景;
App 需要快速获取指定群组历史消息的场景;
App 需要实时获取群消息的场景
消息删除
群内恶意信息删除
群聊消息中携带发送者资料
展示消息发送人昵称、头像等信息
脏字过滤
消息安全打击
群消息发送控制
应用场景
禁止群内所有成员发消息
禁止群内某个成员发送消息
App 后台过滤或修改消息
控制群消息方式
群组内禁言
禁止某一用户一段时间内在群内发言,只针对单个群组有效。
如果用户退群再重新入群,只要禁言时间没有过期,禁言依旧有效
群消息发送前回调
在把群消息下发给群成员之前,即时通信 IM 后台先去 App 后台询问是否允许下发消息,如果不允许,则拒绝下发消息;
App 后台在收到回调后,也可对消息内容进行修改并返回给即时通信 IM,即时通信 IM 将使用修改之后的信息进行下发
即时通信 IM 在发起该回调后,最多只会等待2秒。如2秒内未收到应答,直接将消息下发给群成员,不会进行重试
群发消息优先级
概述
如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息。
优先级
High
红包消息和礼物消息
Normal
普通文本消息
Low
点赞消息
群消息频控
总消息数频控
总消息数频控是指单个群每秒最多能发送的消息数限制,默认值为 40条/秒,采用每秒平均限频。
消息数量超过限制后,后台优先下发优先级相对较高的消息,同等优先级的消息随机排序。
被频控限制的消息,不会下发,不会存入历史消息,但会给发送人返回成功;
优先级频控
优先级频控是指单个群每秒最多能发送多少条某优先级的消息,发消息请求只有在通过总消息数频控之后,才会进入优先级频控。
所有的消息都会受到40条/秒的频率限制,可以设置三级优先级,设置了 High 优先级的消息将有最高优先级,避免被限制,如果同一秒内高优先级消息总数超过40条/秒,高优先级消息也会被抛弃。
群组离线消息处理流程
流程图
处理流程说明
1、用户 A 调用sendMessage给群组 C 发送消息,用户 B 处于下线状态;
1.1 把群组 C 添加进用户 B 的最近联系人,缓存大小为 100 条;
1.2 用户更新群组的消息信息,包括群组最新消息 seq;
1.3 把消息存入漫游服务器中,时间限制 7 天。
2、用户B调用login接口登录即时通信 IM;
3、SDK 自动拉取所有群组的消息 seq 信息,包括最新消息 seq 和未读计数;
4、SDK 自动拉取最近联系人,通过OnNewMessage接口抛出;
5、同步消息过程完成,通过OnRefresh接口通知用户已完成群组数据同步;
6、用户调用getMessage,SDK 自动拉取漫游服务器。
群消息接收控制
用户屏蔽某个群组的消息
群消息频率控制
避免消息刷屏
控制群普通消息的发送频率,默认值为 40条/秒。
消息格式
msgTyoe
TIMTextElem(文本消息)
TIMLocationElem(位置消息)
TIMFaceElem(表情消息)
TIMCustomElem(自定义消息)
TIMSoundElem(语音消息)
TIMImageElem(图像消息)
TIMFileElem(文件消息)
TIMVideoFileElem(视频消息)
MsgContent
文本消息
示例

字段说明
Text
消息内容。
地理位置消息
示例

字段说明
Desc
地理位置描述信息。
Latitude
纬度。
Longitude
经度。
表情消息
示例

字段说明
Index
表情索引,用户自定义。
Data
额外数据。
自定义消息
示例

字段说明
Data
自定义消息数据
Desc
自定义消息描述信息。
Ext
扩展字段。
Sound
自定义 APNs 推送铃音。
语音消息
示例

备注
不能通过服务端集成的 Rest API 接口发送语音消息,发送语音消息需要通过客户端集成相应的接口。
字段说明
Url
语音下载地址,可通过该 URL 地址直接下载相应语音。
Size
语音数据大小,单位:字节。
Second
语音时长,单位:秒。
Download_Flag
语音下载方式标记。目前 Download_Flag 取值只能为2,表示可通过Url字段值的 URL 地址直接下载语音。
图像消息
示例

备注
不能通过服务端集成的 Rest API 接口发送图像消息,发送图像消息需要通过客户端集成相应的接口。
字段说明
UUID
图片序列号。后台用于索引图片的键值。
ImageFormat
图片格式。JPG = 1,GIF = 2,PNG = 3,BMP = 4,其他 = 255。
ImageInfoArray
原图、缩略图或者大图下载信息。
Type
图片类型: 1-原图,2-大图,3-缩略图。
Size
图片数据大小,单位:字节。
Width
图片宽度。
Height
图片高度。
URL
图片下载地址。
文件消息
示例
备注
不能通过服务端集成的 Rest API 接口发送文件消息,发送文件消息需要通过客户端集成相应的接口。
字段说明
Url
文件下载地址,可通过该 URL 地址直接下载相应文件。
FileSize
文件数据大小,单位:字节。
FileName
文件名称。
Download_Flag
文件下载方式标记。目前 Download_Flag 取值只能为2,表示可通过Url字段值的 URL 地址直接下载文件。
视频消息
示例

备注
不能通过服务端集成的 Rest API 接口发送视频消息,发送视频消息需要通过客户端集成相应的接口。
字段说明
VideoUrl
视频下载地址。可通过该 URL 地址直接下载相应视频。
VideoSize
视频数据大小,单位:字节。
VideoSecond
视频时长,单位:秒。
VideoFormat
视频格式,例如 mp4。
VideoDownloadFlag
视频下载方式标记。目前 VideoDownloadFlag 取值只能为2,表示可通过VideoUrl字段值的 URL 地址直接下载视频。
ThumbUrl
视频缩略图下载地址。可通过该 URL 地址直接下载相应视频缩略图。
ThumbSize
缩略图大小,单位:字节。
ThumbWidth
缩略图宽度。
ThumbHeight
缩略图高度。
ThumbFormat
缩略图格式,例如 JPG、BMP 等。
ThumbDownloadFlag
视频缩略图下载方式标记。目前 ThumbDownloadFlag 取值只能为2,表示可通过ThumbUrl字段值的 URL 地址直接下载视频缩略图。
单一消息分类
单一文本元素消息
单条消息中只包括一个中文本消息元素,文本内容为 hello world。

组合消息
下述的单条消息中包括两个文本消息元素和一个表情元素,消息元素顺序是文本+表情+文本。

消息推送
客户端展示
未设置帐号昵称
如果帐号没有设置昵称,APNs 推送只展示推送文本内容。单聊消息只展示“推送文本”,群组消息展示“(群名称):推送文本“。

已设置帐号昵称
如果帐号设置昵称,单聊消息展示格式为“昵称:推送文本内容”,群组消息展示格式为昵称(群名称):推送文本内容。

组合消息展示格式
对于组合消息,按顺序叠加各个消息元素的推送文本作为展示文本。下述为已设置帐户昵称的单聊消息,推送文本为"helloworld"。注意 helloworld 中间没有空格,后台按照顺序叠加,各个消息元素推送文本之间不添加任何字符。如需要在各个不同的消息元素间添加空格或其他字符,需调用方自己控制。

群组模块
群组管理能力
创建群组
解散群组
成员管理
群组资料管理
成员资料管理
群组管理机制
权限控制
禁言
脏词过滤
消息回调
消息漫游
群组使用场景
好友工作群
陌生人社交群
临时会议群
直播群
群类型
好友工作群
类似普通微信群,创建后仅支持已在群内的好友邀请加群,且无需被邀请方同意或群主审批
陌生人社交群
类似 QQ 群,创建后群主可以指定群管理员,用户搜索群 ID 发起加群申请后,需要群主或管理员审批通过才能入群
临时会议群
创建后可以随意进出,且支持查看入群前消息;适合用于音视频会议场景、在线教育场景等与实时音视频产品结合的场景
直播群
创建后可以随意进出,没有群成员数量上限,但不支持历史消息存储;适合与直播产品结合,用于弹幕聊天场景
群成员角色
普通成员
不具备管理权限的群成员
普通成员具备修改群昵称,个人昵称
管理员
由群主任命的、协助群主来管理群组的群成员,拥有一定的管理权限
修改群组基本资料
将普通群成员踢出群
将普通群成员禁言(即禁止其在一段时间内发言)
审批其他用户的入群申请
群主
群组的创建者,在群组中拥有最高的管理权限
任命/取消管理员
将管理员踢出群组
将管理员禁言
解散群组
转让群组
App 管理员
具备所有权限
群组基础能力操作差异
差异区别

备注
对于好友工作群(Work),普通成员只能修改群名称、简介、公告、群头像 URL,不能修改其他群基础资料。
如果群类型中的角色不能满足业务需求,可以通过设置群成员 自定义字段 来增加新角色。
获取部分群成员的信息,常用于直播群(AVChatRoom)中只需要展示部分群成员列表的场景。
加群方式差异
差异区别

备注
精确搜索:非群成员通过群组 ID 查找群组;模糊搜索:非群成员通过群名称等字段查找群组。
入群审批:群主和管理员可以针对群外用户的加群申请选择“同意”或“拒绝”,通过审批的用户方能加入群组。
不支持邀请加群的群类型,可以在 App 中通过群内成员分享群 ID 给他人申请加群达到类似效果。
成员管理能力差异
差异区别

备注
被禁言的群成员,在禁言时间内无法发送群聊消息。
群组限制差异
差异区别
消息能力差异
差异区别

备注
需要激活的群组,在群主发消息前为未激活状态,对群主以外的其他群成员不可见,而不需要激活的群组,创建后即对所有群成员可见。
离线推送目前只支持 Android(Android 离线推送)和 iOS(APNs 推送)。
好友工作群(Work)、陌生人社交群(Public)和临时会议群(Meeting)具备历史消息存储能力,默认免费存储7天(旗舰版默认30天)
群组数据结构
群基础资料
GroupId
只读 群组 ID,App 内保证唯一,其格式前缀为 @TGS#。另外,App 亦可自定义群组 ID
群组的唯一标识
Type
只读 默认支持以下群组类型:好友工作群(Work)、陌生人社交群(Public)、临时会议群(Meeting)、直播群(AVChatRoom),详情请参阅 群组类型介绍 旧版本 SDK 中还包含 Private、ChatRoom 以及 BChatRoom 类型,不建议使用
群组类型
Name
可读可写。最长30字节,不可调整
群组名称
Introduction
可读可写。最长240字节,不可调整
群组简介
Notification
可读可写。最长300字节,不可调整
群组公告
FaceUrl
可读可写。最长100字节,不可调整
群组头像 URL
Owner_Account
群主 ID
CreateTime
群组的创建时间
InfoSeq
群资料的每次变都会增加该值
LastInfoTime
群组最后一次信息变更时间
LastMsgTime
群组内最后发消息的时间
NextMsgSeq
只读 群组内每一条消息都有一条唯一的消息 Seq,且该 Seq 是按照发消息顺序而连续的。从1开始,群内每增加一条消息,NextMsgSeq 就会增加1
群内下一条消息的 Seq
MemberNum
当前成员数量
MaxMemberNum
最大成员数量
ApplyJoinOption
申请加群选项
DisableApply 表示禁止任何人申请加入
NeedPermission 表示需要群主或管理员审批
FreeAccess 表示允许无需审批自由加入群组
群成员资料
Member_Account
群成员 ID
Role
群内身份,包括 Owner 群主、Admin 群管理员以及 Member 群成员
群内身份
JoinTime
入群时间
MsgSeq
该成员当前已读消息 Seq
MsgFlag
消息接收选项
AcceptAndNotify 表示接收并提示
AcceptNotNotify 表示接收不提示(不会触发 APNs 远程推送)
Discard 表示屏蔽群消息(不会向客户端推送消息)
LastSendMsgTime
最后发送消息的时间
NameCard
群名片
群组管理
群权限管理
转让群组
更换群主身份给他人。
App 管理员可以通过 REST API 转让群组,除此之外只有群主可以转让群组。
解散群组
解散 App 上创建的某个群组,群组被解散时,群组原有成员均会收到解散群组的系统消息。
App 管理员可调用 REST API 接口解散任意群组。
在App端解散群组权限受成员角色限制, 陌生人社交群(Public)、临时会议群(Meeting)、直播群(AVChatRoom)只有群主可以解散群组
好友工作群(Work)群内任何人都无法解散群组。
创建群组
创建一个新的群组,可指定群组类型、群组名称以及要加入的用户列表,创建成功后返回群组 ID;群组 ID 为群组唯一识别标识,可通过群组 ID 进行收发消息等其他群组操作。
每个 App 每天净消耗群组上限为10000个。
群组资料管理
获取群组资料
拉取群组的基本资料
群成员获取群组资料:成员获取本群组资料;
非群成员获取群组资料:非群成员获取群组资料只能获取公开信息;
获取本人在群里的资料:可以获取本人在所有群内的资料,也可以获取单个群内本人在群里的资料;
获取群内某个人的资料:直播群(AVChatRoom)只能获得部分成员的资料,包括群主、管理员和部分群成员
修改群组资料
群组名称
群组简介
群组公告
群组头像
群名片
加群选项
用户群内身份
群成员/群组管理
群成员管理包括以下两个方面: 获取/修改自己在群组中的信息,这些信息仅仅可以由用户自己获取/设置,例如消息接收选项等。 获取/修改其他群成员的信息,包括群成员的身份、入群时间、最后发消息时间、群名片以及群成员维度的自定义资料。
获取群成员资料
可获取群成员的身份、入群时间、最后发消息时间、群名片,以及群成员维度的自定义资料。
获取自己或其他群成员的信息。
修改群成员资料
群主或者管理员修改其他群成员的资料,包括修改群内身份(设置/取消管理员)、禁言、修改群名片、群成员维度的自定义字段等。 群成员主动修改自己在群内的资料,包括消息接收选项、群名片、群成员维度的自定义字段等。
群主、管理员或成员均可修改相应的群成员资料。
邀请加群
好友工作群(Work)中,任何群成员都可以邀请他人入群, 且无需被邀请人同意直接加入群中。 陌生人社交群(Public)和临时会议群(Meeting)默认只有 App 管理员能够邀请其他用户加群。 直播群 (AVChatRoom) 则不允许任何人邀请他人加群。
邀请加群是希望将其他用户拉入某一群组中。
申请加群
好友工作群(Work)不允许申请加群,会直接返回错误。 对于其他内置群组类型,申请加群的处理结果,由群资料中的 ApplyJoinOption 字段决定的。
申请加群即用户通过 IM SDK 主动加入某一群组的动作。
删除群组成员
当管理员或群主将用户从群组中删除之后,被删除的用户会收到被移出群组的系统消息,群内其他成员也会收到该用户被移出群组的事件消息。
删除群组成员是群主或者群管理员将群成员从群组中移除的操作。
主动退群
群成员主动退群之后,主动发起退群操作的用户会收到主动退群系统消息,群内其他成员会收到该成员退出群组的事件消息。
主动退群是群内成员主动发起退群操作。
获取用户所加入的群组
详细群组信息可以根据群成员获取群组资料功能进行获取。
拉取当前用户加入的所有群组列表,返回的信息只包含部分基本信息。
群未决信息列表
可拉取群未决列表、上报群未决已读、处理群未决信息(同意或拒绝)。
群组未决信息泛指所有需要审批的群相关的操作。
客户端交互
心跳
客户端与服务器端交互的心跳时间是2分钟一次心跳
API端交互
API交互限制
接口需要进行相关的授权验证,目前是通过统一授权中心进行的授权,查询的时候使用用户名和临时生成的授权密码
客户端的交互尽量使用get请求,携带参数,采用https方式进行交互
restapi请求的时候,返回结构采用json方式
http请求有限流措施
http的超时时间是:3秒
http的请求限流是根据用户整体限流
限流规则:200次/s
腾讯的建议
业务方http链接采用长连接+连接池的模式
rest_api接口
api接口分类
账号类
导入单个帐号(/account_import)
导入多个帐号(/multiaccount_import)
删除账号(/account_delete)
查询帐号(/account_check)
查询帐号在线状态(/querystate)
单聊信息
单发单聊消息(/sendmsg)
批量发单聊消息(/batchsendmsg)
导入单聊消息(/importmsg)
查询单聊消息(/admin_getroammsg)
撤回单聊消息(/admin_msgwithdraw)
全员推送
全员推送(/all_member_push/im_push)
用于后期实时推荐等操作,与算法相关
获取用户属性(/all_member_push/im_get_attr)
设置用户属性(/all_member_push/im_set_attr)
删除用户属性(/all_member_push/im_remove_attr)
获取用户标签(/all_member_push/im_get_tag)
添加用户标签(all_member_push/im_add_tag)
删除用户标签(/all_member_push/im_remove_tag)
删除用户所有标签(/all_member_push/im_remove_all_tags)
用户资料
设置资料(/profile/portrait_set)
获取资料(/profile/portrait_get)
关系链
添加好友(/sns/friend_add)
导入好友(/sns/friend_import)
更新好友(/sns/friend_update)
删除好友(/sns/friend_delete)
删除所有好友(/sns/friend_delete_all)
校验好友(/sns/friend_check)
拉取好友(v4/sns/friend_get)
拉取指定好友(/sns/friend_get_list)
添加黑名单(/sns/black_list_add)
删除黑名单(/sns/black_list_delete)
拉取黑名单(/sns/black_list_get)
校验黑名单(/sns/black_list_check)
添加分组(/sns/group_add)
删除分组(/sns/group_delete)
群组管理
创建群组(/group_open_http_svc/create_group)
获取群详细资料(/group_open_http_svc/get_group_info)
获取群成员详细资料(/group_open_http_svc/get_group_member_info)
修改群基础资料(/group_open_http_svc/modify_group_base_info)
增加群成员(/group_open_http_svc/add_group_member)
删除群成员(/group_open_http_svc/delete_group_member)
修改群成员资料(/group_open_http_svc/modify_group_member_info)
解散群组(/group_open_http_svc/destroy_group)
获取用户所加入的群组(/group_open_http_svc/get_joined_group_list)
查询用户在群组中的身份(/group_open_http_svc/get_role_in_group)
批量禁言和取消禁言(/group_open_http_svc/forbid_send_msg)
获取被禁言群成员列表(/group_open_http_svc/get_group_shutted_uin)
在群组中发送普通消息(/group_open_http_svc/send_group_msg)
在群组中发送系统通知(/group_open_http_svc/send_group_system_notification)
撤回群消息(/group_open_http_svc/group_msg_recall)
转让群主(/group_open_http_svc/change_group_owner)
导入群基础资料(/group_open_http_svc/import_group)
导入群消息(/group_open_http_svc/import_group_msg)
导入群成员(/group_open_http_svc/import_group_member)
设置成员未读消息计数(/group_open_http_svc/set_unread_msg_num)
删除指定用户发送的消息(/group_open_http_svc/delete_group_msg_by_sender)
拉取群历史消息(/group_open_http_svc/group_msg_get_simple)
获取直播群在线人数(/group_open_http_svc/get_online_member_num)
全局禁言管理
设置全局禁言(/openconfigsvr/setnospeaking)
查询全局禁言(v4/openconfigsvr/getnospeaking)
运营管理
拉取运营数据(/openconfigsvr/getappinfo)
下载消息记录(/open_msg_svc/get_history)
获取服务器 IP 地址(/ConfigSvc/GetIPList)
使用限制
业务特性限制
单聊/群聊消息
内容长度
单聊、群聊消息,单条消息最大长度限制为8000字节,超过此长度会被系统丢弃
发送频率
单条消息长度不能超过8000字节
对同一帐号发送单聊消息时,建议频率不要超过10条/秒。
单个文件大小
发送文件消息时,SDK 最大支持发送单个文件大小为100MB
历史消息存储时长
7天
30天
系统消息
数量及存储时间
最多保存100条,存储时长不超过7天
UserID
命名规则
用户帐号长度不超过32字节,不支持使用特殊字符,建议使用英文字母或数字
用户资料
自定义字段
自定义字段的关键字必须是英文字母且长度不得超过8字节,自定义字段的值最长不能超过500字节
UserSig
有效期
用户密码,即时通信 IM 后台 SDK 默认接口生成的签名有效期为180天
会话管理
最近联系人数量
普通用户最多保存100个最近联系人
用户关系链
好友及分组
单个用户支持3000个好友
添加好友时未决消息最多支持100条
好友分组最多支持32个
每个分组的名称最长30字节
好友备注最长支持96字节
黑名单
单个用户最多允许的黑名单人数为1000人
群组
群组数量
体验版: 100个
免费峰值群组数为10万个/月
日净增群组数最多支持1万个
群成员数量
直播群(AvChatRoom):无成员数量上限
非直播群:2000人
用户可加入群组数
体验版:50个群
专业版:500个群/人,支持扩展至1000个群/人
旗舰版:支持扩展至3000个群/人
群资料
群名称最长30字节
群简介最长240字节
群公告最长300字节
群头像 URL 最长100字节
群名片最大不超过50个字节
自定义群组 ID
自定义群组 ID 必须为可打印 ASCII 字符(0x20-0x7e),最长48个字节,且前缀不能为 @TGS#(避免与默认分配的群组 ID 混淆)
群组维度自定义字段
字段 Key 为 String 类型,长度不超过16字节,其命名仅支持英文大小写字母、数字、下划线
字段 Value 为用户自定义 Buffer,可以为二进制数据,群维度的 Value 长度不超过512字节
群成员维度自定义字段
字段 Key 为 String 类型,长度不超过16字节,其命名仅支持英文大小写字母、数字、下划线
字段 Value 为用户自定义 Buffer,可以为二进制数据,群成员维度的 Value 长度不超过64字节
接口相关限制
通用限制
调用频率
最高100次/秒:导入多个帐号、删除帐号 和 查询帐号
最高200次/秒:其余 REST API
帐号管理
导入多个帐号
单次最多导入100个用户名,且本接口不支持直接导入帐号的昵称和头像信息
查询帐号在线状态
一次请求最多可以查询500个用户的状态
单聊消息
批量发单聊消息
一次请求最多可给500个用户发送单聊消息
关系链管理
导入好友
一次请求最多只能导入1000个好友
群组管理
增加群组成员
一次最多支持添加100个成员
删除群组成员
一次请求最多可删除500个成员
查询用户在群组中的身份
一次请求最多支持查询500个帐号
批量禁言和取消禁言
一次请求最多可禁言/取消禁言500个帐号
在群组中发送普通消息
单个群的默认发送频率限制为40条/秒
如果5分钟内同一发送者的两条消息的随机值(Random 参数)相同,后面的消息将被当做重复消息而丢弃
导入群消息
一次请求最多可导入20条消息,要求按消息时间戳递增的顺序导入,消息时间戳必须大于建群时间且小于当前时间,否则失败
导入群成员
直播群(AvChatRoom)不支持导入群成员
一次请求最多可导入300个成员,但群成员数上限同时受不同群组类型的特性约束