唐巧——猿题库客户端的技术细节

分享猿题库在开发中,从技术角度演化出来多一些值得分享的技术实现细节,包括:富文本排版引擎、流量节省、特性开关。 1. 富文本排版引擎是基于CoreText实现的一套高质量的图文混排引擎。 2. 流量节省是一整套节省客户端流量的解决方案。 3. 特性开关是一套可以由服务器随时调整的运行参数。

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开发”微信公众号: