NSURLProtocol-WebKitSupport
NSURLProtocol-WebKitSupport copied to clipboard
实际使用时遇到的问题想讨论下.
我想利用WKWebview支持NSURLProtocol后实现类似页面广告屏蔽的功能. 但是实际运用时发现,一旦调用wk_registerScheme:方法注册监听scheme后,一些POST的表单提交就会出现问题.即使在canInitWithRequest:方法中设置对于POST请求的request不处理也不能解决问题.
用代理跟踪请求时发现,未使用NSURLProtocol进行拦截的POST请求中,HTTPBody里包含了表单post的数据.但是使用了NSURLProtocol后,这些请求发送出去的时候没有携带参数.导致请求结果与预想的出现偏差.
如果您有解决方案或者思路,可否一起讨论一下.谢谢~
这个算是 WebKit 的一个缺陷吧。首先 WebKit 进程是独立于 app 进程之外的,两个进程之间使用消息队列的方式进行进程间通信。比如 app 想使用 WKWebView 加载一个请求的话,就要把请求的参数打包成一个 Message,然后通过 IPC 把 Message 交给 WebKit 去加载,反过来 WebKit 的请求想传到 app 进程的话(比如 URLProtocol ),也要打包成 Message 走 IPC。出于性能的原因,打包的时候 HTTPBody 和 HTTPBodyStream 这两个字段被丢弃掉了,这个可以参考 WebKit 的源码(虽然是 mac 的但是我想 iOS 应该也一样),这就导致 -[WKWebView loadRequest:] 传出的 HTTPBody 和 NSURLProtocol 传回的 HTTPBody 全都被丢弃掉了。
所以如果通过 wk_registerScheme 注册了 http scheme,那么由 WebKit 发起的所有 http POST 请求就全都无效了,这个从原理上就是无解的,不过放到 header 里面还是可以的= =。总之这个方法还是只适合用来注册自己定义的 scheme,WebKit 坑还是挺多的😓
恩 之前查阅的资料,确实有看到苹果为了性能原因,回传时HTTPBody和HTTPBodyStream为空了. 谢谢您的回复~ 坑再一点一点踩吧... 感谢~~
当加载 [(UIWebView*)self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://tu.baidu.com"]]]; 会发现会反复取到相同数据,访问http://m.taobao.com永远失败,好像问题很多,感觉这块东西问题很多,你没遇到这方面问题吗?
确实有这个问题,加载某些网页的时候会出现异常,比如 http://www.qiushibaike.com/gif/6-33052.html , 不注册协议,点击图片会进入下一页,下一页...balalala. 注册之后会总会进入一个固定的页面,很是头疼, 不知道是否有方法解决@yeatse
这个代码在Mac OS上使用发现无效,拿到的对象不支持KVC,通过阅读源码发现,这个接口只有ios拥有。
我发现了一招,通过hook ajax 来绕过 post 无法带 body 的问题, 链接: http://www.jianshu.com/p/fb7c6fda2ae7
我在使用时,发现内存泄漏很严重,最后导致崩溃。有解吗?
估计这个只是理论上可行吧
@li6185377 你好,imy_installHookAjax这个还是没作用,注入不了。用了URLProtocol后post 的body都是nil包括HTTPBodyStream
@GabrielOmarBatistuta 请问你解决没,我用了URLProtocol后可以解决ios 11 以下wkwebview携带cookie问题,可是ajax post 的body都是nil包括HTTPBodyStream,请问有解决办法么?感谢🙏
楼上imy_installHookAjax这个没细看,但是看他有提到只是针对ajax的,如果是form表单的提交也没戏. @saminlu
@saminlu 你是要拦截post请求吗? 要拦截的话得在IMYWebProtocol里面自己去实现一个AjaxHandler来进行拦截,而不是在CustomURLProtocol里面拦截
@li6185377 你好,imy_installHookAjax这个还是没作用,注入不了。用了URLProtocol后post 的body都是nil包括HTTPBodyStream
请问body为nil的问题,在最后怎么解决的?