默认
打赏 发表评论 3
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
如何快速实现APP中的IM即时聊天功能
阅读(35053) | 评论(3 收藏1 淘帖 1
微信扫一扫关注!

1、前言


即时通讯(Instant Messaging)是一种基于互联网的即时交流消息的业务。

实时聊天交互功能是市面上主流APP的重要功能之一,人们所熟悉的就是微信、QQ这样的聊天消息系统。

IM看似简单,但技术开发绝非易事,海量并发、超低延时、消息必达等高实时性需求需要众多技术的应用合体。

近几年,随着移动互联网的深入渗透和社交+的迅速发展,IM衍生出了很多新的玩法,不仅仅应用于社交聊天场景,还出现在电商、直播、客服等各种场景,正在被人们广泛的应用。

调研数据显示:市面上60%以上的APP拥有即时通讯能力,用户可以直接在app内跟其他用户实时聊天,有助于提升app活跃和用户体验。IM功能的实现已成为应用开发者们必修课程。

笔者从事IM开发工作十年有余,本文主要分享IM开发的3种实现方式:包括使用开源、自研、以及我使用厂商SDK的经验,希望对IM开发者有所帮助。

2、关于作者


如何快速实现APP中的IM即时聊天功能_author.jpg

吴秋语(Rachael:某互联网公司后台开发工程师,主要从事服务端开发、需求分析、系统设计、优化重构工作,主要开发语言Golang。

3、IM实现方式


IM开发的3种实现方式分别为:

  • 1)开源代码;
  • 2)自研;
  • 3)集成商业SDK。

开发者可根据项目情况进行选择。

一个IM产品的落地,大体上可以分成三个重要部分:客户端开发、服务端开发、服务运维。

具体就是:

  • 1)客户端开发:包括各平台的手机app、桌面软件,网页端,小程序端等;
  • 2)服务端开发:负责IM各种功能的实现,比如用户接入、关系链维护、收发消息、文件图片存储、安全审核等;
  • 3)服务运维:一个长期运营的产品,必定需要一个持续性的运维过程,以保证IM服务端稳定可靠,比如业务量上涨的扩容处理。

以上三部分,任何一部分从零到一的实现,都会有不小的难度,完全自研对项目成员能力,以及资源投入的要求都比较高。

除了大型公司会完全自研以外,一般都会采取引用开源代码,或者集成商业sdk的方式。

下面总结一下这3种实现方式的区别:
如何快速实现APP中的IM即时聊天功能_1.png

4、第一种实现方式:使用开源项目


实现IM功能最快的方式就是选择开源项目,不仅是站在巨人的肩膀上,还可汇集全社区的智慧进行快速开发。

如何选择IM的开源项目?项目功能的完善度和活跃度是主要参考的维度,根据过往经验我选取了两个还算不错的开源项目供大家参考。

4.1MobileIMSDK


如何快速实现APP中的IM即时聊天功能_211753puhktaexuldexmt9.png

项目地址:https://github.com/JackJiang2011/MobileIMSDK

MobileIMSDK 是一个原创移动端IM通信层框架,轻量级、高度提炼,历经8年、久经考验。是市面上唯一同时支持UDP+TCP+WebSocket三种协议的同类开源框架,支持iOS、Android、Java、H5,服务端基于Netty。

PS:需要注意的是该项目的H5端暂未开源,小程序与Uniapp也还在开发之中。

4.2OpenIM


项目地址:https://github.com/OpenIMSDK/Open-IM-Server

OpenIM的创始团队来自IM高级架构师 ,由IM/WebRTC专家团队开发,致力于用开源技术创造服务价值,打造轻量级、高可用的IM架构,方便开发者构建多种即时通讯及实时音视频互动场景。

4.3小结


借鉴开源项目适合开发周期紧,无需太多定制化开发者,可帮助开发者快速实现IM功能。但功能一般相对简单基础,且后续的功能扩展严重依赖开源项目的开发进度。如果对定制化功能需求比较高,或者未来业务体量比较大,建议不要偷懒去使用这种方式。

对IM定制化要求高有研发能力的团队一般采取自研的方式,接下来会跟大家分享下自研过程中的技术难点和坑点。

5、第二种实现方式:自研


