首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NSURLProtocol中的WKWebView lost body

NSURLProtocol是一个用于拦截和处理网络请求的类,它是iOS开发中的一个重要组件。而WKWebView是iOS中的一种用于展示网页内容的控件。在某些情况下,使用NSURLProtocol拦截WKWebView的网络请求时,可能会导致请求的body丢失的问题。

具体来说,当我们使用NSURLProtocol拦截WKWebView的网络请求时,NSURLProtocol会在请求发出前拦截请求,并提供一个机会让我们修改请求的内容。然而,由于WKWebView的网络请求是在一个单独的进程中进行的,而NSURLProtocol只能在主进程中拦截请求,因此在拦截过程中,请求的body可能会丢失。

这个问题的解决方法是使用WKWebView的自定义URL Scheme来绕过NSURLProtocol的拦截。具体步骤如下:

  1. 在WKWebView加载网页之前,注册一个自定义的URL Scheme,例如"myapp"。
  2. 在NSURLProtocol的子类中,重写+canInitWithRequest:方法,判断请求的URL Scheme是否为自定义的Scheme,如果是,则返回YES,表示可以拦截该请求。
  3. 在重写的+canInitWithRequest:方法中,可以通过调用[NSURLProtocol setProperty:forKey:inRequest:]方法,将需要的信息存储到请求中,以便后续处理。
  4. 在重写的+canonicalRequestForRequest:方法中,可以修改请求的内容,包括请求的body。
  5. 在重写的+requestIsCacheEquivalent:toRequest:方法中,可以判断两个请求是否相同。
  6. 在WKWebView加载网页时,使用自定义的URL Scheme来替代原始的URL Scheme,以绕过NSURLProtocol的拦截。

通过以上步骤,我们可以在拦截WKWebView的网络请求时保留请求的body,并进行相应的处理。

腾讯云相关产品中,与NSURLProtocol和WKWebView相关的产品是腾讯云移动浏览器(Tencent Mobile Browser,TMB)。TMB是腾讯云提供的一款移动浏览器解决方案,支持在移动端展示网页内容,并提供了丰富的功能和扩展性。您可以通过以下链接了解更多关于腾讯云移动浏览器的信息:腾讯云移动浏览器产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NSURLProtocolWKWebView 处理

之前写过一篇文章是关于基于 NSURLProtocol DNS 解析,其中对 NSURLProtocol 也有了简单介绍,我们都知道他可以拦截所有基于 URL Loading System 请求...拉下代码直接搜索 NSURLProtocol,看看有没有有关信息 看来的确是有和 NSURLProtocol 有关系,后面通过断点调用栈也找到了 + [NSURLProtocol canInitWithRequest...:] 这样字样,再通过网上查一些资料也证实了我猜想,其实 WKWebview 在一开始时候是会调用到 NSURLProtocol 入口方法 canInitWithRequest ,但是就没有然后了...,也就是说 WKWebview 是和 NSURLProtocol 有一定关联,只是在 NSURLProtocol 入口处返回 NO 所以导致 NSURLProtocol 不接管 WKWebview 请求...关于 post 请求 大家会发现拦截不了 post 请求 (拦截到 post 请求 body 体为空),这个其实和 WKWebview 没有关系,这个是苹果为了提高效率加快流畅度所以在 NSURLProtocol

