V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jpush
V2EX  ›  推广

从零开始开发一个即时通讯项目

  •  
  •   jpush · 2017-09-07 14:59:22 +08:00 · 4485 次点击
    这是一个创建于 2395 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写在前面:本文为极光开发者投稿,分享在开发实践中的经验收获与技术解析。全文约 3000 字,你数一下对不对。

    作者:wapchief (极光社区) - JPush 为极光推送团队账号,欢迎关注

    原文:开发者分享 | 从零开始开发一个即时通讯项目


    关于聊天室项目

    聊天室项目,也被称为即时通讯( IM )。

    其原理是服务器是一直在启动状态的线程,不断的从客户端( App )获取消息,收到消息后,进行类型和发送目标判断,以发送到群组或者单聊的方式,客户端收到消息后进行界面的展示。

    如果要自己开发即时通讯类的 App,那么必须得要后台,但是现在很多第三方工具已经给我们集成好了所有需要调用的接口工具。

    比如极光 IM

    因为之前用的比较多的是极光的推送服务,也对极光的一些服务和开发文档比较熟悉,所以该项目就是完全使用极光的 sdk。

    IM 的应用场景

    IM 应用场景

    • 应用场景一:在线客服、基础文字对话

    应用示例:简书私信、支付宝客服

    介绍:该场景只需要一些基础的聊天功能,直接继承第三方 IM 的优点是不需要后台去实现一大堆东西,前端可以直接根据 极光 IM 文档 去使用定义好的方法,就可以实现相关功能,开发起来非常快。

    • 应用场景二:App 中的聊天功能

    应用示例:脉脉、内涵段子

    介绍:极光 IM SDK 可以满足正常的图片收发、语音消息、表情等基本需求,对此类场景下的即时通讯的开发,也很能加快开发速度。

    • 应用场景三:聊天交友 App

    应用示例:陌陌、微信、QQ 等

    介绍:这类软件是一个完整的即时通讯项目,功能已经不仅仅局限于简单的消息的收发。可以满足一个即时通讯类的绝大部分功能。极光官方提供的有 即时通讯 Demo1,包括 UI 等都实现了,只需要简单配置就可以用。这个项目已经在 GitHub 开源。可以参考开发或者在此基础上做另外的功能开发都会比较方便。

    JPush & JMessage

    极光 Message 整体特性:

    • 消息类型:文字、语音、图片、地理位置、文件、自定义消息等。
    • 聊天方式:单聊、群聊。
    • 平台支持:Android, iOS,Web 多平台互通。
    • 用户维护:注册、登录、头像、用户其他信息。
    • 群组维护:创建群组、加群、退群。
    • 离线消息:可选择是否需要保存离线消息
    • 关系模式:有好友模式和无好友模式
    • 跨应用聊天:不同应用下的用户可相互通信

    我的项目 —— 整体 UI 界面概述

    项目概述

    目前已经实现的功能大致就这么多。所有的聊天都基于登录状态操作,也就是说未登录是不能操作的。

    • 注册和登陆

    两种方式: 注册并登陆或者直接登录。

    如果第一次登录过,就会把账号等资料缓存到本地,再次打开就可以自动登录。

    用户名和密码规范限制长度限制 Byte (4~128) 用户名:以字母或者数字开头。支持字母、数字、下划线、英文点、减号、 @ 。 密码:不限

    • 添加好友

    两种方式:

    手动输入 id,根据 id 查找,并发送好友请求,当另一方同意后会建立好友关系。 或者通过联系人页面>新朋友>推荐好友来添加系统推荐的好友。 这里推荐好友,是由我这里手动设置的三个已经注册完成的号。

    好友通知是本地数据库缓存的消息通知,也就是只有在收到好友请求时,才会把发送过来的请求信息存放到本地。当然如果清空了数据,那就查不到申请记录了。

    • 联系人建立

    这里是根据极光文档建立的好友关系,其实官方提供的说明是 不需要建立好友关系就能会话,但是这里为了项目的一些需要,使用了极光提供的一套联系人接口来操作好友。

    • 更新资料

    修改个人资料,头像相关操作,对好友的备注、黑名单等功能还未开发。

    在第一次注册的时候,在注册成功的情况下会默认自动登陆,并且默认设置个人资料的一些参数。比如头像,昵称等。防止在更新资料的时候部分字段提示空的错误。

    • 设置

    设置会在安装的时候初始化,默认只开启漫游的开关。其他开关需要手动,修改密码也是。

    技术开发路线

    除了对朋友圈的功能,其他都可以借助极光 IM 的 sdk 实现,这一块会放到最后,具体实现方法还未确定。

    技术开发路线

    第一阶段:(已完成)

    注册登录>退出登录>找回密码>聊天窗口

    包括基本的注册登录功能,可以开始正常会话。

    账号是基础,所有的会话都是建立在两个账号之间的通讯,而服务端( JMessage )只是作为两端之间消息传播的桥梁和媒介。

    所以账号是建立两个点的基石。

    第二阶段:(已完成)

    个人资料(头像,昵称,性别等):在原来的基础上给用户添加昵称,头像等属性。

    当这个基础建立起来之后,为了区分各自的不同,如过单靠 id,相信没人知道对方是谁。为了区分需要我们对这个 id 进行 特征设置,这些特征包括头像、昵称、年龄、性别、地域等。

    第三阶段:(已完成)

    好友功能:根据用户名 id,添加好友,更新好友列表。以及其他删除等操作。

    当用户角色属性建立起来之后,就是建立关系,在极光中默认是不需要建立好友关系就可以会话。但是我们前台需要展现给使用方,作为一个标识来区分好友。

    所以这里是要做手动关联好友,既然做了好友系统,那么必不可少的就是申请好友和通过申请。

    第四阶段:(已完成)

    消息操会话操作:消息的发送、接收、展示、删除等

    好友系统建立起来之后,需要开始进行会话,只有创建了会话之后,才会出来聊天窗口。

    注意这里会话和聊天是两个概念。有会话不一定有聊天记录。同样删除了所有的聊天记录,会话窗口还是存在。

    所以还要对消息操作的时候,选择清空消息记录,或者清空并删除会话。

    一个产品的开端一定是一个最主要的基础功能,而这个最基础的功能就是聊天

    第五阶段:

    好友关系的高级操作:好友的删除,备注,黑名单;消息类型。

    在前四个阶段已经可以完成正常的会话,后面的就属于拓展阶段。

    消息多样化是拓展的首选,现在不仅仅满足于文字表情的对话,在此基础上还需要进一步的开发图片、语音、短视频等。

    如果进度比较快的话,还可以把好友添加备注等。

    第六阶段:

    群组、群聊:创建群,加群,搜索群,审核,踢人,拉人等

    群组作为另一个大的功能,作为之前版本稳定,并且大部分功能能完善之后开发的版本。

    而且群组涉及的技术,代码操作,并不比单聊少。所以从时间上来看,放在后面开发也是应该的。

    第七阶段:

    空间、朋友圈的开发

    目前也只有这块需要单独的去开发相应的功能。或者技术上有问题,也可以开发一个类似咨询的界面。

    在这里需要用到分享、加载、刷新等。

    技术框架选择

    由于是个人快速开发,为了提高开发速度和效率,所以在很多地方都是用了第三方框架。 其中用的最多的是极光,不仅仅是依赖于极光即时通讯服务,后期还会引入统计、分享等相关的 sdk。

    即时通讯 IM

    • 极光 JMessage 也是主要的功能,所有的聊天包括好友的对话实现,都是基于极光 JMessage 这个第三方 SDK。这也是整个项目的核心功能。

    推送

    • JPush 同样是使用极光的产品,当然极光最出名的也就是 JPush,是很多开发者的首选推送方案不过后面才知道,集成了 JMessage 之后,就不需要集成推送了,但是两者之前并没有什么冲突,如果后面有新需求的话,需要推送再说吧。

    存储

    主要使用了两种方式:

    • SharedPreferences:一种是本地 SharedPreferences 存储,为了存储一些基本的用户数据,和账号设置等。

    • GreenDao:另外一种是数据库,这里使用 GreenDao 框架,该项目在 GitHub 已经 8000+ 的 star,目前也是个人开发者的首选数据库框架。用来存储一些数据多的,在项目中主要应用的地方是好友请求的存储,和搜索历史的存储。

    • GreenDaoUpgradeHelper:为了方便数据库的升级,还顺便使用了一个数据库升级的辅助类

    网络相关

    • Picasso 使用图片加载由于第三方已经封装过了网络加载,所以这里仅仅需要一个加载图片的方法,当然用 Glide 也是一样的。Picasso 在加载图片的时候需要的参数可以是 File、String、Uri、int。而在图片请求返回的结果也无非是这几种,所以完全可以满足图片加载的需要。

    工具

    • butterknife 快速实例化控件的工具,一键生成并绑定控件,顺便还可以初始化监听方法。

    UI 库

    如果说前面的第三方库是为了减少数据的操作,那么 UI 则是减少界面的复杂性,增加扩展性。增强视觉效果。

    • Recyclerview 替代 ListView 的列表控件,用来展示会话列表、联系人列表、推荐列表、请求列表。

    • RecyclerViewHeader 给 RecyclerView 添加头部的控件

    • PickerView1  用于设置个人资料选择地区、性别、生日的控件

    • CircleImageView 圆形头像控件,在上传头像的时候是方形的,但是加载是圆形的,这里就要用到这个控件了。

    • SwitchButton 一款开关控件,用于设置免打扰、消息漫游、消息通知。

    • FlycoTabLayout 首页切换的控件,又细分为 SlidingTabLayout (多标签)、CommonTabLayout (首页、底部切换)、SegmentTabLayout (分类切换)。在该项目中首页使用 CommonTabLayout,可以添加消息小红点,或者数量。在添加好友或者群的页面使用 SegmentTabLayout 切换。

    • aurora-imui1 该框架是极光开发的一款聊天 UI 视图,分两个部分,一个是聊天的对话列表,另一个是输入的消息类型,现在支持语音、图片、文字、视频。目前对话列表的布局已经支持自定义的 ViewHolder

    后期需要增加的库

    • JShare 极光分享。资讯分享、动态分享、图文分享、链接分享等

    • JAnalytics 极光统计,渠道统计,获取用户数据,分析用户画像的工具。

    • Refresh 下拉刷新 用于动态的刷新和加载。

    • Retrofit 用于做网络请求,请求加载资讯,或者动态。

    总结

    项目已经上线,部分功能还未完善,后期还需要增加群组聊天,资讯等功能。可以持续关注本项目 wapchief/Android-IM3 项目已在 GitHub 开源,欢迎大家提 issue 和 PR。 由于个人也是第一次开发即时通讯类的项目,所以部分逻辑还不够严谨,在使用中可能会多多少少遇到一些问题,如果某些地方有 bug,还望能指正。 需要优化细节的地方还有很多,在有时间的情况下会一一完善。

    2858691-46b70364abafec61.png

    如果想测试聊天效果的话也可以添加 1006 机器人。

    通过联系人-新朋友-好友推荐找到该联系人。如果该账号在线的话可以默认通过好友,并且默认自动回复。目前在线的状态是我这边手动需要登录在线。所以在通过时间上暂且无法保证。

    项目中用的 icon 基本上都来自阿里巴巴矢量图,感谢相关作者的贡献


    欢迎关注知乎专栏:极光日报

    6 条回复    2020-07-14 23:36:46 +08:00
    kofj
        1
    kofj  
       2017-09-07 15:12:13 +08:00
    王思聪白手起家。over.
    qiuai
        2
    qiuai  
       2017-09-07 15:33:33 +08:00
    QQ 410668 有时间的话可以加我一下,有个项目正好需要 IM,可以沟通一下能不能做
    jpush
        3
    jpush  
    OP
       2017-09-11 10:19:03 +08:00
    @qiuai 你好,你可以直接点击进文首的原文链接,与这名开发者直接联系
    brentwu
        4
    brentwu  
       2017-10-23 23:05:34 +08:00
    极光用的是 Japper(XMPP)协议吗
    longwenjunjie
        5
    longwenjunjie  
       2018-10-22 15:00:23 +08:00
    从零开始好难!这里有不少参考资料和免费的 IM 源码: http://www.laolaiso.com/
    FateBlood
        6
    FateBlood  
       2020-07-14 23:36:46 +08:00
    出一套仿微信的即时通讯源码,支持 ios 和 Android 端有需要的联系微信 itshenmalong
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2855 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:12 · PVG 21:12 · LAX 06:12 · JFK 09:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.