WKWebView的缓存策略不支持POST请求!!!

2,084 阅读2分钟

由于最近在写网页缓存和本地资源替换,在网页进去的时候发现显示不全的问题,用Charles发现参数没传,但是前端说传了参数的,发现请求为POST请求,会不是是参数的原因呢,把请求改为了GET发现好了(但是get请求会有参数过长的问题,尤其是token),查了查资料WKWebView发送POST请求之后,可以利用JS来动态的生成HTML里的form标签,然后用form表单来实现POST请求。我这里使用了dsbridge第三方的交互框架,在接收到服务器传来的参数,域名,我打包成JS字符串再传给他。

至于为什么在缓存策略下不支持POST请求?
由于 WKWebView 在独立进程里执行网络请求。一旦注册 http(s) scheme 后,网络请求将从 Network Process 发送到 App Process,这样 NSURLProtocol 才能拦截网络请求。在 webkit2 的设计里使用 MessageQueue 进行进程之间的通信,Network Process 会将请求 encode 成一个 Message,然后通过 IPC 发送给 App Process。出于性能的原因,encode 的时候 HTTPBody 和 HTTPBodyStream 这两个字段被丢弃掉了。现在暂时没有解决办法,好像iOS11有了新的缓存策略,等稍后研究。

PS:泪奔,原来发现不知道为什么一下载音频图片资源就会清空缓存,我以为是下载器的问题,后来没有发现清除缓存的代码。因为我的需求是拦截缓存网页的,里面的背景图都很大的,有时候看一两个网页离线之后发现缓存没了。找了找原因,原来是因为NSURLCache默认硬盘缓存是10M,我的缓存是全部缓存,所以很快就超了自动清空,设置大了就好了。