Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
移动端离线应用开发实践
Search
zhenn
December 28, 2012
Technology
2
310
移动端离线应用开发实践
what?how?
zhenn
December 28, 2012
Tweet
Share
Other Decks in Technology
See All in Technology
5年間のFintech × Rails実践に学ぶ - 基本に忠実な運用で築く高信頼性システム / 5 Years Fintech Rails Retrospective
ohbarye
4
1.2k
サプライチェーン攻撃に学ぶModuleの仕組みと セキュリティ対策
kuro_kurorrr
2
280
2025 IEEE MSST: NFS: Genesis
pugs
0
110
入門 FormObject / An Introduction to FormObject #kaigionrails
expajp
1
330
コンパウンドスタートアップにおけるQAの成長戦略
matsu802
3
450
あなたのWebサービスはAIに自動テストしてもらえる?アクセシビリティツリーで読み解く、AIの『視点』
yusukeiwaki
0
150
全身画像からコーデアイテムを抽出し毎日にIRODORIを!デバイス完結型アプリを作る
zozotech
PRO
0
110
2025-09-22 Iceberg, Trinoでのログ基盤構築と パフォーマンス最適化
kamijin_fanta
0
210
業務でAIの力を最大限に発揮するために #弁護士ドットコム
bengo4com
0
250
使いやすいプラットフォームの作り方 ー LINEヤフーのKubernetes基盤に学ぶ理論と実践
lycorptech_jp
PRO
2
270
20250920_ServerlessDays
takuyay0ne
9
2.7k
C# 14 / .NET 10 の新機能 (RC 1 時点)
nenonaninu
0
210
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
75
5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.1k
Making Projects Easy
brettharned
118
6.4k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
2.6k
Raft: Consensus for Rubyists
vanstee
139
7.1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
45
2.5k
RailsConf 2023
tenderlove
30
1.2k
The Pragmatic Product Professional
lauravandoore
36
6.9k
Gamification - CAS2011
davidbonilla
81
5.4k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
A Tale of Four Properties
chriscoyier
160
23k
Transcript
移动端离线应⽤用开发实践 栋寒 : F2E@taobao 12年12月28⽇日星期五
what? 12年12月28⽇日星期五
应⽤用在离线情况下可正常“使⽤用” 顾名思义: 12年12月28⽇日星期五
在全球互联⺴⽹网时代 ⺴⽹网络⽆无处不在? 12年12月28⽇日星期五
可预⻅见的⽆无⺴⽹网络时刻 • 乘坐航班 • 移动⺴⽹网络信号断断续续不稳定 • ⼿手机资费耗尽不知情 12年12月28⽇日星期五
offline online 未作离线部署 12年12月28⽇日星期五
offline online 离线部署后 12年12月28⽇日星期五
正确认识离线应⽤用 12年12月28⽇日星期五
在离线状态下 在⺴⽹网络可⽤用时,再同步⾄至远程主机 保证应⽤用正常显⽰示,不需要⺴⽹网络交互的操作可正 常进⾏行,如:编辑邮件、创建待办事项 12年12月28⽇日星期五
How? 12年12月28⽇日星期五
html5的时代 nothing is impossable 12年12月28⽇日星期五
离线应⽤用缓存:applicationCache if(window.applicationCache){ //浏览器⽀支持离线引⽤用 //TODO } 12年12月28⽇日星期五
appcache ?== 304cache 12年12月28⽇日星期五
304 cache 使⽤用缓存在硬盘上的⽂文件,需要远程主机 响应头信息,通知浏览器读取 12年12月28⽇日星期五
appcache 同样使⽤用缓存在硬盘上的⽂文件,只依赖于缓存 清单⽂文件(manifest)的更新状态 ⽆无需远程主机通信即可使⽤用 12年12月28⽇日星期五
appcache 打开浏览器输⼊入about:cache 12年12月28⽇日星期五
304cache appcache ⺴⽹网络依赖 是 否 存储空间 较⼤大 相对较⼩小 存储路径 各⾃自独⽴立
各⾃自独⽴立 12年12月28⽇日星期五
web服务器现状 主流web服务器都没有为离线应⽤用提供任何默认 的缓存⾏行为,若想使⽤用离线功能,需要在html⽂文档中 声明 12年12月28⽇日星期五
解决之道:manifest⽂文件声明 <!doctype html> <!--cache⽂文件名称随意--> <html manifest="cache.manifest"> <head> 12年12月28⽇日星期五
manifest⽂文件样例 CACHE MANIFEST #version:1.0.0 CACHE: #指定cache⽂文件的列表,绝对路径、相对路径均可 http://a.tbcdn.cn/s/kissy/logo.png example.js NETWORK: #指定需要⺴⽹网络加载的⽂文件列表,
# * 表⽰示除了cachelist中之外的所有⽂文件或路径 * FALLBACK: #提供获取不到缓存资源时的备选资源路径 #⼀一般情况下不必关注 /app/login.html offline.html 12年12月28⽇日星期五
manifest⽂文件配置( 以apache为例) • 打开conf⺫⽬目录下mime.types⽂文件 • 添加text/cache-manifest manifest 12年12月28⽇日星期五
简单有效的⽅方法 <?php header('Content-Type:text/cache-manifest'); ?> 12年12月28⽇日星期五
你应该了解的缓存状态码 数值型属性 缓存状态 描述 0 UNCACHED(未缓存) 如果未引⼊入manifest的⻚页⾯面,appcache状态都是未缓存 1 IDLE(空闲) 最常出现的状态,cache完成后,就会处理空闲状态
2 CHECKING(检查中) 正在检查更新 3 DOWNLOADING(下载中) 正在下载更新 4 UPDATEREADY(更新就绪) 已经准备好更新 5 OBSOLETE(过期) manifest⽂文件丢失,appcache就会处于过期状态 12年12月28⽇日星期五
相关事件 事件 关联的状态 onchecking CHECKING oncached IDLE ondownloading DOWNLOADING onupdateready
UPDATEREADY onobsolete OBSOLETE onnoupdate 在没有更新时触发 onerror offline情况下,⽆无法请求到manifest⽂文件,即触发 12年12月28⽇日星期五
查看demo 12年12月28⽇日星期五
复杂的事情简单化 12年12月28⽇日星期五
• 保证html⽂文档正确引⼊入manifest⽂文件 • 维护manifest⽂文件,及时更新appcache 12年12月28⽇日星期五
• 保证html⽂文档正确引⼊入manifest⽂文件 • 维护manifest⽂文件,及时更新appcache PS: 在更新manifest⽂文件后,哪怕是更改注释,浏览器都会⾃自动更新缓存⽂文件 12年12月28⽇日星期五
仅仅是静态资源⽽而已 12年12月28⽇日星期五
对于动态资源,⽆无法在manifest中配置 ajax、jsonp 12年12月28⽇日星期五
速找好基友? 12年12月28⽇日星期五
速找好基友? localStorage 12年12月28⽇日星期五
速找好基友? localStorage web database 12年12月28⽇日星期五
hack思路 getDynamic ⺴⽹网络可⽤用 getDynamic 是 fetchFromLocalData 否 updateLocalData 12年12月28⽇日星期五
业务代码中简单处理 navigator.onLine ? this.async(url) : this.fetchFromStorage(url); this.manageStorage(url,responseText); localStorage.removeItem(key); localStorage.setItem(url,responseText); localStorage.getItem(url);
12年12月28⽇日星期五
not just offline App on mobile 12年12月28⽇日星期五
对于提升web应⽤用响应速度,同样强⼒力 12年12月28⽇日星期五
Q & A 12年12月28⽇日星期五