开发者分享 | 从零开始开发一个即时通信项目

关于聊天室项目

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

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

若是要本身开发即时通信类的 App,那么必须得要后台,可是如今不少第三方工具已经给咱们集成好了全部须要调用的接口工具。git

好比极光 IMgithub

由于以前用的比较多的是极光的推送服务,也对极光的一些服务和开发文档比较熟悉,因此该项目就是彻底使用极光的 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 基本上都来自阿里巴巴矢量图,感谢相关做者的贡献

做者:wapchief - 极光推送
原文:开发者分享 | 从零开始开发一个即时通信项目
知乎专栏:极光日报

相关文章
相关标签/搜索