• 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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    ------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。
  • 相关阅读:
    Best Time to Buy and Sell Stock III
    Valid Palindrome
    Longest Substring Without Repeating Characters
    Copy List with Random Pointer
    Add Two Numbers
    Recover Binary Search Tree
    Anagrams
    ZigZag Conversion
    Merge k Sorted Lists
    Distinct Subsequences
  • 原文地址:https://www.cnblogs.com/feng9exe/p/14676647.html
Copyright © 2020-2023  润新知