缓存在 UIWebView 中不起作用

Posted

技术标签:

【中文标题】缓存在 UIWebView 中不起作用【英文标题】:Caching won't work in UIWebView 【发布时间】:2016-08-24 14:06:35 【问题描述】:

我也有一个可以离线使用的网站。我创建了一个使用UIWebView 的应用程序,我说我的UIWebView 应该使用以下代码缓存此站点

[self setRequestObj:[NSURLRequest requestWithURL:loadUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]];

如果我第一次使用互联网连接启动我的应用程序,我的console 已登录

2016-08-24 15:37:01.713 BrowserApp[1991:345138] applicationDidBecomeActive!
2016-08-24 15:37:01.955 BrowserApp[1991:345138] NSURLRequestUseProtocolCachePolicy
2016-08-24 15:37:22.003 BrowserApp[1991:345138] applicationDidEnterBackground!
2016-08-24 15:37:22.559 BrowserApp[1991:345138] applicationWillEnterForeground!
2016-08-24 15:37:23.075 BrowserApp[1991:345138] applicationDidBecomeActive!
2016-08-24 15:37:37.069 BrowserApp[1991:345138] applicationDidEnterBackground!
2016-08-24 15:37:37.073 BrowserApp[1991:345138] applicationWillTerminate!

我看到文件AppDelegate.m 中调用了每个方法。我断开手机与互联网的连接,再次启动我的应用程序(不像我的console 所说的那样在后台运行),但什么也没发生。我只有一个白色的网站。

虽然我设置为cache,但为什么website 不会显示在我的屏幕上?

【问题讨论】:

【参考方案1】:

可能是您加载的页面有过期日期(可能设置为立即过期)。尝试将 cahce 策略设置为 NSURLRequestReturnCacheDataElseLoad(尽管从长远来看这可能不好,因为它永远不会重新加载)。

或者,(更有可能)来自网站的响应标头可能包含缓存控制标头。不管你说什么,页面仍然可以告诉 NSURLRequest 它不应该被缓存。

要进行调查,您可以设置断点或在您处理确实收到响应的代码中放置一些日志记录。将NSURLResponse 转换为NSHTTPURLResponse,然后使用allHeaderFields 查看标题。

【讨论】:

【参考方案2】:

似乎是 URLCache 的一个错误。当我终止应用程序,将手机置于飞行模式并重新启动应用程序时,即使响应已缓存,WebViewDelegatedidFailLoadWithError 也会被调用。

同样URLCache.shared.cachedResponse(for: urlRequest) 不返回CachedURLResponse

我还检查了 Cache.db,它包含已保存的响应和资产。

奇怪!

【讨论】:

以上是关于缓存在 UIWebView 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

reCAPTCHA 在 iOS 10 UIWebView 中不起作用

UIWebview 中的 HTTPS url 在 iphone / ipad 中不起作用

UIWebview loadRequest 仅在 iPhone X 中不起作用

使用 Find in Awake 缓存脚本引用,在 Start 中不起作用

自动缓存更新在 react apollo 中不起作用

UIMoviePlayerControllerDidEnterFullscreenNotification 在 iOS8 中不起作用