第1页
猿题库客户端的技术细节
唐巧
第2页
什么是猿题库
教育
移动 互联⺴⽹网
总⽤用户超过600万
第3页
⼤大纲
• 基于CoreText的排版引擎 • 流量优化 • 特性开关
第4页
基于CoreText的排版引擎
第5页
什么是CoreText
第6页
UIWebView vs CoreText
• 内存 • 精确控制 • 渲染线程 • 交互逻辑
• 复杂度 • 复制粘贴功能
第7页
UBB格式
第8页
⼀一些技术难点
• ⽀支持图⽚片 • ⽀支持链接 • ⽀支持复制粘贴 • ⽀支持互操作
第9页
流量优化
第10页
为什么要做流量优化
• ⾮非wifi情况很多
35%
23%
from http://www.umindex.com/
第11页
为什么要做流量优化
第12页
流量优化的三级⽕火箭
• 缓存题库静态资源 • 缓存题库⾮非静态资源和⽤用户数据 • 实现部分服务器端逻辑
第13页
⼀一、缓存题库静态资源
• 缓存图⽚片 • 缓存公式 • 重要资源内置
第14页
⼆二、缓存题库⾮非静态资源
第15页
⼆二、缓存题库⾮非静态资源
资源更新怎么办?
第16页
⼆二、缓存题库⾮非静态资源
给⾮非静态资源设置⼀一个缓存有效期
第17页
⼆二、缓存题库⾮非静态资源
资源版本号
第18页
资源版本号
• 在每次请求的Http返回的头中,带上资源的版本号 • 当发现资源版本号变化时,有两类做法:
• 版本号加载原则:获得资源改动的列表,丢弃指 定的资源
• 版本号丢弃原则:丢弃缓存
第19页
客户端 version = 1,缓存了4道题⺫⽬目:
101,201,301,401
时 间 线 任意⼀一次⺴⽹网络请求时,
发现版本号变化
请求版本号1与3之间的改动
删除201和301缓存,留下 101, 401 version = 3
服务器
version = 1 version = 2 修改了201和501题的内容 version =3 修改了201和301题的内容
1与3之间的改动为: 201,301,501
第20页
注意事项
• 版本更新需要保证原⼦子性 • 服务器资源更新需要做到多个服务器同时切换 • 客户端更新缓存时,需要等之前的请求结束
• 更新列表太⼤大怎么办? • 没有⺴⽹网络请求获得新版本号怎么办?
第21页
策略列表
资源 题⺫⽬目、解析 推荐列表,真题列表 专项练习 ⾸首⻚页功能列表
版本号原则 加载原则 丢弃原则 丢弃原则 丢弃原则
第22页
缓存⽤用户数据
资源 错题本 收藏本 练习历史 笔记本
版本号原则 丢弃原则 丢弃原则 丢弃原则 丢弃原则
第23页
三、实现部分服务器端逻辑
错题本 version =1 练习历史 version =1
交卷
错题本 version =2 练习历史 version =2
第24页
客户端
练习历史 version=1 错题本version = 1
服务器
练习历史 version=1 错题本version = 1
⽤用户交卷
时 间
⽤用户交卷
更新练习历史 version = 2 更新错题本 version = 2
线 更新练习历史数据
更新错题本数据
发现 verson变化,丢弃 练习历史和错题本缓存
第25页
三、实现部分服务器端逻辑
如何我们能预⻅见到交卷操作会造成版本号变化, 为什么不⾃自⼰己在本地更新数据呢?
第26页
客户端
练习历史 version=1 错题本version = 1
⽤用户交卷
时 间
更新练习历史 version = 2 更新错题本 version = 2
线 更新练习历史数据
更新错题本数据
服务器
练习历史 version=1 错题本version = 1
⽤用户交卷
更新练习历史 version = 2 更新错题本 version = 2
更新练习历史数据 更新错题本数据
发现 version与服务器⼀一致
第27页
三、实现部分服务器端逻辑
功能模块 错题/收藏/笔记列表
练习历史 个⼈人设置
本地维护版本号和数据
第28页
⼀一些问题
• 同⼀一帐号在多终端同时使⽤用怎么办? • 版本号丢弃原则
第29页
特性开关
第30页
特性开关
⼀一套基于版本号的远程控制逻辑
第31页
特性开关的⽤用处:AB测试
第32页
特性开关的⽤用处:灰度发布
第33页
特性开关的⽤用处
远程开启/关闭功能模块
第34页
特性开关的⽤用处
配置应⽤用的各种参数
第35页
特性开关的⽤用处
传递⼀一些远程执⾏行的脚本
第36页
实现-服务器端
• ⽤用什么当版本号?— 时间。 • 版本号切换的原⼦子性。
第37页
实现-客户端
• 实现了⼀一套基于版本号缓存的iOS⺴⽹网络库 • 基于AFNetworking
第38页
当客户端要发送请求时
Agent
• 根据当前请求的URL,参数,计算出缓 存⽂文件名 cacheName
• 尝试获得该缓存⽂文件的内容,以及缓存 的时间
• 如果缓存⽂文件存在,并且没过期,则返 回缓存⽂文件内容,否则才发送⺴⽹网络请求
• 将⺴⽹网络请求返回值缓存
第39页
实现-客户端
https://github.com/yuantiku/YTKNetwork
第40页
YTKNetwork功能列表⼀一
• ⽀支持按时间缓存⺴⽹网络请求内容 • ⽀支持按版本号缓存⺴⽹网络请求内容 • ⽀支持统⼀一设置服务器和CDN的地址 • ⽀支持检查返回JSON内容的合法性 • ⽀支持⽂文件的断点续传
第41页
YTKNetwork功能列表⼆二
• ⽀支持block和delegate两种模式的回调⽅方式
• ⽀支持批量的⺴⽹网络请求发送,并统⼀一设置它们的回调
• ⽀支持⽅方便地设置有相互依赖的⺴⽹网络请求的发送
• ⽀支持⺴⽹网络请求URL的filter,可以统⼀一为⺴⽹网络请求加上⼀一些 参数,或者修改⼀一些路径。
• 定义了⼀一套插件接⼝口,可以很⽅方便地为YTKRequest增加 功能。
第42页
谢谢
微博:@唐巧_boy
我的“iOS开发”微信公众号: