QQ架構(gòu)分析

產(chǎn)品定位

定位移動(dòng)社交,并將娛樂(lè)與生活服務(wù)相結(jié)合.

整體架構(gòu)模塊分析

QQ主要分為登錄注冊(cè),消息,聊天,聯(lián)系人,動(dòng)態(tài),側(cè)邊欄,設(shè)置等幾大模塊.其中消息模塊和聊天模塊是核心模塊.好友動(dòng)態(tài)及聯(lián)系人屬于次核心模塊,延續(xù)了PC端的界面結(jié)構(gòu).

整體模塊結(jié)構(gòu)如下圖所示:


整體通過(guò)模塊化設(shè)計(jì),數(shù)據(jù)和UI分離.包含消息,聊天等主要聊天功能的接口封裝為獨(dú)立Target.
通過(guò)長(zhǎng)連接的方式,當(dāng)有消息進(jìn)來(lái)或發(fā)送消息的時(shí)候,進(jìn)行相應(yīng)UI更新.

為增強(qiáng)用戶體驗(yàn),消息,聊天,聯(lián)系人,動(dòng)態(tài),側(cè)邊欄等都采用Native的開(kāi)發(fā)方式,結(jié)合熱更新技術(shù)對(duì)UI進(jìn)行動(dòng)態(tài)調(diào)整.
游戲,會(huì)員,裝扮等個(gè)性化內(nèi)容由于變幻多樣,無(wú)法使用Native的方式"一勞永逸",故采用的是H5的方式.一般H5頁(yè)面會(huì)犧牲部分用戶體驗(yàn),但QQ通過(guò)其強(qiáng)大的服務(wù)端支持,H5頁(yè)面也能達(dá)到原生的流暢效果.

核心模塊分析

登錄注冊(cè)以及主界面消息模塊
登錄問(wèn)題需要考慮到以下幾點(diǎn):
  1. 被迫下線問(wèn)題:如果在線狀態(tài)下,其他設(shè)備登錄,會(huì)及時(shí)發(fā)送當(dāng)前設(shè)備下線通知,界面通過(guò)UIWindow展示通知Alert,不允許用戶進(jìn)行非登錄操作. 啟動(dòng)App時(shí)會(huì)進(jìn)行免登操作,這時(shí)和后臺(tái)進(jìn)行交互,如果有被擠下線,提示登錄,否則進(jìn)行免登處理.
  2. 是否允許電腦端和手機(jī)端同時(shí)在線問(wèn)題:后臺(tái)存儲(chǔ)登錄當(dāng)前設(shè)備的信息,比如設(shè)備名稱,型號(hào)等.如果設(shè)置允許電腦手機(jī)同時(shí)在線,后臺(tái)將對(duì)手機(jī)和電腦同時(shí)提供服務(wù)支持,被迫下線問(wèn)題將被區(qū)分單獨(dú)處理.而如果不允許同時(shí)在線,那么被迫下線問(wèn)題會(huì)把電腦,手機(jī)視為一體混同處理.
消息模塊

消息模塊的消息類型繁多復(fù)雜.
消息類型包括普通消息,群消息和系統(tǒng)消息.普通消息僅處理一對(duì)一聊天的情況,群消息處理群聊天情形.系統(tǒng)消息則根據(jù)用戶自定義進(jìn)行個(gè)性化推送.


  1. 消息類型處理:
    邏輯處理放在后臺(tái),客戶端只管拉取數(shù)據(jù).接口給到消息類型,客戶端通過(guò)多個(gè)CellID進(jìn)行不同消息類型處理
  2. 活動(dòng),比如搶紅包:
    后臺(tái)發(fā)送搶紅包通知,界面通過(guò)TabeleHeaderView進(jìn)行活動(dòng)展示,并修改下拉刷新功能,下拉刷新不再對(duì)當(dāng)前消息界面進(jìn)行刷新,而是對(duì)圍繞紅包彈幕進(jìn)行功能改造.
  3. 置頂問(wèn)題:
    QQ的置頂功能是信息存儲(chǔ)在本地.將置頂?shù)倪@一條數(shù)據(jù)保存到數(shù)據(jù)庫(kù)寥枝,再次請(qǐng)求數(shù)據(jù)時(shí)將數(shù)據(jù)與數(shù)據(jù)庫(kù)的進(jìn)行對(duì)比晒夹,發(fā)現(xiàn)相同的就置頂 .這里應(yīng)對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行模型和功能劃分,使得置頂邏輯清晰易懂,否則后續(xù)涉及到和其他業(yè)務(wù)邏輯的對(duì)撞很容易讓代碼雜亂無(wú)章.
