实践:腾讯云IM搭建应用内类微信社交聊天模块

社交模块是目前主流应用程序最常见的功能之一。有了社交模块,用户在您的应用内,可以自由的交流互动,并添加好友,关注其他用户等等。这可在很大程度上,促进您应用程序的活跃度,吸引用户留存,获取更多新用户,并可拓展您应用的业务范围。让更多用户花更多时间在您的应用程序上。因此,社交聊天模块可谓是您应用程序不可或缺的能力。

本文将以腾讯云IM为基础,梳理现有应用在接入社交场景过程中常见需求,给出解决实现方案。以及可能遇到的问题、需要注意的细节点等,希望能帮助朋友们快速的理解业务、实现需求。

用户

腾讯云 IM 支持托管维护用户信息与用户资料。您可直接将您应用的用户资料存储与我们的服务内,并通过相关 API 进行读取/更新/维护操作。

对于社交场景,常见用户资料可分为基本信息资料和其他信息资料。

基本信息

其他信息

用户名,性别,生日,所在地,个性签名,昵称等

其他社交模块内需要的资料

导入现有用户数据

如果您需要给您现有应用,添加社交能力。可直接使用我们的服务端 API,快速将您现有用户数据,完整导入至腾讯云 IM 中。

导入完成后,现有用户可直接使用其原有身份数据,和其他用户发起会话,一起聊天,开启社交之旅。详情请参见 导入多个账号 - 服务端 API

用户在线状态

腾讯云IM支持自动上报并让其他用户获取 在线状态信息

状态包括:前台运行状态 / 后台运行状态 / 未登录状态。

利用这一能力,您可让用户看到其他用户的在线状态,增强互动性。

此外,您还可使用这一能力,针对您的业务场景,做许多功能拓展。例如,交友软件,能够优先推荐匹配在线的用户,让聊天可进行的更顺畅,缘分更快相聚。

会话列表用户在线状态
通讯录用户在线状态

获取用户在线状态

在客户端上, 您可调用 getUserStatus 方法,批量查询其他用户的在线状态

此外,在服务端上,也可通过REST API,获取用户状态

订阅用户在线状态变更

其他用户的在线状态总是实时在变化的,您可在客户端上,调用 subscribeUserStatus 方法,批量订阅其他用户的在线状态。当发生变化时,将通过回调函数通知您,您可根据其,修改界面UI并完成其他您的业务操作。

好友

好友管理,又称关系链管理,是社交场景的基础。众多会话/聊天特性,都要依赖于好友关系状态。有了好友关系链能力,众多的用户才能得以串联起来,互动形成整体。

例如微信/QQ只允许好友间发起一对一单聊;交友软件则常常可在非好友的情况下,进行有限度的聊天;在线娱乐社区软件,则常常不需要好友关系即可会话。

因此,您需要根据您的应用使用场景,确定好友及关系链管理的用法。

 

通讯录

好友关系

腾讯云IM支持单个用户添加最多3000个好友。

好友关系类型

好友关系类别包含单向好友和双向好友。

  • 双向好友:用户 A 的好友表中有用户 B,B 的好友表中也有 A。
  • 单向好友:用户 A 的好友表中有用户 B,但 B 的好友表中却没有 A。

添加好友验证方式

一回合加好友:如果帐号 A 设置的加好友验证方式是 AllowType_Type_AllowAny,那么任何人添加 A 为好友都可直接添加成功,这种一个请求就添加好友成功的场景称作一回合加好友。

两回合加好友:如果帐号 A 设置的加好友验证方式是 AllowType_Type_NeedConfirm,那么任何人添加 A,A 都会收到一个请求加好友验证消息,这是第一个回合,然后 A 对这个请求加好友验证消息进行同意操作时,这是第二个回合,这种需要验证的加好友场景就被称为两回合加好友。

非好友发消息

对于某些场景,需要非好友关系也能发送消息。例如对于交友软件,常常允许匹配到的陌生人,发送若干条消息打招呼。

