iOS WKWebview LocalStorage缓存位置,讨论是否可以用来H5做交互?

3,799 阅读2分钟

最近和H5做交互,涉及到传参,H5写好的从LocalStorage取数据,让我直接存到LocalStorage里他取,以前从没这么干过,觉得貌似可行,所以试一试

  • 第一步,先找到缓存 做个webview,打开百度(https//:www.baidu.com),在模拟器缓存里找到文件路径 /Users/liuchaoqun/Library/Developer/CoreSimulator/Devices/7BC59479-6683-4307-9845-145CB895EA84/data/Containers/Data/Application/5BA0953B-EABE-4D1E-90DA-36DC402AEE87/Library/WebKit/com.cq.WKWebViewLocalStorageTool/WebsiteData/LocalStorage/https_www.baidu.com_0.localstorage

然后我们做如下封装,方便取地址,

static func localStorage(withUrl url: String) -> String {
        let bundleId = Bundle.main.infoDictionary!["CFBundleIdentifier"]
        return "\(NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).last!)/WebKit/\(bundleId!)/WebsiteData/LocalStorage/\(url).localstorage"
    }

那么问题来了,https_www.baidu.com_0后面拼的0如何确定?目前无法确定拼接0的逻辑

  • 既然找到缓存,就继续看,https_www.baidu.com_0.localstorage是一个sqlite, 使用Navicat Premium建立链接,里面一个ItemTable的表,用key value 存着一堆BLOB类型的数据,试着取出,可以取,但很麻烦,具体参考 github.com/Azure/azure… 【链接】如何通过iOS使用对象(Blob)存储-Azure docs.microsoft.com/zh-cn/azure…

  • 重新新建一个项目,打开模拟器,发现并没有缓存,也就是说在用户打开之前必须后台走一遍才能有缓存,浪费性能

  • 其次,这个东西还存在很多缺陷,具体参考 thinkmind.org/download.ph…

  • 可能会在内存紧张的时候被系统清掉,也有可能被自己的清除缓存功能清掉,那么每次在存参数之前,就必须后台走一遍地址,对性能很不好

  • 读写效率极其低下,每次都要序列化反序列化

  • 对文件大小有限制,不能超过5M,虽然这条用的不多

综上所述,LocalStorage是不能用来和H5交互传参的,还是让H5写函数我们调用,或者拼接地址