QQ架构分析

产品定位

定位移动社交,并将娱乐与生活服务相结合.

整体架构模块分析

QQ主要分为登录注册,消息,聊天,联系人,动态,侧边栏,设置等几大模块.其中消息模块和聊天模块是核心模块.好友动态及联系人属于次核心模块,延续了PC端的界面结构.

整体模块结构如下图所示:


整体通过模块化设计,数据和UI分离.包含消息,聊天等主要聊天功能的接口封装为独立Target.
通过长连接的方式,当有消息进来或发送消息的时候,进行相应UI更新.

为增强用户体验,消息,聊天,联系人,动态,侧边栏等都采用Native的开发方式,结合热更新技术对UI进行动态调整.
游戏,会员,装扮等个性化内容由于变幻多样,无法使用Native的方式"一劳永逸",故采用的是H5的方式.一般H5页面会牺牲部分用户体验,但QQ通过其强大的服务端支持,H5页面也能达到原生的流畅效果.

核心模块分析

登录注册以及主界面消息模块
登录问题需要考虑到以下几点:
  1. 被迫下线问题:如果在线状态下,其他设备登录,会及时发送当前设备下线通知,界面通过UIWindow展示通知Alert,不允许用户进行非登录操作. 启动App时会进行免登操作,这时和后台进行交互,如果有被挤下线,提示登录,否则进行免登处理.
  2. 是否允许电脑端和手机端同时在线问题:后台存储登录当前设备的信息,比如设备名称,型号等.如果设置允许电脑手机同时在线,后台将对手机和电脑同时提供服务支持,被迫下线问题将被区分单独处理.而如果不允许同时在线,那么被迫下线问题会把电脑,手机视为一体混同处理.
消息模块

消息模块的消息类型繁多复杂.
消息类型包括普通消息,群消息和系统消息.普通消息仅处理一对一聊天的情况,群消息处理群聊天情形.系统消息则根据用户自定义进行个性化推送.


  1. 消息类型处理:
    逻辑处理放在后台,客户端只管拉取数据.接口给到消息类型,客户端通过多个CellID进行不同消息类型处理
  2. 活动,比如抢红包:
    后台发送抢红包通知,界面通过TabeleHeaderView进行活动展示,并修改下拉刷新功能,下拉刷新不再对当前消息界面进行刷新,而是对围绕红包弹幕进行功能改造.
  3. 置顶问题:
    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.
  • 服务器传过来的图片在服务器端进行相关裁剪处理,避免图片过大影响性能.
  • 纯代码,不要使用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里的非必要代码进行延时加载或懒加载.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,279评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 走出来 在日新月异的今天,井底之蛙的我感到身体有了盛年略衰的征兆,倒还灵活受用。 我于...
    lovingyourself阅读 221评论 0 1
  • 昨天的拥抱 今天也需要 你给我的好 戒也戒不掉 哭湿枕头套 夜晚的煎熬 你的城堡 我住在地牢 。
    Dedivin阅读 216评论 0 0
  • 陈伟霆,一个帅气的男人
    Willam伟霆阅读 264评论 0 0