这需要您在 腾讯云 IM 的控制台,关闭 “好友关系检查” 功能。

如果您需要针对陌生人发消息的数量加以限制,可在您的业务层实现。发送若干条消息后,不再允许发送即可。

群组

有的时候,仅一对一单聊无法满足您的社交场景要求。

例如对于音乐类型 App,优质的乐迷群及粉丝群,有助于打造音乐社区文化,吸引用户留存。

群组类型

腾讯云 IM 支持多种类型的群,为便于理解,在这里以常见的群聊举例。

微信群 - 好友工作群 Work

Work 群,类似普通微信群。创建后仅支持已在群内的好友邀请加群,且无需被邀请方同意或群主审批。

该群适合用于打造好友间互动拉入,产生的群。

QQ 群 - 陌生人社交群 Public

Public 群,类似 QQ 群。创建后群主可指定群管理员,用户搜索群 ID 发起加群申请后,需要群主或管理员审批通过(可选)才能入群。

该群适合用于打造兴趣社区,用户在您的 App 中,发现好玩的兴趣群组,可按需主动加入。

会议群 - Meeting

创建后可随意进出,且支持查看入群前消息。

适合用于音视频会议场景、在线教育场景等与实时音视频产品结合的场景。

直播群 - AVChatRoom

创建后可随意进出,没有群成员数量上限,但不支持历史消息存储。

适合与直播产品结合,用于弹幕聊天场景。

Discord - 社群 Community

创建后可随意进出,最多支持10w人,支持历史消息存储,用户搜索群 ID 发起加群申请后,无需管理员审批即可进群。详情可查看此文档

群资料

群资料主要包括 群组本身的资料 和 群成员资料。

群组本身的资料

群组资料是指单个群组维度的属性,包括群名称、简介、公告、群主等,以及群组维度自定义字段。

获取群资料

在客户端上,可调用 getGroupsInfo 方法,获取特定群组资料详情。

修改群资料

可修改群组名称、群组简介、群组公告、群组头像、群名片,修改加群选项、群纬度自定义字段、用户群内身份、群成员维度自定义字段和接收群消息选项等信息。

在客户端上,可调用 setGroupInfo 方法,修改特定群组资料详情。

群成员资料

群成员资料主要包括,特定成员,在群内的备注名/角色/禁言状态/自定义字段信息。在强社交场景的群内,会非常实用。

获取群成员资料

可通过客户端 getGroupMembersInfo 方法或 getGroupMemberList 方法获取此信息。

修改群成员资料

不同的群成员资料,调用不同的API方法修改。详情可查看此处

会话

一个会话,您可理解为同某个特定用户的单聊,或一个群聊的消息集合。当用户创建了一个单聊或群聊,当其中有消息的收发时,对应的会话就随之创建。

在腾讯云 IM 层面,每个会话都是一个 V2TIMConversation 类的实例,包括了 会话类型 / 会话ID / 用户ID / 群ID / 显示名称 / 头像 / 最后一条消息 / 草稿 / 群聊类型 / 消息接收方式 / 群 @ 信息列表 / 是否置顶 / 标记列表 / 所属分组信息 / 自定义数据 信息。

会话列表

会话列表,您可以理解成微信软件的首页。即,所有会话的集合。方便用户找到目标会话。

会话列表功能主要分为获取会话列表、处理会话列表更新。

会话列表

获取会话列表

您可在客户端上调用 getConversationList。该接口获取的是本地缓存的会话,如果服务器会话有更新,SDK 内部会自动同步,然后在 V2TIMConversationListener 通知回调。

如果您的应用场景会产生较多的会话数,考虑到加载效率、网络省流,我们建议您采用分页拉取的方式。每次分页拉取的数量建议不超过 100 个。具体方案可参考此处。

会话列表实时更新

当会话信息发生变化,例如收到一条新消息/设置消息草稿/出现一个新的会话,都会导致会话列表发生更新。

