当前位置:首页 » 文件管理 » ioswebview缓存

ioswebview缓存

发布时间: 2023-07-02 13:41:51

1. ios 应用删掉了为什么webview之前的缓存还存在

浏览器缓存机制是指通过HTTP协议头里的Cache-Control(或Expires)和Last-Modified(或Etag)等字段来控制文件缓存的机制。这应该是WEB中最早的缓存机制了,是在HTTP协议中实现的,有点不同于DomStorage、AppCache等缓存机制,但本质上是一样的。可以理解为,一个是协议层实现的,一个是应用层实现的。

Cache-Control用于控制文件在本地缓存有效时长。最常见的,比如服务器回包:Cache-Control:max-age=600表示文件在本地应该缓存,且有效时长是600秒(从发出请求算起)。在接下来600秒内,如果有请求这个资源,浏览器不会发出HTTP请求,而是直接使用本地缓存的文件。

Last-Modified是标识文件在服务器上的最新更新时间。下次请求时,如果文件缓存过期,浏览器通过If-Modified-Since字段带上这个时间,发送给服务器,由服务器比较时间戳来判断文件是否有修改。如果没有修改,服务器返回304告诉浏览器继续使用缓存;如果有修改,则返回200,同时返回最新的文件。

Cache-Control通常与Last-Modified一起使用。一个用于控制缓存有效时间,一个在缓存失效后,向服务查询是否有更新。

Cache-Control还有一个同功能的字段:Expires。Expires的值一个绝对的时间点,如:Expires:Thu,10Nov201508:45:11GMT,表示在这个时间点之前,缓存都是有效的。

Expires是HTTP1.0标准中的字段,Cache-Control是HTTP1.1标准中新加的字段,功能一样,都是控制缓存的有效时间。当这两个字段同时出现时,Cache-Control是高优化级的。

Etag也是和Last-Modified一样,对文件进行标识的字段。不同的是,Etag的取值是一个对文件进行标识的特征字串。在向服务器查询文件是否有更新时,浏览器通过If-None-Match字段把特征字串发送给服务器,由服务器和文件最新特征字串进行匹配,来判断文件是否有更新。没有更新回包304,有更新回包200。Etag和Last-Modified可根据需求使用一个或两个同时使用。两个同时使用时,只要满足基中一个条件,就认为文件没有更新。

2. [iOS]使用WKWebView遇到的问题总结

在使用WKWebView获取userAgent的时候, 如果要全局配置, 使所有的WKWebView都能生效, 我们可能的做法是在AppDelegate中来配置, 但是需要一个WKWebView实例对象, 所以可能是这么写的:

这样, 你会发现设置一直是无效的, 在回调里打印一下:

这时发现获取到的 info 字段为nil, 并且error信息如下:

个人猜测: 这是因为, WKWebView的evaluateJavaScript方法是异步执行的, 当WKWebView回调这个方法的时候, 其实例对象已经从内存中释放了, 所以导致回调出错.
我做了如下验证, 在回调方法里输出webView实例对象:

会发现输出是info有值, 而error为nil, webView有值, 又正常了, 有人说了,看样子不是这个问题! 真的么? 仔细想一下会发现, 在webView的方法回调闭包里使用了webView实例, 会发生什么? 对, 循环引用! webView实例此时不为nil, 这也验证了, 如果webView实例正常的话, 获取结果是不会有误的! 继续上面的验证, 我们弱引用一下:

这时, 会发现: info和webView都为nil, error值为上面那个错误!!!

这样, 基本验证出现这个问题的原因是: webView 提前释放了!

但是为了添加这个设置, 而将webView 设为全局变量, 仿佛有点得不偿失, 这时可以在使用webView的页面进行设置, 或者使用UIWebView替换:

在做JS与原生交互的时候, 使用下面方法注入的协议无效:

然后在js端使用的时候: 这里不需要传参数, 直接这么写的

这样, 没有响应js端的事件!!!
在代理方法中:

一直没有收到回调!!!
其实, 并不是注入协议失败, 这么使用也没问题, 问题就出在postMessage的参数上, 如果是带参数的:

这么写, 是完全没有问题的, 所以如果不需传参数的话, 可以这么写:

给一个空的字典, 就能正常交互了!!!

在WKWebView加载的HTML页面上, 如果长按会弹出一些选择框, 在文字上长按, 会弹出UIMenuController选择框:

而在图片上长按, 会弹出一个alertSheet:

这里可以保存图片到系统相册(如果有权限), 或者复制到剪切板. 但是这些需求并不是我们需要, 如何禁止这些行为呢?需要从JS入手, 只需要执行下面两句js即可:

可以在创建WKWebView的时候注入:

也可以在页面加载完成后的代理方法中执行:

在加载的HTML页面中, 无端出现一个广告的悬浮框:

打开之后是这样的:

而且只会在移动4G网络下才会出现, 其实这是移动的流量劫持, 强加的广告推广,目前网上有一些解决方式,常用的有:

其他的可参考这篇文章 iOS 客户端对于运营商劫持的一点点对抗方式


在联调的时候, 前端的同学改了一些东西, 例如页面的布局, 显示元素, 或者js方法, 而APP端没反应!!!

这是因为, WKWebView有缓存, 为了保证每次加载的都是最新的页面, 可以在加载的链接后面加上一个时间戳, 例如你的HTML地址为:

一般使用是这样的:

这样的话是有缓存, 加载一次之后, 再去加载也不是最新的页面, 可以这样使用:

这样每次加载的时候都会是最新的, 当然弊端就是, 每次都会耗费一些额外的流量.

