iOS wkwebview怎么写localStorage

作者: 王家小雷 | 来源:发表于2021-05-23 16:15 被阅读0次

    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载体,用于在网页中加载一个页面

    相关文章

      网友评论

        本文标题:iOS wkwebview怎么写localStorage

        本文链接:https://www.haomeiwen.com/subject/wclzjltx.html