如果需要实时获取更新信息,需要通过客户端的 addConversationListener 方法,添加会话监听器。收到更新触发后,更改UI。

会话草稿

在发送消息时,可能会遇到消息尚未编辑完,就要切换至其它聊天窗口的情况。

这些未编辑完的消息可通过 setConversationDraft 接口保存,以便于下次回到这个聊天界面时,通过 V2TIMConversation 对象的 draftText 字段,获取到尚未编辑完的内容,继续编辑。

此类草稿信息,仅保存在本地。

置顶会话

会话置顶指的是把单聊或者群聊会话固定在会话列表的最顶部,不会被其他会话更新挤到底部,方便用户查找。

在社交场景中,用户常常需要将一些重要的人或群置顶。这在我们使用微信的过程中,很普遍。

置顶状态会存储在服务器,切换终端设备后,置顶状态会同步到新设备上。

置顶的会话,注意最上方第一条

置顶会话,通过客户端 pinConversation 即可。

调用 getConversationList 获取会话列表时,该接口返回的会话列表中,置顶的会话在前,未置顶的会话在后。您可以通过 V2TIMConversation 对象的 isPinned 字段,检查会话有没有置顶。

会话标记

在某些社交场景下,您可能需要对会话进行标记,例如 "会话标星"、"会话折叠"、"会话隐藏"、“会话标记未读”。

直接在客户端调用 markConversation 方法,即可标记,或取消标记一条会话。

标记后,在后续通过 getConversationListByFilter 方法请求会话列表时,可按照标记,过滤获取指定会话。

消息

消息是社交模块的灵魂。众多各种类型的消息,组成了一个个会话,使得用户与用户之间,紧密的串联在一起。

腾讯云IM中,一对一单聊消息与群聊消息,用法在大部分场景中都类似,下面着重介绍几点。

消息类型

腾讯云IM支持多种类型的消息,如下:

功能类型

功能描述

文本消息

消息内容是普通文本

表情消息

表情消息为开发者自定义,可传入表情资源路径

地理位置消息

消息内容为地理位置标题、经度、纬度信息

图片消息

消息内容为图片的 URL 地址、尺寸、图片大小等信息,最大支持大小为28M的图片

语音消息

消息内容为语音文件的 URL 地址、大小、时长等信息,最大支持大小为28M的语音文件

文件消息

消息内容为文件的 URL 地址、大小、格式等信息,格式不限,最大支持大小为100M的文件

短视频消息

消息内容为短视频文件的 URL 地址、时长、大小、格式等信息,最大支持大小为100M的短视频文件

自定义消息

开发者自定义的消息类型,例如红包消息、石头剪刀布等形式的消息

消息回复

回复一条消息,既支持使用文字内容,发一条新消息,引用原消息;也支持使用Emoji表情回应

引用回复文本
表情回应

引用回复文本

此方案效果和微信中,长按一条消息,选择 “引用”,效果一致。

引用消息,实际上,在腾讯云IM SDK层面,也是一条普通文本消息。文本消息的主体,则是回复的文字内容。

为了展示原消息的引用,需要在发送文本消息的时候,将原消息的信息,传入新消息的 cloudCustomData 字段中。例如,我们的TUIKit,为了实现这个功能,传入了如下JSON。

"messageReply": {
  "messageID": 原消息的ID,
  "messageAbstract": 原消息的描述,用于显示在消息列表气泡中,
  "messageSender": 原消息的发送者,建议使用备注名或昵称,
  "messageType": 原消息类型,
  "version": 协议版本
}

在消息列表中展示时,从 cloudCustomData 字段中,提取出上述JSON信息,直接用于拼接展示 "${messageSender}: ${messageAbstract}" 即可。

如需支持点击展示引用消息的区域,跳转至被引用原始消息。可根据上述JSON中的 messageID 字段,在消息列表中,找到这条消息,跳转即可。如果消息当前不存在于数组中,可直接调用 getHistoryMessageList,参数传入 messageID,获取本条消息及其上下文消息。

