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 stringByEvaluatingJavaScriptFromString: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变为单例共享
-
(WKProcessPool*)singleWkProcessPool{
staticWKProcessPool*sharedPool;
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
sharedPool = [[WKProcessPoolalloc]init];
});
returnsharedPool;
}
设置webview的配置 config.processPool = [NYWKWebView singleWkProcessPool];
Local Storage存在的问题
在查询资料的过程中,发现了很多Local Storage的缺陷,有一篇关于Local Storage的论文可以参考。有以下几点:
- 不要用Local Storage来做持久化存储,在iOS中,出现存储空间紧张时,它会被系统清理掉;
- 不要用Local Storage来存大量数据,它的读写效率很低下,因为它需要序列化/反序列化;
- 大小限制为5M
webview 和 iframe 有什么区别?
webview是网页的原生载体,用于在原生环境中加载一个页面,iframe是网页的html载体,用于在网页中加载一个页面