聊天模塊

首先看看聊天中的多種消息類型:


具體如下所示:


聊天界面主要是針對(duì)多種類型消息的UI處理.各種消息類型組成一個(gè)獨(dú)立的代碼模塊,這個(gè)模塊對(duì)每種消息類型提供服務(wù)支持.

語(yǔ)音信息和圖片信息涉及本地緩存,將語(yǔ)音的ID或圖片的名稱以及語(yǔ)音(圖片)內(nèi)容進(jìn)行壓縮處理并分別作為key和value進(jìn)行本地化存儲(chǔ).其他信息進(jìn)行數(shù)據(jù)庫(kù)加密緩存起來(lái).

時(shí)間處理方面,發(fā)送消息時(shí)間通過(guò)毫秒處理,并將發(fā)送時(shí)間一同發(fā)給服務(wù)器,服務(wù)器以發(fā)送的時(shí)間為準(zhǔn)進(jìn)行排序,而不以接收到消息時(shí)間為準(zhǔn).這樣避免多個(gè)消息出現(xiàn)順序錯(cuò)亂的現(xiàn)象.

聊天發(fā)送消息面板功能

這里每個(gè)面板功能都是對(duì)相關(guān)代碼的高度封裝.通過(guò)一個(gè)模塊將這些功能做成"元件",通過(guò)工廠化模式進(jìn)行對(duì)應(yīng)調(diào)用.

  • 語(yǔ)音


    這里通過(guò)AVFoundation封裝一個(gè)語(yǔ)音模塊,并添加長(zhǎng)按手勢(shì),對(duì)不同手勢(shì)信息進(jìn)行發(fā)送,取消處理.同時(shí),進(jìn)行語(yǔ)音本地化存儲(chǔ).

  • 圖片發(fā)送


    這里選擇圖片部分使用一個(gè)橫向的UITableView,并且監(jiān)聽(tīng)系統(tǒng)圖片的變化情況,當(dāng)系統(tǒng)圖片增加時(shí)(比如這個(gè)時(shí)候截圖),對(duì)TableView進(jìn)行刷新.

  • 戳一戳


    本質(zhì)是動(dòng)態(tài)圖片,當(dāng)發(fā)送后,將動(dòng)態(tài)圖片展示到聊天框中,并相對(duì)應(yīng)展示全屏效果.動(dòng)態(tài)圖片的處理可以使用SDWebImage里關(guān)于動(dòng)態(tài)圖片的功能,或者自己代碼進(jìn)行實(shí)現(xiàn).
    在本地化過(guò)程中,將這些信息通過(guò)key的方式存儲(chǔ)在數(shù)據(jù)庫(kù)中,在展示聊天消息列表的時(shí)候,進(jìn)行替換操作.

  • 動(dòng)態(tài)圖


    動(dòng)態(tài)圖經(jīng)由網(wǎng)絡(luò)在線展示,使用UICollectionView,使用SDWebImage對(duì)圖片進(jìn)行下載并展示.發(fā)送時(shí),和戳一戳進(jìn)行類似處理,不過(guò)不會(huì)進(jìn)行全屏效果展示.

  • 表情


    騰訊對(duì)表情的封裝早有見(jiàn)識(shí),他把每個(gè)表情轉(zhuǎn)化成Unicode編碼的形式,在發(fā)送的時(shí)候使用對(duì)應(yīng)編碼發(fā)送.而在展示的時(shí)候,通過(guò)富文本的形式展示.
    給一個(gè)表情鍵盤(pán)的例子: YHExpressionKeyBoard
    另外,BBS里也有相關(guān)表情的處理.

  • 其他功能



    這些按鈕控件都對(duì)應(yīng)一個(gè)獨(dú)立功能,此處不再贅述.

對(duì)性能優(yōu)方面的思考

