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的论文可以参考。有以下几点:

  1. 不要用Local Storage来做持久化存储,在iOS中,出现存储空间紧张时,它会被系统清理掉;
  2. 不要用Local Storage来存大量数据,它的读写效率很低下,因为它需要序列化/反序列化;
  3. 大小限制为5M

webview 和 iframe 有什么区别?

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

推荐阅读更多精彩内容