QQ架構分析

weixin_34019929發表於2018-02-28

產品定位

定位移動社交,並將娛樂與生活服務相結合.

整體架構模組分析

QQ主要分為登入註冊,訊息,聊天,聯絡人,動態,側邊欄,設定等幾大模組.其中訊息模組和聊天模組是核心模組.好友動態及聯絡人屬於次核心模組,延續了PC端的介面結構.

整體模組結構如下圖所示:


3101550-f3d27b5a2b32f7a7.png

整體通過模組化設計,資料和UI分離.包含訊息,聊天等主要聊天功能的介面封裝為獨立Target.
通過長連線的方式,當有訊息進來或傳送訊息的時候,進行相應UI更新.

為增強使用者體驗,訊息,聊天,聯絡人,動態,側邊欄等都採用Native的開發方式,結合熱更新技術對UI進行動態調整.
遊戲,會員,裝扮等個性化內容由於變幻多樣,無法使用Native的方式"一勞永逸",故採用的是H5的方式.一般H5頁面會犧牲部分使用者體驗,但QQ通過其強大的服務端支援,H5頁面也能達到原生的流暢效果.

核心模組分析

登入註冊以及主介面訊息模組
3101550-761abd228d66faec.png
登入問題需要考慮到以下幾點:
  1. 被迫下線問題:如果線上狀態下,其他裝置登入,會及時傳送當前裝置下線通知,介面通過UIWindow展示通知Alert,不允許使用者進行非登入操作. 啟動App時會進行免登操作,這時和後臺進行互動,如果有被擠下線,提示登入,否則進行免登處理.
  2. 是否允許電腦端和手機端同時線上問題:後臺儲存登入當前裝置的資訊,比如裝置名稱,型號等.如果設定允許電腦手機同時線上,後臺將對手機和電腦同時提供服務支援,被迫下線問題將被區分單獨處理.而如果不允許同時線上,那麼被迫下線問題會把電腦,手機視為一體混同處理.
訊息模組

訊息模組的訊息型別繁多複雜.
訊息型別包括普通訊息,群訊息和系統訊息.普通訊息僅處理一對一聊天的情況,群訊息處理群聊天情形.系統訊息則根據使用者自定義進行個性化推送.


3101550-67b6da9792ac0935.png
3101550-56d6a4e4d5d4706e.png
  1. 訊息型別處理:
    邏輯處理放在後臺,客戶端只管拉取資料.介面給到訊息型別,客戶端通過多個CellID進行不同訊息型別處理
  2. 活動,比如搶紅包:
    後臺傳送搶紅包通知,介面通過TabeleHeaderView進行活動展示,並修改下拉重新整理功能,下拉重新整理不再對當前訊息介面進行重新整理,而是對圍繞紅包彈幕進行功能改造.
  3. 置頂問題:
    QQ的置頂功能是資訊儲存在本地.將置頂的這一條資料儲存到資料庫,再次請求資料時將資料與資料庫的進行對比,發現相同的就置頂 .這裡應對資料結構進行模型和功能劃分,使得置頂邏輯清晰易懂,否則後續涉及到和其他業務邏輯的對撞很容易讓程式碼雜亂無章.
聊天模組

首先看看聊天中的多種訊息型別:


3101550-9e4c76c8726f89f1.png

具體如下所示:


3101550-c767b4f33d228c48.png
3101550-bd4b287263df2a51.png

聊天介面主要是針對多種型別訊息的UI處理.各種訊息型別組成一個獨立的程式碼模組,這個模組對每種訊息型別提供服務支援.

語音資訊和圖片資訊涉及本地快取,將語音的ID或圖片的名稱以及語音(圖片)內容進行壓縮處理並分別作為key和value進行本地化儲存.其他資訊進行資料庫加密快取起來.

時間處理方面,傳送訊息時間通過毫秒處理,並將傳送時間一同發給伺服器,伺服器以傳送的時間為準進行排序,而不以接收到訊息時間為準.這樣避免多個訊息出現順序錯亂的現象.

聊天傳送訊息皮膚功能
3101550-66585e1153f45d8a.png

這裡每個皮膚功能都是對相關程式碼的高度封裝.通過一個模組將這些功能做成"元件",通過工廠化模式進行對應呼叫.

  • 語音

    3101550-ac7b5276136c4324.png

    這裡通過AVFoundation封裝一個語音模組,並新增長按手勢,對不同手勢資訊進行傳送,取消處理.同時,進行語音本地化儲存.

  • 圖片傳送

    3101550-028421825123cc7f.png

    這裡選擇圖片部分使用一個橫向的UITableView,並且監聽系統圖片的變化情況,當系統圖片增加時(比如這個時候截圖),對TableView進行重新整理.

  • 戳一戳

    3101550-b892b46ec2df3de8.png

    本質是動態圖片,當傳送後,將動態圖片展示到聊天框中,並相對應展示全屏效果.動態圖片的處理可以使用SDWebImage裡關於動態圖片的功能,或者自己程式碼進行實現.
    在本地化過程中,將這些資訊通過key的方式儲存在資料庫中,在展示聊天訊息列表的時候,進行替換操作.

  • 動態圖

    3101550-7fc912ea11447386.png

    動態圖經由網路線上展示,使用UICollectionView,使用SDWebImage對圖片進行下載並展示.傳送時,和戳一戳進行類似處理,不過不會進行全屏效果展示.

  • 表情

    3101550-c5c11a99c1e13b62.png

    騰訊對錶情的封裝早有見識,他把每個表情轉化成Unicode編碼的形式,在傳送的時候使用對應編碼傳送.而在展示的時候,通過富文字的形式展示.
    給一個表情鍵盤的例子: YHExpressionKeyBoard
    另外,BBS裡也有相關表情的處理.

  • 其他功能


    3101550-e0b9ac724bdde503.png

    這些按鈕控制元件都對應一個獨立功能,此處不再贅述.

對效能優方面的思考

QQ軟體龐大,如果不進行新能優化,使用體驗將大大下降,無以支撐騰訊龐大的使用者訴求.

  • 網路請求使用NSURLSession,而不是使用NSURLConnection,使用HTTP 2.0,提高請求速度.
  • UITableView高度提前計算並做快取處理,cell通過Frame或者FlexBox方式進行設計,避免使用Masonry或者NSLayoutConstraint.
  • 伺服器傳過來的圖片在伺服器端進行相關裁剪處理,避免圖片過大影響效能.
  • 純程式碼,不要使用XibstoreBoard
  • ARC管理記憶體
  • 重用和延遲載入views

啟動速斷效能優化

1.main()函式之前的優化
  • 刪除無用的類,減少沒有呼叫的# import
  • 減少無用的category
  • 減少不必要的Framework,特別是非系統的
  • check framework設為optionalrequired,如果該framework在當前App支援的所有iOS系統版本都存在,那麼就設為required,否則就設為optional,因為optional`會有些額外的檢查.
  • 刪除無用的靜態變數
  • 將不必須在+load方法中做的事情延遲到+initialize中
2.main()函式之後的優化
  • 刪除啟動時各業務方打的log(因為每次用NSLog方式列印會隱式的建立一個Calendar)
  • 梳理應用啟動時傳送的所有網路請求,是否可以統一在非同步執行緒請求
  • 不使用XIB
  • didFinishLaunching裡的非必要程式碼進行延時載入或懶載入.

相關文章