WKWebView 是一个多进程组件
但实际上 WKWebView 是一个多进程组件,Network Loading 以及 UI Rendering 在其它进程中执行。
因为WKWebView
属于webkit
框架,因此WKWebView
的网络请求、内容加载/渲染都是在WK Process
中进行,但NSURLProtocol
拦截请求还在App Process
,一旦注册http(s) scheme
后,网络请求将从独立进程中发送到App Process
,这样自定义的NSURLProtocol
才能拦截到网络请求,为了提升进程间通信效率,出于性能上的考虑,Apple
会将request
的body
数据丢弃,因为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 这两个字段被丢弃掉了
参考苹果源码:
及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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。