IM技术涉及范围很广,完全自研对研发团队能力、资金投入要求都比较高,研发周期也会拉的比较长。为了防止错失商机,需要做好长期的规划。

如下图——自研技术概览:
如何快速实现APP中的IM即时聊天功能_wecom-temp-122312-b6efb2015eb107d3e32bb439834f12c0.png

我们在自研IM过程中,也遇到了一些比较棘手的技术难题,这里列出来给大家做个参考。

比如:

  • 1)消息的可靠性、有序性;
  • 2)高并发场景下的消息实时推送,以及消息拉取;
  • 3)消息存储方案选型:使用读扩散还是写扩散;
  • 4)消息未读数的准确计算;
  • 5)群回执消息;
  • 6)异地多活。

对这些问题感兴趣,也可以参考优秀IM学习网站(即时通讯网:http://www.52im.net/)。

自研过程中,有些功能也可以直接使用市面上的成熟产品,比如:文件存储,安全审核,消息离线推送。以加快研发步伐。未来如果决定自研这部分功能,也可以很方便的替换掉,达到事半功倍的效果。

对于有经济和开发实力的企业,且业务预期客户体量大,建议走自研的实现方式,符合后期能力拓展、快速迭代和稳定运维的规划。

但自研需要投入较大的人力、财力,建议想要走自研的开发者,做好明确的开发规划,减少不必要的损耗。

引入开源项目,无法很好的扩展新功能,且运维复杂,难以支撑未来的长期发展;自研路线周期长,成本较高。

那有没有折中一点的方案呢?既可以快速上线,又不用投入那么大的成本,还可以定制化需求。集成商业sdk则是最便捷的方式,这也是目前较主流的开发模式。现在sdk厂商都很成熟,很多公司会选择此方式。

6、第三种实现方式:集成商业sdk


集成商业sdk具有以下优势:

  • 1)快速落地IM产品,快速上线,抢占市场;
  • 2)服务稳定,避免烦杂的运维工作;
  • 3)功能可扩展:增加新功能时,可以主动向sdk厂商提需求实现;
  • 4)相比自研,大幅降低成本。

6.1产品落地流程


选择集成商业sdk时,产品落地流程如下:

  • 1)申请sdk厂商服务账号,获取账号秘钥,用于用户登录。
  • 2)开发业务服务后台,用于计算登录鉴权信息。
  • 3)集成厂商sdk,开发应用程序(比如iOS应用、Android应用、小程序等)。

以收发消息为例,各模块之间的交互流程如下:
如何快速实现APP中的IM即时聊天功能_2.png

由此可见,集成商业sdk的方案,只需要开发一个简单的业务后台,然后集成sdk,开发自己的应用程序,即可快速上线服务。

6.2以即构IM为例


当前市面上已经有不少成熟的IM SDK厂商,之前开发的直播产品接了即构科技的RTC SDK,整个接入过程很顺畅,近期因项目需实现即时通讯功能,同一厂商图方便抱着尝试态度接入ZEGO IM SDK,没想到很快就完成开发实现了。

接下来,我就以我使用即构这套厂商的SDK为例,为大家分享一下我的接入经验。

根据我的调研情况,目前ZIM支持所有主流平台,包括flutter和uniapp两大跨平台框架,加速产品上线。在消息安全审核方面,他们采用主流第三方安全厂商的服务,需要的审核功能基本都能够支持。

实时通信的项目随着业务不断发展,对通信服务的高可用/高并发/低延时有更高的要求。之前使用他们的RTC产品,低延迟业内领先表现很优秀。IM产品我拿集成的Demo测试了下,端到端延只有几十毫秒。

即构的IM产品不仅支持基础的单聊/群聊功能,还支持消息高并发量的房间聊天,官网数据显示:单房间人数支持到百万以上,适合对房间人数要求高的场景使用。另外还有很新颖的呼叫邀请功能,满足即时通讯的需求。

6.3我的经验:基于ZIM实现即时通讯功能


应项目需求笔者选用ZIM实现单聊场景消息收发,仅有简单2步整个过程半天搞定。以下以本人的经验分享如何快速实现单聊场景消息收发。集成sdk过程感兴趣的小伙伴到即构官网查看,在此不赘述。

