開發者分享 | 從零開始開發一個即時通信項目

關於聊天室項目

聊天室項目,也被稱爲即時通信(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 - 極光推送
原文:開發者分享 | 從零開始開發一個即時通信項目
知乎專欄:極光日報

相關文章
相關標籤/搜索