表情回应

在回复特定的单条消息时,你不仅可以直接引用原消息并回复,还可使用Emoji表情回应,高效表达“好的”、“赞同”、“很棒”、“哭笑不得”、“加油”等多种信息,大大降低沟通成本,解决多人聊天中消息冗杂的问题。

通常,若干个用户,可对同一条消息,或多条消息,点击一个或若干个回应表情。在显示上,这些回应信息,常常承载在不同的气泡中,以表情为首,后面跟着若干个名字。如本章节图片所示。

这些名称,需要支持点击,并跳转至用户Profile详情页中。若名字过多,还需要加以折叠,通过新窗口详情页展示

发送表情回应,则可放置于消息的长按菜单中。

发送表情回应TUIKit
表情回应详情TUIKit

下面介绍实施细节:

表情回应的数据,存储于消息的 cloudCustomData 字段中,可以如下JSON格式示例。其中的 key 字段,如采用Emoji Unicode表情字符,可直接传入 Unicode;若采用图片小表情,可传入路径或文件名。

messageReactions: [
   {
      key: "表情名称1",
      users: ["用户1", "用户2", ...]
   },
   {
      key: "表情名称2",
      users: ["用户1", "用户2", ...]
   },
   ...
]

本部分代码可根据您的需求,加以修改。

展示时,渲染遍历上述结构体即可。

发送表情回应,则直接在客户端调用 modifyMessage 方法,修改消息本身的 cloudCustomData 字段即可。将当前用户头像,添加或从上述结构体中移除,完成回应或取消回应。

调用方法修改后,所有用户的 V2TimAdvancedMsgListener => onRecvMessageModified 监听器会触发,您可依此修改消息UI,展示最新表情回应内容。

删除消息

删除消息分为两种:删除本地消息和删除云端消息。

删除云端消息会在删除本地消息的基础上,同步删除云端存储的消息,且无法恢复。

删除本地消息,在客户端调用 deleteMessageFromLocalStorage 方法。需要注意的是,如果程序卸载重装,依旧能获取到被删除的消息。

删除云端存储的消息,在客户端调用 deleteMessages 方法。此方法不支持多端同步,即无法自动删除,其他设备上,已经存在的消息。

搜索消息

搜索能力是社交场景中的重要一环。

用户们常常需要,在特定会话中,亦或是全局中,快速准确搜索到某条消息。此外,也可作为社交活动运营工具,增加相关内容的引导,简洁高效。

您可在客户端,调用 searchLocalMessages 方法,并传入以 V2TIMMessageSearchParam 对象封装的关键词信息,即可完成搜索。

如果您希望在全部会话范围内搜索,只需要将 V2TIMMessageSearchParam 中的 conversationID 设置为空或者不设置即可。

全局搜索
会话内搜索

转发消息

在日常生活聊天或工作场景中,将一个会话中的消息,合并或逐条转发至另一个会话,是个非常高频且基础的操作。

合并转发消息
合并消息详细内容

逐条转发消息,需要先在客户端调用 createForwardMessage 方法创建一条和原消息内容完全一样的转发消息,再调用 sendMessage 方法把转发消息发送出去。

合并转发消息,同样需要先创建后转发。需要额外注意的是,在客户端调用 createMergerMessage 方法创建一条合并消息时,需要设置原始消息列表,合并消息标题、合并消息摘要等信息。

若想转发至多个接收者,遍历调用 sendMessage 方法即可。

对于接收者端,若想展示上方右侧图片的合并消息详情,需要当用户点击合并消息的时候再调用 downloadMergerMessage 方法下载合并消息列表 UI 展示。

撤回消息

消息撤回是目前社交软件中必备的功能。

发送方可撤回一条已经发送成功的消息。默认情况下,发送者只能撤回 2 分钟以内的消息,此配置可按需修改。

