iOS 预加载 Web 页面方案

可以先下载Demo看看效果,Github地址:< GitHub – ming1016/STMURLCache: iOS预加载Web页面方案 >

可以预加载多个网址,然后在离线状态去显示那几个网址,看看是不是都完全缓存下来了。

使用方法

在需要开启预加载的地方创建

这里是所有可设置项目,默认设置可以查看 model 的 get 方法

也可以随时更新这些设置项

预加载名单可以按照整个 web 页面请求进行预加载

如果需要按照单个资源列表进行预加载可以使用 preLoadByRequestWithUrls 这个方法。

白名单设置

对于只希望缓存特定域名或者地址的可以通过白名单进行设置,可以在创建时进行设置或者更新时设置。

这里的 whiteUserAgent 的设置会设置 webview 的 UserAgent,这样能够让webview以外的网络请求被过滤掉。

基本加载缓存实现原理

创建 STMURLCache 后设置 NSURLCacheURLCache ,在 cachedResponseForRequest 方法中获取 NSURLRequest 判断白名单,检验是否有与之对应的 Cache ,有就使用本地数据返回 NSCachedURLResponse ,没有就通过网络获取数据数据缓存。 STMURLCache 对象释放时将 NSURLCache 设置为不缓存,表示这次预加载完成不需要再缓存。当缓存空间超出设置大小会将其清空。

使用 NSURLProtocol 这种原理基本类似。

白名单实现原理

创建域名列表设置项 whiteListsHostuserAgent 设置项,在创建和更新时对其进行设置。在网络请求开始通过设置项进行过滤。具体实现如下

具体缓存实现

缓存的实现有两种,一种是 NSURLCache 另一种是 NSURLProtocolSTMURLCache 同时支持了这两种,通过 STMURLCacheModel 里的 isUsingURLProtocol 设置项来选择使用哪个。

NSURLCache的实现

没有缓存的 request 会对其进行请求将获取数据按照hash地址存两份于本地,一份是数据,一份记录时间和类型,时间记录可以用于判断失效时间。对于判断是否有缓存可以根据请求地址对应的文件进行判断。具体实现如下:

NSURLProtocol的实现

在设置配置项和更新配置项时需要创建一个 STMURLCacheModel 的单例来进行设置和更新配置项给 NSURLProtocol 的实现来使用。通过 isUsingURLProtocol 设置项区分, NSURLProtocol 是通过registerClass方式将protocol实现的进行注册。

关闭时两者也是不同的,通过设置项进行区分

白名单处理还有读取缓存和前者都类似,但是在缓存Data时 NSURLCached 的方案里是通过发起一次新的请求来获取数据,而 NSURLProtocolNSURLConnection 的 Delegate 里可以获取到,少了一次网络的请求,这里需要注意的是在 – (void) connection:(NSURLConnection )connection didReceiveData:(NSData )data 每次从这个回调里获取的数据不是完整的,要在 – (void) connectionDidFinishLoading:(NSURLConnection *)connection 这个会调里将分段数据拼接成完整的数据保存下来。具体完整的代码实现可以看 STMURLProtocol 里的代码实现。

后记

通过 map 网络请求可以缓存请求,也可以 mock 接口请求进行测试。

完整代码:<GitHub – ming1016/STMURLCache: iOS预加载Web页面方案 >

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部