在页面无导航的情况下,系统会自动调节滚动视图的contentInset,使其视图永远处于状态栏之下,但是如果我们想让滚动视图的Y坐标从屏幕顶端(状态栏)开始,我们都知道怎么修改,但是 WKWebView不是继承自UIScrollView 的,所以不能直接设置,可以这么写:

这个闪退发生在与 JS 进行交互,使用下面的方法注册协议时:

如果重复注册了相同名称的协议,就会发生闪退,所以在使用完webView的时候,一定要记得移除已注册的协议:

app首页使用 WKWebView 来承载的内容,在启动时,如果添加了引导页/广告页,这时如果有手势操作,例如在出现广告页时点击屏幕,就会闪退,并在控制台输出:

添加一个全局断点,调试发现崩溃信息为

查了些资料,没找到具体原因,但是了解到和 +load方法有关,我是在 +load 方法内初始化的广告页的信息,把这些放在 didFinishLaunchingWithOptions 进行初始化,就不会有这个问题;

解决:
将广告/引导页视图的初始化放在 didFinishLaunchingWithOptions 方法内。

3. iOS wkwebview怎么写localStorage

iOS中WKWebView,存在首次加载h5页面,h5页面中的js就拿不到localstorage了。

WKWebView localStorage 缓存很严重

HTML5在客户端存储数据的方式:cookie , localStorage, sessionStorage
cookie:只能存储少量的数据, 常用来存储账号密码等
localStorage : 没有时间限制的数据存储
sessionStorage : 针对一个 session 的数据存储, 当网页关闭时,数据也会被删除。

1.WKWebView设置localStorage
NSString * userContent = [NSString stringWithFormat:@"{"token": "%@", "userId": %@}", @"a1cd4a59-974f-44ab-b264-46400f26c849", @"89"];
// 设置localStorage
NSString *jsString = [NSString stringWithFormat:@"localStorage.setItem('userContent', '%@')", userContent];
// 移除localStorage
// NSString *jsString = @"localStorage.removeItem('userContent')";
// 获取localStorage
// NSString *jsString = @"localStorage.getItem('userContent')";
[self.webView evaluateJavaScript:jsString completionHandler:nil];

NSString * userContent = @"{"name": "Tom", "age": 10}"];
// 设置localStorage
NSString *jsString = [NSString stringWithFormat:@"localStorage.setItem('userContent', '%@')", userContent];
// 移除localStorage
// NSString *jsString = @"localStorage.removeItem('userContent')";
// 获取localStorage
// NSString *jsString = @"localStorage.getItem('userContent')";
[self.webView :jsString];
//清理掉所有的localStorage数据
//NSString *clearString = @"localStorage.clear()";

iOS wkwebview localstorage数据处理

WKWebView 在内存占用上优化的很多。但是在实践中发现bug:localstorage信息不一致。

A页面和B页面都存在 一个WKWebView。 在B页面使用localstorage保存信息。 回到A页面取不到最新的数据。

原因:

https://developer.apple.com/reference/webkit/wkwebviewconfiguration 中有个属性 processPool,描述是:The process pool from which to obtain the view’s Web Content process.

解决方法:

把config中的processPool变为单例共享

}

设置webview的配置 config.processPool = [NYWKWebView singleWkProcessPool];

在查询资料的过程中,发现了很多Local Storage的缺陷,有一篇关于Local Storage的 论文 可以参考。有以下几点:

webview 和 iframe 有什么区别?

webview是网页的原生载体,用于在原生环境中加载一个页面,iframe是网页的html载体,用于在网页中加载一个页面

4. WKWebView网页缓存刷新问题

在开发过程中遇到前端改变图片文字,客户端没有实时刷新出来,抓包发现也没有请求网页相关接口。由于不懂后端的知识,折腾了很久,网上也查找了很多都说需要清除缓存。

这是在网上查找的iOS9以上清除缓存方法

不建议使用上述方法,会浪费用户流量,除非用户手动清除缓存。其实主要原因是后端网页设置的问题,通过head请求获取接口返回信息如下:

上面标粗的是关键,通过测试发现WKWebView是否通过缓存取数据还是重新请求接口取决于 Expires,如上就是缓存时效性是30分钟,想要实时刷新,可以让后端不返回这个字段或者这个过期事件设置短一些,例如1分钟。建议静态网页可以设置长时间,需要实时刷新的建议后端不要设置这个字段,以免客户端无法实时显示。

5. ios webview的cookie怎么清楚

UIWebView清除Cookie:

//清除cookies
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies])
{
[storage deleteCookie:cookie];
}

UIWebView清除缓存:

//清除UIWebView的缓存
[[NSURLCachesharedURLCache] removeAllCachedResponses];

NSURLCache * cache = [NSURLCache sharedURLCache];
[cache removeAllCachedResponses];
[cache setDiskCapacity:0];
[cache setMemoryCapacity:0];

热点内容
安卓手机中的投影在哪里 发布:2025-02-05 08:01:57 浏览:594
php调用定义函数 发布:2025-02-05 08:00:30 浏览:451
ubuntujava环境变量 发布:2025-02-05 07:57:13 浏览:442
sql语句on 发布:2025-02-05 07:41:42 浏览:597
取消电脑密码怎么设置8 发布:2025-02-05 07:24:16 浏览:393
洗脑编程 发布:2025-02-05 07:23:52 浏览:948
osd加密 发布:2025-02-05 07:17:39 浏览:36
微信游戏源码下载 发布:2025-02-05 07:17:29 浏览:384
计算机内存储器是 发布:2025-02-05 07:13:35 浏览:144
classpathlinux 发布:2025-02-05 07:12:57 浏览:564