撤回方在客户端,调用 revokeMessage 方法,接收方会收到消息撤回通知 onRecvMessageRevoked。通知中包含了撤回消息的 msgID,您可根据这个 msgID 判断 UI 层是哪一条消息撤回了,然后把对应的消息气泡切换成 "消息已被撤回" 状态。

消息翻译

对于国际化的聊天场景,消息翻译功能必不可少,可大大提升跨语言交流效率。社交场景中,大型群聊内,有不同语言的交流存在,是非常之常见的。

消息翻译

对于文本类型的消息,您可在客户端上调用 translateText 方法,将待翻译文本列表和目标语言传至我们的服务端。原语言可由您自行判断,也可由我们判断。

翻译结果返回后,我们建议您将其通过客户端的 setLocalCustomData 方法,存放于消息的 localCustomData 字段中,以便于后续直接展示,避免用户重复翻译,多次发送翻译请求。

我们支持众多语言的互相翻译,所有支持的语言可查看此处

消息已读回执

单聊和群聊均支持消息已读回执功能,操作步骤一致。

单聊,TUIKit中以文字承载
群聊,TUIKit中以圆圈承载

是否启用此功能,可根据您的社交业务需求决定。

例如对于类似微信的熟人社交,已读回执的用处可能不是非常大;但是对于陌生人交友场景,已读回执则十分重要,帮助用户来确认,对方是否愿意跟自己聊下去,是否已读不回;对于工作聊天场景,群已读回执还能发挥更大的作用,可便捷看到群内哪些人已读哪些人未读,帮助发送者确认信息传递效率。

具体用法如下:

发送端创建消息后,先通过消息对象 V2TIMMessageneedReadReceipt 字段设置这条消息需要已读回执,再发送消息到会话中。

接收端收到消息后,根据消息对象 V2TIMMessageneedReadReceipt 字段判断消息是否需要已读回执。如果需要,当用户查看消息后,调用 sendMessageReadReceipts 方法发送消息已读回执。

接收端发送消息已读回执后,发送端可在 V2TIMAdvancedMsgListeneronRecvMessageReadReceipts 中收到已读回执通知,在通知中更新 UI,例如更新某条消息为 “2 人已读”。

此外,发送端也可主动请求消息已读回执信息。发送端从其他界面进入消息列表后,先请求获取历史消息,再调用 getMessageReadReceipts 方法请求获取消息已读回执信息。

群聊场景的消息已读回执,通常需要能够查看详情,显示群内哪些人已读,哪些人未读。当用户点击已读回执角标时,可调用 getGroupMessageReadMemberList 方法分页拉取消息已读或未读群成员列表。

 
已读群成员
未读群成员

群内@消息

相信大家已经很熟悉,在群聊交流过程中,如果需要提及或提醒某些群成员,我们可直接 @ 他们。所有的社交聊天软件,都有这个基础功能。

当用户输入 @ 字符后,弹出群成员选择界面。选择完需要 @ 的成员后以 “@A @B @C......” 形式显示在输入框,并可继续编辑消息内容,完成消息发送。

监听 @ 字符选择群成员
编辑群 @ 消息发送
收到群 @ 消息

说明: 图一:在聊天界面监听到输入框输入 "@" 字符后,可跳转到群成员选择界面,选择需要 @ 的群成员。 图二:在群成员选择完成后,重新返回聊天界面,继续编辑群 @ 消息发送。 图三:如果有消息 @ 我,自己会收到会话更新,可在会话 Cell 展示 “有人@我” 信息。

由于实现方案内容较多,您可查看此文档,获取详情。

消息漫游

如果用户有多台设备,或者同时使用电脑和手机登录您的应用程序,用户们希望看到,无论在哪一端,历史消息都能尽可能完整。能从提供的历史消息上下文中,快速无障碍的加入聊天,满足社交场景高频率聊天的要求。

