离线缓存机制
A. iOS webView利用NSURLProtocol实现离线缓存
最近公司有一个需求,要对webView(UIWebView)实现缓存机制。即在无网条件下,打开webView页面,能读取到网页,有网情况下,缓存未过期也可以使用本地缓存,加快用户读取网页速度。
实现缓存策略的方案有很多,为了保证有效,可控等多方面因素,本文采用NSURLProtocol来实现该需求,它的优势很多,楼主就不再累述了。
关于NSURLProtocol,网上给出了很多资料,但很多方案都有缺陷,包括github上有star的项目,会遇到在特定情况下,网页加载不出来的问题,导致一直显示空白页。本文成功解决了这些问题,目前该项目已在线上稳定运行。
写这篇文章,一方面为了自己,做一些整理,另一方面如果小伙伴,遇到类似需求后,不至于走太多弯路,所谓前人栽树,后人乘凉。废话不多说了,直接上内容。
首先关于URL Loading System
简单来说, URL Loading System 是iOS一系列网络请求类的集合,包括老的NSConnection和现在流行的NSURLSession,还包括一些请求认证的类,一个sessionConfig的类,还有关于处理请求缓存的类等,当然也包括NSURLProtocol类。
当我们需要拦截URL请求时,我们只要通过 - registerClass: 方法注册我们的NSURLProtocol类,然后去重写NSURLProtocol类中的方法,就能对我们发起的请求做处理。
NSURLProtocol 是一个抽象类,所以使用的时候必须定义一个它的子类:
需要拦截URL的控制器中注册该类:
记得在不需要的时候,及时关闭它:
注意一点:如果是基于 NSURLSession 进行的请求,注册的时候需要注册到 NSURLSessionConfiguration 中:
注册成功之后,需要子类CLURLSessionProtocol去实现抽象方法:
+ (BOOL)canInitWithRequest:(NSURLRequest*)request
此处可以拦截需要处理的URL,已经处理过的请求,需要标记请求是否被处理过,防止死循环
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
这个方法用来统一处理请求 request 对象的,可以修改头信息,或者重定向。没有特殊需要,则直接return request;
如果要在这里做重定向以及头信息的时候注意检查是否已经添加,因为这个方法可能被调用多次,也可以在后面的方法中做。
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest*)a toRequest:(NSURLRequest*)b
判断网络请求是否一致,一致的话使用缓存数据。没需要就调用 super 的方法。
- (void)startLoading
这个方法作用很大,把当前请求的request拦截下来以后,在这个方法里面对这个request做各种处理,比如添加请求头,重定向网络,使用自定义的缓存等。
重点:需要标记已经处理过的 request:
- (void)stopLoading
取消流程
流程图:
B. i部落是什么呀
i部落(ibuluo)是为在校大学生打造的高校学生专属网络社区、移动社交手机软件,让加入其中的师兄师弟学姐学妹们,能享受到面向大学生专属的优惠、定制的服务,分享高校生活学习的点点滴滴,让大学时光在这里驻足,是真实而有价值的信息互动乐园。
基本功能
i部落产品以手机客户端为主,目前已发布iOS和Android客户端,用户登录i部落后,可分享大学学习生活信息,书写心情日志,并可创建兴趣圈子,去活动板块参加面向大学生的免费活动。据i部落内部工作人员介绍,i部落目前处于试运营阶段,随后将根据市场反馈,增加更多针对大学生活场景开发的特有功能,及面向在校大学生的专属特权。
图册i部落手机客户端界面(5张)
核心团队
该产品由前IBM 中国研究院副院长,中国云计算专家陈滢博士主导设计运营,团队主要成员在教育行业从业经验超过十年。
支持平台
i部落(Android)系统要求:Android2.2及以上
i部落(iOS)系统要求:与 iPhone、iPod touch、iPad 兼容。需要 iOS 5.0 或更高版本
版本更新
i部落 v1.0.3
新增的功能:
1、新增了“抢鲜看”、“热推荐”按钮,可以实现帖子的分类查看;
2、对动态显示进行了优化,减少垃圾动态对用户的骚扰;
3、优化了应用的离线缓存机制,大大的减少了用户使用i部落时的消耗流量;
4、优化了发帖上传和查看大图的速度,使得运行过程更流畅。
C. 朋友圈重要缓存是什么
问题一:朋友圈重要缓存是什么来的 如果清了会怎样 朋友圈的信息是同步在服务器上而非缓存在本地的,因此不存在清理缓存的说法,但是是有缓存数据的,可以被清理。1、打开,点击右上方的三点2、在弹出菜单中选择“设置”选项。3、在设置选项里选择“通用”。4、在通用选项里,下拉在后面找到点击“清理存储空间”。5、勾选想要清除的缓存,然后点击”删除“就可以了。
问题二:朋友圈重要缓存有什么东西的?可以删掉吗? 反正我全都清理了,有的时候,实在没空间了,把数据清理了。
问题三:微信的朋友圈缓存图片存在哪里 一般在内存卡里的tencent/micromsg/ 然后点那个名字很长的文件夹,然后点image2,得到一些文件夹,不断往里点就能看到图片了。
可能是按照聊天时间段来的,并没有把不同时间段的历史照片都放在一起。 ,如果你没有保存只是缓存的话。但愿你的手机没有清理缓存,否则找不到了。
问题四:朋友圈的内容,怎么操作才能缓存? 联网,就自动缓存了
问题五:微信朋友圈缓存怎么清理 1.打开登录微信,然后选择右下角【我】,【通用】进入,【清理微信存储空间】点击!
2.通过手机清理工具,选择微信,进行缓存清理
3.360安全卫士,也可以进行全面清理!
问题六:微信朋友圈的缓存机制是怎样的 安卓图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录,
同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索,如果没有则连接服务器下载,下载之后再服务器中作出相应记录.
问题七:删除微信的朋友圈缓存影响手机的什么内容?建议删吗? 有缓冲内存,可以定时清理缓冲内存,用猎豹清理大师
问题八:微信朋友圈好的内容可以离线缓存? 可以
问题九:微信朋友圈缓存图片在哪 一般在内存卡里的tencent/micromsg/ 然后点那个名字很长的文件夹,然后点image2,得到一些文件夹,不断往里点就能看到图片了。 可能是按照聊天时间段来的,并没有把不同时间段的历史照片都放在一起。 ,如果你没有保存只是缓存的话。但愿你的手...
问题十:微信Android 客户端朋友圈功能的缓存机制是怎样的 安卓图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录, 同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索,如果没有则连接服务器下载,下载之后再服务器中作出相应记录.
D. APP中的6种常见数据加载
1.
全屏加载
全屏加载也叫白屏加载,就是整个屏幕白屏进行数据加载,一般会有菊花转或进度条配合,常用于手机网页的加载中,例如列表页进入详情页,图片详情等。(可考虑融入趣味性较强的小动画,增强愉悦感,从用户心理上去缩短等待时间。
优点:能保证内容的整体性,全部加载完才能够系统化的阅读。
缺点:有非常强烈的等待感,3s以上会产生焦躁情绪,所以在地铁等信号 不好的地方,使用手机网 页获取内容实在是比较灾难的一件事情。
2.分布加载
分布加载就是分步骤的加载网页,优先加载占网络资源较小的元素,包括优先加载,懒加载,预加载,渐进加载。
a.优先加载
如果一个页面有图片有文字,可以先把文字都加载出来,保证用户可以有内容可读,然后再加载比较费流量的图片。但是活动页什么的,千万不能把重要信息全部放在图片上,导致加载不出来。这种加载形式更加适用于内容阅读型的APP。
懒加载主要是针对前端页面比较大而设计出来的一种方式,假如一个网页很大,又含有很多图片、视频内容,那么想一次性加载就会等待很久,懒加载就是只有在屏幕显示范围内的资源,被用户看到的内容才会真正去加载。
预加载就是提前加载,比如启动APP时,当显示启动画面时,就可以预先把首页内容加载出来,这样可以减少用户加载内容时的等待时间,还有一个很典型的使用场景就是浏览视频网站或者购物网站,当我们快要滑到页面底部时,下面图片已经几乎加载完成了,这就是预加载的好处,在使用上感觉更加流畅。
渐进加载
在 PC 端用浏览器看图片的时候,经常是先看到一张模糊图,然后再渐渐的变得清晰,这种效果就叫做渐进式加载。
优点:可以帮助用户快速阅读内容,了解信息。
缺点:也许会丢失掉重要的关键信息,无法建立信息获取的闭环。
3.整页加载
当当前页与下一页是整页切换的时候,可以考虑采用整页加载的形式,但是要保证每个页面的数据量不是特别的大。一般适用于宫格图片模式、全屏图片模式、网状详情页模式。
优点:能保证每个页面的完整性,体验比较整体。
缺点:不好保证整页的加载效率,且有可能影响浏览的流畅度。
4.自动加载
当你浏览信息时,不停的向上滑动,新的内容会不停的从底部出现,这种方式称为自动加载。关于自动加载,要注意每次加载多少条内容,或者多少屏的内容,我无聊的数了数今日头条每次会自动加载60条新闻。
优点:把用户代入无尽浏览模式,让用户一直向下滚动,不需要手动点击下一页。
缺点:没有尽头,容易迷失,不方便快速索引定位到某个内容。
5.智能加载
这个加载模式我经常使用到,假如是在WIFI情况下,使用QQ浏览器去看视频,那么它会自动加载视频播放,而使用4G的流量去访问视频页面的话,会有一个弹窗来确认是否要播放,以免耗费大量流量造成用户扣费。智能加载模式就是根据用户使用场景来改变加载形式的。
例如今日头条在WiFi模式下,图片大图展示,当处于非WiFi模式下时,展示小缩略图,当用户觉得某张图有足够的吸引力时,点击小缩略图加载大图,帮助用 户节省流量。再比如爱奇艺在非WiFi的模式下播放视频时,会提示用户继续播放会产生流量费用,这类设计就比较人性化,也容易让用户产生好感,建户忠诚 度。(用户知道你是在为他着想,毕竟流量还是挺贵的!)
优点:根据具体场景来控制流量和加载速度。
缺点:不一定真实有效的命中用户需求,所以还是需要给予用户一定的查看详情的入口,或者是设置项。
6.离线加载
当用户没网的时候,往往很多功能都不能用了,内容也无法加载出来,导致APP变得根本不可用,这时候就要考虑预加载 离线缓存的设计了。首先在有网 的时候把数据提前加载下来,缓存到本地,当没网的时候,直接加载已经缓存下来的内容。一般会提供给用户选择,是否开启有WiFi的情况下预加载功能,或者 是否开始WiFi下全部离线缓存的功能。这样便可在一定程度上减少地铁上信号时好时差而无法正常使用产品所带来的困扰了。但考虑到手机空间,要设计合适的离线机制。并配合一定的清理缓存的机制。适用于小说阅读、新闻阅读、视频类APP。
优点:解决了没网获取数据的问题,且节约了流量,保证了流畅。
缺点:占用本地存储空间,而且有时候预加载的内容根本没有用到。
三、4种减少等待感的设计
1.使用模态加载
尽量使用非模态的加载方式,在加载的过程不打断用户,不需要等待加载完就可以做别的事情的,而不用傻傻等待数据加载完成,大大降低了等待的焦躁感,提升用户体验流畅度。
模态加载:app在触发加载后,出现模态提示层,防止用户在加载过程中进行其他操作,导致当前加载出错。如果采用模态加载,会因为网络原因或内容过多导致长时间处于加载状态,建议提供一个“取消”的操作。同时在安卓中的后退按钮能关闭模态提示。
2. 情感化的加载动画
用户等待加载的过程是相当痛苦的,因为他迫切的想看到页面内容,通过设计一些呆萌可爱的加载动画,让用户在等待的过程中享受动画的愉悦感,让产品情感化,在心理层面上去减少用户的急躁感。
3.
进度条加载
如果是时间较长的加载过程,最好能清晰的告知过程进度,让用户有更加明确的知情权,和加载的时间预期。一个非常经典的体验设问,同样是3s的加载时 间,匀速的进度条、先慢后快的进度条、先快后慢的进度条,哪个让用户感觉上最快?经过科学的实验证实,先慢后快的进度条是让用户心理感受上最快的设计。这是因为用户最容易记住最后一瞬间的感觉,如果最后一瞬间,感知到了快,就觉得顺畅了。
4.
尽量提前加载
尽可能的利用预加载或有WiFi的情况下离线缓存的方式,把内容提前加载下来,这样能做到最大限度的降低加载给用户带来的卡顿感。如果能判断出来用户下一步要做的事情,提前帮用户加载相应的内容,肯定是最符合需求场景的事情。当我开始读第一页的时候,第二页第三页就开始陆续缓存下来了
5.启动页加载
这个主要是APP启动时的一个页面,由于APP启动需要时间,因此可以加入一个启动页来自然过渡,而且很多启动页是广告,这样也可以带来一些收益,这个页面一般可以点击跳过。
移动互联网的场景多种多样,我们在设计的时候需要考虑各种各样的场景,例如WiFi下、非WiFi下、无网络、又或者说电梯里、地铁上等等。但是咋们的目的也只有一个:优化用户体验,提高商业价值。所以无论设计什么功能模块都应该多考虑一下用户的使用场景。
如何降低用户的焦虑感?
由于存在网速不快,网络异常,服务器异常等情况,让用户等待的情况是必不可少的。但是我们都知道,等待会产生焦虑感,分分钟让用户卸载你的产品,那么我们可以通过哪些手段来降低或缓解用户的焦虑感?
第一:优化App的加载算法,使得App与服务器数据传输的时间减短。 这个需要开发人员的精益求精了。这个是从根本上解决了问题,因为直接减少了加载数据的时间,也就减少了用户需要等待的时间。
第二:采用预加载和智能加载的方式。 拿阅读App打比方,当用户在看第一页的时候,App在后台加载完后面的几页,等用户翻到第二页的时候就不需要等待加载了,因为App已经帮用户提前加载好了。这种加载机制对用户体验特别好,但是存在一个问题,就是要预测用户行为,加载其他数据,这样会消耗不少流量,所以建议在WiFi网络环境下采取这种预加载机制,而在蜂窝网络状态下则不采用预加载机制。这个要和开发人员讨论沟通,确保预加载机制完美运行。
第三:异步处理。 这一点做得好的App莫过于Instagram,不知道你有没有发现,用Instagram的时候会觉得特别流畅,即使在网络不好的情况下。这是为什么?因为在网络不好的情况下,你给好友点了赞,Instagram并不会提示你网络不好,操作失败,而是提示你点赞成功了,其实它只是将你点赞的操作记录了下来,等网络一好就将点赞的行为上传到服务器,从而完成点赞行为。这就是让产品自己去解决问题,而不是把问题抛给用户。
第四:设计有趣的loading动画,如上文介绍的美团APP奔跑的小人,这是提升产品情感的重要手段。
E. html5 如何更新离线缓存
需要服务器。这里用tomcat服务器来讲解。
首先要先把.manifest后缀的文件 的mine类型配置为text/cache-manifest。
一讲到tomcat配置,熟悉的朋友自然就会想到web.xml这个文件,没错,在文件中加入如下配置就行:
1 <mime-mapping>
2 <extension>manifest</extension>
3 <mime-type>text/cache-manifest</mime-type>
4 </mime-mapping>
然后写一个xxx.manifest文件,xxx是你自己取的一个名字。这个文件的格式是这样的:
CACHE MANIFEST
#version 1.5
CACHE:
MyTest.html
CSS/main.css
Javascript/bwH5LS.js
exp-calif-logo.gif
第一行是必须的,它标识这是manifest的配置文件。
#version 1.5
这句是注释,没实际的作用,我在这里只是想让浏览器更新缓存文件。因为当这个manifest文件与原来一样的时候,浏览器是不会去重新加载缓存文件的,所以我们可以通过这个注释,一方面修改版本号,另一方面让浏览器更新缓存。
CACHE:
这行指示出下面的文件是要缓存的。示例中,缓存了当前页面:MyTest.html,以及一些css和js文件 还有图片。
还有几个关键字示例中没提到,就是
NETWORK:
FALLBACK:
NETWORK 指不想缓存的页面;FALLBACK 是指请求的文件 没有找到或该文件的服务器没有响应时的替代方案,比如我们想请求某个嵌套页面,但这个页面的服务器连接不上了,那么我可以转向另外一个指定的页面。
这是第二步,第三步,只要在<html>标签中加上manifest的位置就行了:
<html manifest="NAME.manifest">
到这里,就可以实现简单的离线应用了。
那些缓存的文件放在哪呢?
在chrome上测试,发现它是按自己的机制来分块保存这些文件的,所以我没找不到完整的文件。保存的数据在:
C:\Users\jasonling\AppData\Local\Google\Chrome\User Data\Default 里面,具体怎么存,笔者还不了解。
火狐上的文件也是按它自己的机制来存的,不过笔者本人用sqlite打开后,找到了缓存文件的具体信息:
F. HTML5的离线储存怎么使用,以及工作原理
原理:HTML5的离线存储是基于一个新建的.appcache文件的,通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示。
方法:
1.在index.html里加上<html manifest="test.manifest">
2.manifest清单格式如下:
CACHE MANIFEST
#上面一句必须
#v1.0.0
#需要缓存的文件
CACHE:
a.js
b.css
#不需要缓存的文件
NETWORK:
*
#无法访问页面
FALLBACK:
404.html
3.manifest文件的mime-type必须是 text/cache-manifest类型。
G. html5新增了离线缓存机制这说法对吗
这个不算是 新增吧。
随着现代浏览器的推动,Flash放弃对移动端的支持,HTML5无疑成为当前Web前端炙手可热的话题。各大游戏开发商、App开发商纷纷投入人力进行研究和技术储备。相信不久的将来,HTML5会迎来一个快速发展和普及的春天。那么,HTML5这个新一代的标准,又给我们带来哪些缓存机制呢?
HTML5 之离线应用Manifest
我们知道,使用传统的技术,就算是对站点的资源都实施了比较好的缓存策略,但是在断网的情况下,是无法访问的,因为入口的HTML页面我们一般运维的考虑,不会对其进行缓存。HTML5的Cache Mainifest离线应用特性就能够帮助我们构建离线也能使用的站点,所有的资源都使用浏览器本地缓存,当然前提是要求在联网的情形下使用过一次站点。
如何实现离线访问特性
实现的步骤非常简单,主要3个步骤:
1)在服务器上添加MIME TYPE支,让服务器能够识别manifest后缀的文件
AddType text/cache-manifest manifest
2)创建一个后缀名为.manifest的文件,把需要缓存的文件按格式写在里面,并用注释行标注版本
CACHE MANIFEST
# 直接缓存的文件
CACHE:
Path/to/cache.js
# version:2012-03-20
3)给 <html> 标签加 manifest 属性,并引用manifest文件
具体可以参考:HTML5 缓存: cache manifest
<html manifest=”path/to/name-of.manifest”>
离线应用访问及更新流程
第一次访问离线应用的入口页HTML(引用了manifest文件),正常发送请求,获取manifest文件并在本地缓存,陆续拉取manifest中的需要缓存的文件
再次访问时,无法在线离线与否,都会直接从缓存中获取入口页HTML和其他缓存的文件进行展示。如果此时在线,浏览器会发送请求到服务器请求manifest文件,并与第一次访问的副本进行比对,如果发现版本不一致,会陆续发送请求重新拉取入口文件HTML和需要缓存的文件并更新本地缓存副本
之后的访问重复第2步的行为
离线机制的缓存用途
从Manifest的机制来看,即使我们不是为了创建离线应用,也同样可以使用这种机制用于缓存文件,可以说是给Web缓存提供多一种可以选择的途径。
存在的问题:缓存文件更新控制不灵活
就目前HTML5提供的manifest机制来讲,一个页面只能引用一个manifest页面,而且一旦发现这个manifest改变了,就会把里面所有定义的缓存文件全部重新拉取一遍,不管实际上有没有更新,控制比较不灵活。针对这个问题,也有的同学提出了一些建议,比如把需要缓存的文件分模块切分到不同manifest中,并分开用HTML引用,再使用强大的iframe嵌入到入口页面,这样就当某一个模式需要有更新,不会导致其他模块的文件也重新拉取一遍。
HTML5 之本地存储localstorage
HTML5给我们提供本地存储localstorage特性,严格来讲,其实已经不算传统Web缓存的范畴。因为它存储的地方是跟Web缓存分开的,是浏览器重新开辟的一个地方。
localstorage的作用
本地存储localstorage的作用主要使Web页面能够通过浏览器提供的set/get接口,存储一些自定义的信息到本地硬盘,并且在单次访问或以后的访问过程中随时获取或修改。
Localstorage的使用
Localstorage提供了几个非常易用的Api,setItem/getItem/removeItem/clear,具体的可以参考:Html5 Step by Step(二) 本地存储
Localstorage的缓存用途
Localstorage设计的本意可能是用来存储一些用户操作的个性化设置的文本类型的信息和数据,当我们其实也可能拿来当Web缓存区使用,比如我们可以将Base64格式编码的图片信息,存在localstorage中,再次访问时,直接本地获取后,使用Css3的Data:image的方式直接展现出来。
存在的问题:大小限制
按照目前标准,目前浏览器只给每个独立的域名提供5m的存储空间,当存储超过5m,浏览器就会弹出警告框。
可以说,HTML5的Manifest和localstorage是给我们在考虑Web缓存的时候提供了多一种思路,当你开发的应用只面对现代浏览器的时候,不妨可以考虑一下
H. es文件浏览器可以离线缓存吗
es文件浏览器不能离线缓存,缓存一般是在线状态下才可以。
缓存是可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。L1 Cache(一级缓存)是CPU第一层高速缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存储器均由静态RAM组成,结构较复杂。
在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般L1缓存的容量通常在32—256KB。L2Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片。内部的芯片二级缓存运行速率与主频相同,而外部的二级缓存则只有主频的一半。
相关信息
缓存的工作原理是当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。
正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在CPU缓存中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。CPU读取数据的顺序是先缓存后内存。