IM 的使用场景中比较常见的是点对点消息,这里我们以安卓端收发文本消息为例。

6.4轻松实现通信消息收发


1)初始化 IM SDK:

获得一个 ZIM 实例:
zim = ZIM.create(appID, application);

2)登录ZIM:

类比微信账号登录的操作,用来作为收发消息的载体:
void login(ZIMUserInfo userInfo,String token,ZIMLoggedInCallback callback)

对应 UI 示例:
如何快速实现APP中的IM即时聊天功能_3.png

3)发送端调用发送单聊文本消息:

登录后便可调用该接口,在 message 填上想要发送的消息,在 toUserID 填上接收端的 userID,想要发送时调用即可。

接口展示:
void sendPeerMessage(ZIMMessage message,String toUserID,ZIMMessageSendConfigconfig,ZIMMessageSentCallback callback)

对应 UI 示例:
如何快速实现APP中的IM即时聊天功能_4.png

4)接收端收消息:

(1) 通过 setEventHandler 注册事件回调的接收对象

IM 运行过程中会有各式各样的事件产生:收到了一条消息、网络连接中断等,通过该接口便可以接收 ZIM 抛出的事件,以便 App 做出相应的反应。
void setEventHandler(ZIMEventHandler handler)

(2) 在注册事件回调的接收对象中重写接收单聊消息的方法
zim.setEventHandler(new ZIMEventHandler() {
    @Override
    public void onReceivePeerMessage(ZIM zim, ArrayList<ZIMMessage> messageList, String fromUserID) {
   
   }
});

对应 UI 示例:
如何快速实现APP中的IM即时聊天功能_5.png

由此我们实现了点对点文本消息的收发。

By the way, ZIM SDK 也支持富媒体消息的收发,包括图片、视频、音频和文件。发送富媒体消息时只需要将文件的 path 传入接口,上传进度可从 progress 回调中获得。这里我就不再赘述,有兴趣大家可以自已去试一试。

5)多样化消息收发:发送富媒体消息
void sendMediaMessage(ZIMMediaMessage message,String toConversationID,ZIMConversationType conversationType,ZIMMessageSendConfigconfig,ZIMMessageSentCallback callback)

UI 示例,以发送图片为例,从相册读取图片并压缩保存到 APP目录下,将本地图片的 path 传入 ZIMImageMessage, 并调用 sendMediaMessage,UI 上做对应展示即可。

如何快速实现APP中的IM即时聊天功能_6.png

一旦点对点消息和群聊消息首次被发送,对应的会话随即产生。

如何快速实现APP中的IM即时聊天功能_7.png

我们知道 UI 的更新都是由数据驱动的。驱动此处 UI 变化的,是 ZIMEventHandler 抛出的会话更新事件回调,应用层只需要维护一份会话列表,在此事件抛出时及时更新列表,并驱动 UI 刷新即可。

会话更新接口:
void onConversationChanged(ZIM zim,ArrayList<ZIMConversationChangeInfo> conversationChangeInfoList)

此外 ZIM SDK 还支持房间、群组的用法,无需去二次封装,绘制相关 UI 并使用 SDK 接口提供的数据驱动即可实现对应功能。此处不再展开叙述,感兴趣的笔者之后会更新相关的文章,或者去 ZEGO 官网去查看相关文档

同时ZIM结合即构自家的RTC SDK实现各类音视频场景的用户互动,适合Avatar , 直播,语聊房等场景的开发者和有需求企业。

在这里帮忙打个小广告:近期有开发规划的开发者可上即构官网查看,恰逢即构七周年全线音视频产品1折的优惠,适合有预算要求的中小型企业和个人开发工作室。

笔者也为大家争取到小福利:扫码添加官方企业微信发送“IM开发资源",获得即构IM1个月免费试用。

如何快速实现APP中的IM即时聊天功能_8.png

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:基于Netty,从零开发IM(二):编码实践篇(单聊功能)下一篇:基于Netty,从零开发IM(三):编码实践篇(群聊功能)
推荐方案
评论 3
好漂亮 的姐姐呀
引用:a835029688 发表于 2022-07-14 09:21
作者真的是漂亮小姐姐吗~

如假包换
作者真的是漂亮小姐姐吗~
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部