WKWebView和NSURLProtocol不起作用

当使用旧的UIWebView时,你可以通过实现一个自定义NSURLProtocol来捕捉请求。 我们这个来处理需要authentication的请求。

我尝试了相同的代码,它不适用于新的WKWebView,但我的协议类根本不被调用。 有人遇到同样的问题,还是有一个更好的方式与WKWebView进行身份validation?

没有任何修改,我在resolvePolicyForNavigationResponse委托函数中得到了一个401响应。 我也尝试使用NSURLConnection连接到服务器,并使用NSURLConnectionDataDelegate处理身份validation。 这工作,但存储的凭据不拾取WKWebView。

更新了iOS 11和macOS 10.13的答案

从iOS 11开始,可以创build一个WKURLSchemeHandler的子类并将其注册到WKWebViewconfiguration中: -[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]

老答案

WKWebView发出请求并将内容呈现在进程外,这意味着您的应用程序不会听到他们提出的请求。 如果您缺less某项function,现在是时候向Apple打开一个错误报告和/或增强请求。

从iOS 10.3 SDK开始, WKWebView仍然无法使用公共API的自定义NSURLProtocol


进取的开发人员已经find了一个有趣的方法: +[WKBrowsingContextController registerSchemeForCustomProtocol:]它应该将提供的scheme添加到自定义协议处理scheme的列表,然后应该使用NSURLProtocol

WKWebView有一个navigationDelegate属性。 如果该WKWebView已设置,则WKWebView将在该WKWebView调用WKWebView方法(如果实现该方法)。 你需要把你的validation码放在这个方法中。 例:

 - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler { NSURLCredential *credential = [[NSURLCredential alloc] initWithUser:@"bob" password:@"pass" persistence:NSURLCredentialPersistenceNone]; completionHandler(NSURLSessionAuthChallengeUseCredential, credential); } 

试试这个方法: https : //github.com/WildDylan/WKWebViewWithURLProtocol/tree/master/Example/WKWebViewWithURLProtocol

这可能是使用私人API – 我不知道;)

如果您只是使用URLProtocol进行身份validation,还有其他方法可以实现这一点。

就像当你从didFailLoad得到一个错误代码-1202,并且做一个URLConnection做authentication的事情之后,重新加载页面。

其实我也需要使用WKWebView的URLProtocol,哈哈〜