为了保证交流的连续性与流畅性,我们提供一套消息漫游存储能力,即用户更换终端的情况下,也可以获取到跟其他用户或者某个群的聊天记录,可以达到类似 QQ 软件的效果。

默认情况下,单聊消息和群聊消息有7天漫游,超过漫游时长的消息会被删除。此外,还支持在控制台修改消息漫游时长,延长消息漫游时长是增值服务。

以下截图演示了消息在手机和电脑之间漫游。图片来自 Flutter TUIKit,一套代码完成电脑桌面端/Web 端/移动端应用的开发。

电脑端
手机移动端

更多丰富的消息形态

我们默认提供的消息类型,可满足您大部分的聊天场景需求。但是对于社交软件来说,仅有这些还远远不够。

红包/送礼物/投票/发送匹配度/闪照等等一系列创新玩法,让您 App 的社交场景模块变得更加丰富多彩。

因此,您可使用我们提供的自定义消息能力,来发挥您的想象力,尽情创造激动人心的玩法及贴合您业务需求的功能。

发送自定义消息分两步:

消息体中,您可以 JSON 格式,传入任何符合您需求的数据。例如,包含一个字段控制消息形态类型,还包含一个字段控制消息当前数据。

如果是投票/红包等类型的消息,如果您想实时更新投票数据/红包领取信息,可将此类信息放在消息体中,在客户端上,通过 modifyMessage 方法实时修改。

更多能力

内容审核

在社交场景中,用户很可能会发送不合规的消息。特别是陌生人交友软件,黄色不良内容消息更是频频出现。诱导性暗示图片等令人反感的内容,不仅严重损害了用户们的身心健康,更很有可能违法并导致应用被监管部门查封。

我们支持内容审核(反垃圾信息)功能,可针对不安全、不适宜的内容进行自动识别、处理,为您的产品体验和业务安全保驾护航。

目前有以下三种内容审核方式。

方式

介绍

本地审核

在客户端本地检测由即时通信 SDK 发送的文本内容,支持对已配置的敏感词进行拦截或者替换处理。此功能通过在 IM 开启服务并配置词库的方式实现。

云端审核

在服务端检测由单聊、群聊、资料场景中产生的文本、图片、音频、视频内容,支持针对不同场景的不同内容分别配置审核策略,并对识别出的不安全内容进行拦截。

第三方回调服务

如果您已接入第三方内容审核服务,您可以使用 第三方回调配置 来实现。

您可按需使用如上三种内容审核工具,保证业务安全运行。

离线推送

社交场景下,用户需要随时都能够得知最新的消息,以加快聊天效率,促进社交关系的形成。

由于移动端设备的性能与电量有限,当 App 处于后台时,为了避免维持长连接而导致的过多资源消耗,我们推荐您使用各厂商提供的系统级推送通道来进行消息通知。系统级的推送通道相比第三方推送拥有更稳定的系统级长连接,可以做到随时接受推送消息,且资源消耗大幅降低。

我们目前原生支持的厂商系统有:苹果 iOS/Google FCM/OPPO/VIVO/华为/小米/魅族/荣耀。

理论上,集成系统原生的离线推送,需要手动对接各个厂商的 SDK,手动注册服务/获取 Token/承载点击回调页面,非常之复杂。

因此,我们提供了如下几款离线推送插件,封装了上述厂商的原生 SDK,大大降低了使用上手成本。您可直接按照文档配置。开箱即用。

音视频通话

许多时候,仅靠文字和图片还是不足以抒发我们内心的情感,可能打字聊天一小时,也比不是直接打一通视频电话来的爽快。

特别是对于社交场景下的用户们,他们一定有很多想法想要交流与诉说。

因此,我们也强烈推荐您,再集成我们的音视频通话能力,一步到位,完成一对一或多人群组的音频/视频通话,并且支持离线唤起能力。

详情可查看此文档

 

 

 
posted @ 2023-03-01 18:12  粤海科技君  阅读(295)  评论(0编辑  收藏  举报