QQ架構分析
產品定位
定位移動社交,並將娛樂與生活服務相結合.
整體架構模組分析
QQ主要分為登入註冊,訊息,聊天,聯絡人,動態,側邊欄,設定等幾大模組.其中訊息模組和聊天模組是核心模組.好友動態及聯絡人屬於次核心模組,延續了PC端的介面結構.
整體模組結構如下圖所示:
整體通過模組化設計,資料和UI分離.包含訊息,聊天等主要聊天功能的介面封裝為獨立Target.
通過長連線的方式,當有訊息進來或傳送訊息的時候,進行相應UI更新.
為增強使用者體驗,訊息,聊天,聯絡人,動態,側邊欄等都採用Native的開發方式,結合熱更新技術對UI進行動態調整.
遊戲,會員,裝扮等個性化內容由於變幻多樣,無法使用Native的方式"一勞永逸",故採用的是H5的方式.一般H5頁面會犧牲部分使用者體驗,但QQ通過其強大的服務端支援,H5頁面也能達到原生的流暢效果.
核心模組分析
登入註冊以及主介面訊息模組
登入問題需要考慮到以下幾點:
- 被迫下線問題:如果線上狀態下,其他裝置登入,會及時傳送當前裝置下線通知,介面通過UIWindow展示通知Alert,不允許使用者進行非登入操作. 啟動App時會進行免登操作,這時和後臺進行互動,如果有被擠下線,提示登入,否則進行免登處理.
- 是否允許電腦端和手機端同時線上問題:後臺儲存登入當前裝置的資訊,比如裝置名稱,型號等.如果設定允許電腦手機同時線上,後臺將對手機和電腦同時提供服務支援,被迫下線問題將被區分單獨處理.而如果不允許同時線上,那麼被迫下線問題會把電腦,手機視為一體混同處理.
訊息模組
訊息模組的訊息型別繁多複雜.
訊息型別包括普通訊息,群訊息和系統訊息.普通訊息僅處理一對一聊天的情況,群訊息處理群聊天情形.系統訊息則根據使用者自定義進行個性化推送.
- 訊息型別處理:
邏輯處理放在後臺,客戶端只管拉取資料.介面給到訊息型別,客戶端通過多個CellID進行不同訊息型別處理- 活動,比如搶紅包:
後臺傳送搶紅包通知,介面通過TabeleHeaderView進行活動展示,並修改下拉重新整理功能,下拉重新整理不再對當前訊息介面進行重新整理,而是對圍繞紅包彈幕進行功能改造.- 置頂問題:
QQ的置頂功能是資訊儲存在本地.將置頂的這一條資料儲存到資料庫,再次請求資料時將資料與資料庫的進行對比,發現相同的就置頂 .這裡應對資料結構進行模型和功能劃分,使得置頂邏輯清晰易懂,否則後續涉及到和其他業務邏輯的對撞很容易讓程式碼雜亂無章.
聊天模組
首先看看聊天中的多種訊息型別:
具體如下所示:
聊天介面主要是針對多種型別訊息的UI處理.各種訊息型別組成一個獨立的程式碼模組,這個模組對每種訊息型別提供服務支援.
語音資訊和圖片資訊涉及本地快取,將語音的ID或圖片的名稱以及語音(圖片)內容進行壓縮處理並分別作為key和value進行本地化儲存.其他資訊進行資料庫加密快取起來.
時間處理方面,傳送訊息時間通過毫秒處理,並將傳送時間一同發給伺服器,伺服器以傳送的時間為準進行排序,而不以接收到訊息時間為準.這樣避免多個訊息出現順序錯亂的現象.
聊天傳送訊息皮膚功能
這裡每個皮膚功能都是對相關程式碼的高度封裝.通過一個模組將這些功能做成"元件",通過工廠化模式進行對應呼叫.
-
語音
這裡通過AVFoundation
封裝一個語音模組,並新增長按手勢,對不同手勢資訊進行傳送,取消處理.同時,進行語音本地化儲存. -
圖片傳送
這裡選擇圖片部分使用一個橫向的UITableView
,並且監聽系統圖片的變化情況,當系統圖片增加時(比如這個時候截圖),對TableView
進行重新整理. -
戳一戳
本質是動態圖片,當傳送後,將動態圖片展示到聊天框中,並相對應展示全屏效果.動態圖片的處理可以使用SDWebImage
裡關於動態圖片的功能,或者自己程式碼進行實現.
在本地化過程中,將這些資訊通過key的方式儲存在資料庫中,在展示聊天訊息列表的時候,進行替換操作. -
動態圖
動態圖經由網路線上展示,使用UICollectionView
,使用SDWebImage
對圖片進行下載並展示.傳送時,和戳一戳進行類似處理,不過不會進行全屏效果展示. -
表情
騰訊對錶情的封裝早有見識,他把每個表情轉化成Unicode編碼的形式,在傳送的時候使用對應編碼傳送.而在展示的時候,通過富文字的形式展示.
給一個表情鍵盤的例子: YHExpressionKeyBoard
另外,BBS
裡也有相關表情的處理. -
其他功能
這些按鈕控制元件都對應一個獨立功能,此處不再贅述.
對效能優方面的思考
QQ軟體龐大,如果不進行新能優化,使用體驗將大大下降,無以支撐騰訊龐大的使用者訴求.
- 網路請求使用
NSURLSession
,而不是使用NSURLConnection
,使用HTTP 2.0,提高請求速度. -
UITableView
高度提前計算並做快取處理,cell
通過Frame或者FlexBox
方式進行設計,避免使用Masonry
或者NSLayoutConstraint
. - 伺服器傳過來的圖片在伺服器端進行相關裁剪處理,避免圖片過大影響效能.
- 純程式碼,不要使用
Xib
或storeBoard
- 用
ARC
管理記憶體 - 重用和延遲載入
views
啟動速斷效能優化
1.main()
函式之前的優化
- 刪除無用的類,減少沒有呼叫的
# import
- 減少無用的
category
- 減少不必要的
Framework
,特別是非系統的 -
check framework設為
optional和
required,如果該
framework在當前
App支援的所有
iOS系統版本都存在,那麼就設為
required,否則就設為
optional,因為
optional`會有些額外的檢查. - 刪除無用的靜態變數
- 將不必須在+load方法中做的事情延遲到+initialize中
2.main()
函式之後的優化
- 刪除啟動時各業務方打的log(因為每次用
NSLog
方式列印會隱式的建立一個Calendar
) - 梳理應用啟動時傳送的所有網路請求,是否可以統一在非同步執行緒請求
- 不使用
XIB
-
didFinishLaunching
裡的非必要程式碼進行延時載入或懶載入.
相關文章
- 【架構分析】MESA (EGL/GLES)架構分析架構
- SaaS架構:流程架構分析架構
- sqoop 架構分析OOP架構
- hbase 的架構分析架構
- MySQL基礎架構分析MySql架構
- thrift原始碼分析-架構設計原始碼架構
- LNMP架構下的程式模型分析LNMP架構模型
- MySQL高可用架構設計分析MySql架構
- 今日頭條技術架構分析架構
- tomcat架構分析及配置詳解Tomcat架構
- MQ系列9:高可用架構分析MQ架構
- 美顏SDK架構技術分析架構
- Flutter框架分析(一)--架構總覽Flutter框架架構
- HongHu雲架構common-service程式碼結構分析架構
- jQuery原始碼分析系列 : 整體架構jQuery原始碼架構
- 乾貨:軟體架構分析詳解架構
- Twitter推薦引擎架構設計分析架構
- Kubernetes 下零信任安全架構分析架構
- SaaS業務架構:業務能力分析架構
- ==[圖]Spark系列(四)整體架構分析Spark架構
- RPC框架整體架構設計分析RPC框架架構
- Oracle多租戶架構優勢分析Oracle架構
- hadoop 原始碼分析HDFS架構演進Hadoop原始碼架構
- NVIDIA安培架構下MIG技術分析架構
- 微服務架構學習與思考(05):微服務架構適用場景分析微服務架構
- 深入Weex系列(八)之Weex SDK架構分析架構
- 以 RAIDs 分析作為架構驅動力AI架構
- 分析阿里前端-自動化架構思路-react阿里前端架構React
- 精講Redis服務架構分析與搭建Redis架構
- NUMA架構介紹及優缺點分析架構
- ET框架6.0分析一、ECS架構框架架構
- 從劇情架構角度分析《妄想破綻》架構
- 精盡 MyBatis 原始碼分析 - 整體架構MyBatis原始碼架構
- Spring security (一)架構框架-Component、Service、Filter分析Spring架構框架Filter
- 原始碼分析三:OkHttp(1)—總體架構原始碼HTTP架構
- 雲原生架構實施路線圖分析架構
- 架構與思維:分散式鎖方案分析架構分散式
- 分散式搜尋引擎Elasticsearch的架構分析分散式Elasticsearch架構
- (六)整合spring cloud雲服務架構 - 企業雲架構common-service程式碼結構分析SpringCloud架構