1.4K30
  • iOS开发之NSURLProtocol那些坑

    接触过iOS系统URL Loading System都知道,NSURLProtocol是如此地强大,可以拦截应用内几乎所有的网络请求(除了WKWebView),并可以修改请求头,返回client任意自定义数据等等...下面主要讲一下NSURLProtocol在使用过程可能会遇到坑,给自己以及需要朋友留个提醒。 1....上面一开始就已经说了,对于WebView请求,目前NSURLProtocol还不能拦截WKWebView请求,只能拦截UIWebview,但后者好像AppStore已经不让审核通过了(尴尬脸)。...NSURLProtocol在拦截NSURLSessionPOST请求时不能获取到RequestHTTPBody,这个貌似早就国外论坛上传开了,但国内好像还鲜有人知,据苹果官方解释是Body是NSData...为了解决这个问题,我们可以通过把Body数据放到Header,不过Header大小好像是有限制,我试过2M是没有问题,不过超过10M就直接Request timeout了。。。

    2.6K91

    WKWebView 那些坑

    简单适配方法本文不再赘述,主要来说说适配 WKWebView 过程填过坑以及善待解决技术难题。...WKWebView Cookie 问题在于 WKWebView 发起请求不会自动带上存储于 NSHTTPCookieStorage 容器 Cookie。...3、WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外进程执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...http(s)请求都会通过 IPC 传给主进程 NSURLProtocol 处理,导致 post 请求 body 被清空; b、对ATS支持不足 测试发现一旦打开ATS开关:Allow Arbitrary...request3 body ,并使用 NSURLConnection 加载 request3,最后通过 NSURLProtocolClient 将加载结果返回 WKWebView; 5、WKWebView

    4.6K130

    iOS WKWebView设置cookie方法总结

    这个问题首先你要明白,WKWebView有自己进程,使用自己存储空间来存储cookie和cache,WKWebView会忽视NSURLCache、NSHTTPCookieStorage、NSCredentialStorage...同时WKWebView发起资源请求也是不经过NSURLProtocol,导致无法自定义请求。...让WKWebview支持NSURLProtocol可参考:NSURLProtocolWKWebView处理 所以这里应该很清楚,NSHTTPCookieStorage已经用不到了,但是你可以把他作为存储...我自己项目里面已经全部删除了它使用 第一种:通过NSMutableURLRequest设置cookie(js开发不推荐) 以我项目为例,这种方法设置cookie,不能被js读取到,在浏览器调试也不能看到...所以cookie尽量设置一些无关紧要参数,或者就尽量不去使用。 毕竟cookie这个坑,踩起来难受!!! 个人不推荐使用Cookie!

    6.1K31

    iOS小技能:【intercept the HTTPHTTPS requests 】利用NSURLProtocol 拦截请求

    前言 动手实践:写一个tweak ,修改请求HTTPHeaderField NSURLProtocol 只能拦截 UIURLConnection、NSURLSession 和 UIWebView 请求...; 对于 WKWebView 中发出网络请求也无能为力,如果真的要拦截来自 WKWebView 请求,还是需要实现 WKWebView 对应 WKNavigationDelegate,并在代理方法获取请求...应用场景: 1、 自定义请求头HTTPHeaderField 2、针对NSURLSessionConfiguration设置代理和端口,让一些特殊请求走自定义隧道IP和端口 I NSURLProtocol...拦截 HTTP 请求 1.1 NSURLProtocol 拦截 HTTP 请求原理 An NSURLProtocol object handles the loading of protocol-specific...HTTP 请求开始时,URL 加载系统创建一个合适 NSURLProtocol 对象处理对应 URL 请求,因此我们只需写一个继承自 NSURLProtocol 类,并通过 - registerClass

    1.3K30

    H5秒开技术选型

    基于NSURLProtocol进行请求拦截,实现预加载3. 基于WKURLSchemeHandler进行自定义scheme注册拦截,实现预加载4....基于NSURLProtocol进行请求拦截,实现预加载描述:在UIWebView上,创建个子类,在子类里面实现protocol代理方法即可实现对所有请求拦截。...拦截对css、js、img等资源加载请求。优点:UIWebView原生支持缺点:WKWebView网络请求独立于主进程,NSURLProtocol无法拦截。...优点:WKWebView原生支持缺点:需要改造前端页面,替换为customScheme。安卓不需要自定义,而且只能支持iOS11。4....WebView(预加载了html),直接调用js设置页面内容通过js控制图片显示,图片懒加载(当图片在可见区域或即将可见才会加载图片),点击加载图片等 Html图片通过ContentProvider

    1.1K40

    NSURLPtotocol 网络hooker

    NSURLProtocol作用 NSURLProtocol可以拦截监听每一个URL Loading System中发出request请求,记住是URL Loading System那些类发出请求,...相对应也有unregistClass方法,不让某个子类起作用,这个起作用时候并不是一定要在appDelegate,你想要他在什么时候起作用,某个请求之前注册他就行,相应不想他起作用就unregist...因为打开一个页面,里面的每一个请求包括网页图片等都会去走一遍子类请求处理判断方法,导致很多想调试request找不到。...WKWebView不起作用,因为WKWebView走得是WebKit内核,不走苹果这一套逻辑,目前貌似还没有有效解决方法。...注意点 可以注册多个NSURLProtocol子类,注册多个NSURLProtocol子类会逆序去执行,也就是先注册子类后执行。

    40820

    Hybrid App 应用 开发 9 个必备知识点复习(WebView 调试 等)

    库加载并使用, UIWebView 限制了; WKWebView 目前缺少关于页码相关 API; WKWebView 提供加载网页进度属性; WKWebView 使用 Safari 相同 JavaScript...WKWebView loadRequest 问题 在 WKWebView 上通过 loadRequest 发起 post 请求 body 数据会丢失,同样是由于进程间通信性能问题, HTTPBody...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外进程执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...如果是用正常 HTTP 和 HTTPs 就是用 WKWebView 自带拦截器,自定义协议用 NSURLProtocol 拦截。...详细可以参考:《NSURLProtocol处理WKWebViewhttp和https请求》 5.

    3.1K00

    iOS小技能:UIWebView 被拒解决方案(用更安全WKWebView替代UIWebView)

    ) WKScriptMessageHandler协议必须实现函数,是APP与js交互,提供从网页收消息回调方法- (void)userContentController:(WKUserContentController...比UIWebView更安全 基于NSURLProtocol实现iOS应用底层所有网络请求拦截(含网页ajax请求拦截【不支持WKWebViewNSURLProtocol 只能拦截 UIURLConnection...、NSURLSession 和 UIWebView 请求; 对于 WKWebView 中发出网络请求也无能为力,如果真的要拦截来自 WKWebView 请求,还是需要实现 WKWebView...对应 WKNavigationDelegate,并在代理方法获取请求。...formdata请求形式在4.0都有了调整,因此需要更改工程相应方法 例如 修改为: [manager GET:urlStr parameters:params headers

    3.2K20

    技术 | Hybrid载体变化(一)

    ,我对于他理解,苹果在iOS8推出新框架“Webkit”,其中WKWebView就是用来替换原来UIWebView,一句话,你用它原来UIWebView出现各种问题都被解决了。...当然随之而来会有一些小问题,比如:WKWebView是一个独立进程,那么它请求就无法通过系统URL SYSTEM了,你无法像UIWebView一样,可以通过NSURLProtocol来拦截所有的请求...:Dictionary = message.body as!...在初始化WKWebView时你还需要配置一个Conf,这个Conf你可以添加一个属性,这个属性在JavaScript这一边你可以通过window.webkit.messageHandlers.icepyApp..., withError error: Error) { // 页面加载错误 print(error) } 每一个delegate实现你都应该去做一条日志记录或者是页面加载完成时间

    86630

    网易严选wkwebview测试之路

    ,作为一名客户端测试人员,我更加关注主要是wkwebview各大特性背后带来测试点,以下就从测试视角分析一下替换wkwebview之后,测试遇到比较多问题:   1、首先就是cookie问题...  以前UIWebView会自动去NSHTTPCookieStorage读取cookie,但是WKWebView并不会去读取,因此导致cookie丢失以及一系列问题,在测试过程我们发现在一个活动页面触发了登录之后...除了测试遇到问题,测试完成之后,我们对wkwebview性能也做了简单统计,主要是为了对比wkwebview相比较于UIwebview优势在哪里,我们针对两种不同webview,在APP内进行一些正常用户行为操作...依据职责单一原则,拆分成了三个协议去实现WebView响应,解耦了JS交互和加载进度响应处理。但是他有一个最致命缺陷,就是WKWebView请求不能被NSURLProtocol截获。...而UIwebview可以让app对于H5容器使用NSURLProtocol技术将H5进行离线包处理,H5图片和Native图片公用一套缓存,因此WKWebView是没有做缓存处理,对网页需要缓存加载性能要求没那么高还是可以考虑

    1.7K10

    浅谈iOSWKWebView添加cookie

    https://blog.csdn.net/u010105969/article/details/53942862 最近开发新功能,其中有加载网页需求,而最近又了解到了WKWebView,说是耗内存小...因为需要与网页进行交互,而之前使用UIWebView发现与网页交互并不是很好,于是这次决定使用WKWebView。...在体会着使用新控件且更好控件喜悦时候,一个新问题出现了--加载网页,后台无法及时获取cookie。后台无法及时获取cookie,在加载网页时候就无法加载到正确数据。...(需要多加载几次网页,才能加载到正确数据) 在查阅相关资料后,发现在使用WKWebView时候需要我们手动添加cookie到网页。...在使用WKWebView时候手动添加cookie: NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary]; NSMutableString

    2.2K10

    一个 Hybrid SDK 设计与实现

    这样客户端可以做事情就非常多了,举个例子,NSURLProtocol 无法拦截 WKWebview 发起网络请求,采用 Hybrid 方式交由客户端来发送,便可以实现对应拦截。...当URL Loading System使用NSURLRequest去获取资源时候,它会创建一个NSURLProtocol子类实例,你不应该直接实例化一个NSURLProtocolNSURLProtocol...WKWebView 网络请求拦截 方法一(Native 侧): 原生 WKWebView 在独立于 app 进程之外进程执行网络请求,请求数据不经过主进程,因此在 WKWebView 上直接使用 NSURLProtocol...registerSchemeForCustomProtocol:@"https"] 但是因为出于性能原因,WKWebView 网络请求在给主进程传递数据时候会把请求 body 去掉,导致拦截后请求...body 参数丢失。

    1.3K10

    【Hybrid】288- Hybrid App 应用开发 9 个必备知识点复习

    限制了; WKWebView 目前缺少关于页码相关 API; WKWebView 提供加载网页进度属性; WKWebView 使用 Safari 相同 JavaScript 引擎; WKWebView...WKWebView Cookie 问题 WKWebView Cookie 问题在于 WKWebView 发起请求不会自动带上存储于 NSHTTPCookieStorage 容器 Cookie,而在...原因是: WKWebView 拥有自己私有存储,不会将 Cookie 存入到标准 Cookie 容器 NSHTTPCookieStorage 。...WKWebView loadRequest 问题 在 WKWebView 上通过 loadRequest 发起 post 请求 body 数据会丢失,同样是由于进程间通信性能问题, HTTPBody...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外进程执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol

    2.3K20

    iOS开发WKWebView与JS交互

    /u010105969/article/details/53189934),可当时用来展示网页控件是UIWebView,而在iOS8之后苹果推出了WKWebView,此控件也能用来显示网页,可与JS交互却与...注意:在利用UIWebView展示网页时候我们如果要想与JS进行交互那么我们就得获取JS代码方法名,而我们在使用WKWebView时候就不用了。...首先需要增加html代码,如在“111111”按钮点击事件增加代码:  window.webkit.messageHandlers.AppModel.postMessage({body: 'call...js alert in js'}); AppModel是我们注入对象,“()”内容是我们传递给客户端数据。...客户端需增加代码: // 注入JS对象名称AppModel,当JS通过AppModel来调用时, // 我们可以在WKScriptMessageHandler代理接收到  [config.userContentControlleraddScriptMessageHandler

    2.3K20

    Hybrid App 应用开发 9 个必备知识点复习

    UIWebView 限制了; WKWebView 目前缺少关于页码相关 API; WKWebView 提供加载网页进度属性; WKWebView 使用 Safari 相同 JavaScript...WKWebView Cookie 问题 WKWebView Cookie 问题在于 WKWebView 发起请求不会自动带上存储于 NSHTTPCookieStorage 容器 Cookie,...原因是: WKWebView 拥有自己私有存储,不会将 Cookie 存入到标准 Cookie 容器 NSHTTPCookieStorage 。...WKWebView loadRequest 问题 在 WKWebView 上通过 loadRequest 发起 post 请求 body 数据会丢失,同样是由于进程间通信性能问题, HTTPBody...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外进程执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol

    2.7K20

    script在head和在body区别

    区别: 在HTML body部分JavaScript会在页面加载时候被执行。 在HTML head部分JavaScripts会在被调用时候才执行,但是在主页和其余部分代码之前预先装载。...JavaScript应放在哪里 head 部分脚本: 需调用才执行脚本或事件触发执行脚本放在HTMLhead部分。...body 部分脚本: 当页面被加载时立即执行脚本放在HTMLbody部分。放在body部分脚本通常被用来生成页面的内容。...body 和 head 部分可同时有脚本: 你可在文件中放无数脚本,因此你文件可以在body和head部分同时存在脚本。...(常规html结构都是head在前,body在后)如果headjs代码是需要传入一个参数(在body调用该方法时,才会传入参数),并需调用该参数进行一系列操作,那么这时候肯定就会报错,因为函数该参数未定义

    2.9K42
    领券