Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
GabrielOmarBatistuta opened this issue Dec 2, 2016 · 14 comments
Open

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

GabrielOmarBatistuta opened this issue Dec 2, 2016 · 14 comments

Comments

@GabrielOmarBatistuta
Copy link

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

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

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

@yeatse
Copy link
Owner

yeatse commented Dec 2, 2016

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

@GabrielOmarBatistuta
Copy link
Author

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

@Corotata
Copy link

Corotata commented Dec 16, 2016

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

@amjunliang
Copy link

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

@gga122
Copy link

gga122 commented Mar 6, 2017

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

@li6185377
Copy link

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

@AKin28
Copy link

AKin28 commented Sep 28, 2017

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

@CodeLife2012
Copy link

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

@saminlu
Copy link

saminlu commented Apr 13, 2018

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

@saminlu
Copy link

saminlu commented Apr 13, 2018

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

@GabrielOmarBatistuta
Copy link
Author

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

@monzy613
Copy link

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

@DongDongDongDong
Copy link

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

12 participants