NSURLProtocol-WebKitSupport icon indicating copy to clipboard operation
NSURLProtocol-WebKitSupport copied to clipboard

实际使用时遇到的问题想讨论下.

Open GabrielOmarBatistuta opened this issue 9 years ago • 14 comments

我想利用WKWebview支持NSURLProtocol后实现类似页面广告屏蔽的功能. 但是实际运用时发现,一旦调用wk_registerScheme:方法注册监听scheme后,一些POST的表单提交就会出现问题.即使在canInitWithRequest:方法中设置对于POST请求的request不处理也不能解决问题.

用代理跟踪请求时发现,未使用NSURLProtocol进行拦截的POST请求中,HTTPBody里包含了表单post的数据.但是使用了NSURLProtocol后,这些请求发送出去的时候没有携带参数.导致请求结果与预想的出现偏差.

如果您有解决方案或者思路,可否一起讨论一下.谢谢~

GabrielOmarBatistuta avatar Dec 02 '16 08:12 GabrielOmarBatistuta

这个算是 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 坑还是挺多的😓

yeatse avatar Dec 02 '16 11:12 yeatse

恩 之前查阅的资料,确实有看到苹果为了性能原因,回传时HTTPBody和HTTPBodyStream为空了. 谢谢您的回复~ 坑再一点一点踩吧... 感谢~~

GabrielOmarBatistuta avatar Dec 03 '16 03:12 GabrielOmarBatistuta

当加载 [(UIWebView*)self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://tu.baidu.com"]]]; 会发现会反复取到相同数据,访问http://m.taobao.com永远失败,好像问题很多,感觉这块东西问题很多,你没遇到这方面问题吗?

Corotata avatar Dec 16 '16 10:12 Corotata

确实有这个问题,加载某些网页的时候会出现异常,比如 http://www.qiushibaike.com/gif/6-33052.html , 不注册协议,点击图片会进入下一页,下一页...balalala. 注册之后会总会进入一个固定的页面,很是头疼, 不知道是否有方法解决@yeatse

amjunliang avatar Jan 16 '17 02:01 amjunliang

这个代码在Mac OS上使用发现无效,拿到的对象不支持KVC,通过阅读源码发现,这个接口只有ios拥有。

gga122 avatar Mar 06 '17 02:03 gga122

我发现了一招,通过hook ajax 来绕过 post 无法带 body 的问题, 链接: http://www.jianshu.com/p/fb7c6fda2ae7

li6185377 avatar Apr 13 '17 02:04 li6185377

我在使用时,发现内存泄漏很严重,最后导致崩溃。有解吗?

AKin28 avatar Sep 28 '17 03:09 AKin28

估计这个只是理论上可行吧

CodeLife2012 avatar Nov 04 '17 11:11 CodeLife2012

@li6185377 你好,imy_installHookAjax这个还是没作用,注入不了。用了URLProtocol后post 的body都是nil包括HTTPBodyStream

saminlu avatar Apr 13 '18 05:04 saminlu

@GabrielOmarBatistuta 请问你解决没,我用了URLProtocol后可以解决ios 11 以下wkwebview携带cookie问题,可是ajax post 的body都是nil包括HTTPBodyStream,请问有解决办法么?感谢🙏

saminlu avatar Apr 13 '18 05:04 saminlu

楼上imy_installHookAjax这个没细看,但是看他有提到只是针对ajax的,如果是form表单的提交也没戏. @saminlu

GabrielOmarBatistuta avatar Apr 16 '18 04:04 GabrielOmarBatistuta

@saminlu 你是要拦截post请求吗? 要拦截的话得在IMYWebProtocol里面自己去实现一个AjaxHandler来进行拦截,而不是在CustomURLProtocol里面拦截

monzy613 avatar May 21 '18 07:05 monzy613

@li6185377 你好,imy_installHookAjax这个还是没作用,注入不了。用了URLProtocol后post 的body都是nil包括HTTPBodyStream

请问body为nil的问题,在最后怎么解决的?

DongDongDongDong avatar May 28 '20 10:05 DongDongDongDong