QQ軟件龐大,如果不進(jìn)行新能優(yōu)化,使用體驗(yàn)將大大下降,無(wú)以支撐騰訊龐大的用戶訴求.

  • 網(wǎng)絡(luò)請(qǐng)求使用NSURLSession,而不是使用NSURLConnection,使用HTTP 2.0,提高請(qǐng)求速度.
  • UITableView高度提前計(jì)算并做緩存處理,cell通過(guò)Frame或者FlexBox方式進(jìn)行設(shè)計(jì),避免使用Masonry或者NSLayoutConstraint.
  • 服務(wù)器傳過(guò)來(lái)的圖片在服務(wù)器端進(jìn)行相關(guān)裁剪處理,避免圖片過(guò)大影響性能.
  • 純代碼,不要使用XibstoreBoard
  • ARC管理內(nèi)存
  • 重用和延遲加載views

啟動(dòng)速斷性能優(yōu)化

1.main()函數(shù)之前的優(yōu)化
  • 刪除無(wú)用的類,減少?zèng)]有調(diào)用的# import
  • 減少無(wú)用的category
  • 減少不必要的Framework,特別是非系統(tǒng)的
  • check framework設(shè)為optionalrequired仔沿,如果該framework在當(dāng)前App支持的所有iOS系統(tǒng)版本都存在信峻,那么就設(shè)為required抄囚,否則就設(shè)為optional洽蛀,因?yàn)?/code>optional`會(huì)有些額外的檢查.
  • 刪除無(wú)用的靜態(tài)變量
  • 將不必須在+load方法中做的事情延遲到+initialize中
2.main()函數(shù)之后的優(yōu)化
  • 刪除啟動(dòng)時(shí)各業(yè)務(wù)方打的log(因?yàn)槊看斡?code>NSLog方式打印會(huì)隱式的創(chuàng)建一個(gè)Calendar)
  • 梳理應(yīng)用啟動(dòng)時(shí)發(fā)送的所有網(wǎng)絡(luò)請(qǐng)求王污,是否可以統(tǒng)一在異步線程請(qǐng)求
  • 不使用XIB
  • didFinishLaunching里的非必要代碼進(jìn)行延時(shí)加載或懶加載.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末描滔,一起剝皮案震驚了整個(gè)濱河市重抖,隨后出現(xiàn)的幾起案子露氮,更是在濱河造成了極大的恐慌,老刑警劉巖钟沛,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畔规,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恨统,警方通過(guò)查閱死者的電腦和手機(jī)叁扫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)畜埋,“玉大人莫绣,你說(shuō)我怎么就攤上這事∮瓢埃” “怎么了对室?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)咖祭。 經(jīng)常有香客問(wèn)我掩宜,道長(zhǎng),這世上最難降的妖魔是什么么翰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任牺汤,我火速辦了婚禮,結(jié)果婚禮上浩嫌,老公的妹妹穿的比我還像新娘檐迟。我一直安慰自己,他們只是感情好码耐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布追迟。 她就那樣靜靜地躺著,像睡著了一般伐坏。 火紅的嫁衣襯著肌膚如雪怔匣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音每瞒,去河邊找鬼金闽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剿骨,可吹牛的內(nèi)容都是我干的代芜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浓利,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挤庇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起贷掖,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嫡秕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后苹威,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昆咽,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年牙甫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掷酗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窟哺,死狀恐怖泻轰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情且轨,我是刑警寧澤浮声,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站殖告,受9級(jí)特大地震影響阿蝶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜黄绩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玷过。 院中可真熱鬧爽丹,春花似錦、人聲如沸辛蚊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袋马。三九已至初澎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碑宴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工软啼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人延柠。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓祸挪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贞间。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贿条,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,729評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)增热,斷路器整以,智...
    卡卡羅2017閱讀 134,626評(píng)論 18 139
  • 走出來(lái) 在日新月異的今天,井底之蛙的我感到身體有了盛年略衰的征兆峻仇,倒還靈活受用悄蕾。 我于...
    lovingyourself閱讀 228評(píng)論 0 1
  • 昨天的擁抱 今天也需要 你給我的好 戒也戒不掉 哭濕枕頭套 夜晚的煎熬 你的城堡 我住在地牢 。
    Dedivin閱讀 217評(píng)論 0 0
  • 陳偉霆础浮,一個(gè)帥氣的男人
    Willam偉霆閱讀 264評(píng)論 0 0