WKWebView 是一个多进程组件

但实际上 WKWebView 是一个多进程组件,Network Loading 以及 UI Rendering 在其它进程中执行。

 

因为WKWebView属于webkit框架,因此WKWebView的网络请求、内容加载/渲染都是在WK Process中进行,但NSURLProtocol拦截请求还在App Process,一旦注册http(s) scheme后,网络请求将从独立进程中发送到App Process,这样自定义的NSURLProtocol才能拦截到网络请求,为了提升进程间通信效率,出于性能上的考虑,Apple会将requestbody数据丢弃,因为body数据(二进制类型)大小没有限制,size偏大的话就会对数据传输效率有严重影响进而影响到拦截请求时的操作及延时后续的网络请求,因此,Apple在进行进程间通信时会把post请求的body丢弃。

 

由于 WKWebView 在独立进程里执行网络请求。一旦注册 http(s) scheme 后,网络请求将从 Network Process 发送到 App Process,这样 NSURLProtocol 才能拦截网络请求。在 webkit2 的设计里使用 MessageQueue 进行进程之间的通信,Network Process 会将请求 encode 成一个 Message,然后通过 IPC 发送给 App Process。出于性能的原因,encode 的时候 HTTPBody 和 HTTPBodyStream 这两个字段被丢弃掉了

参考苹果源码:

https://github.com/WebKit/webkit/blob/fe39539b83d28751e86077b173abd5b7872ce3f9/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm#L61-L88(复制链接到浏览器中打开)

及bug report:

https://bugs.webkit.org/show_bug.cgi?id=138169(复制链接到浏览器中打开)

因此,如果通过 registerSchemeForCustomProtocol 注册了 http(s) scheme, 那么由 WKWebView 发起的所有 http(s)请求都会通过 IPC 传给主进程 NSURLProtocol 处理,导致 post 请求 body 被清空



作者:Aiana
链接:https://www.jianshu.com/p/2339af964e73
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2021-04-19 14:19  zzfx  阅读(772)  评论(0编辑  收藏  举报