WKWebView和NSURLProtocol无法正常工作

时间:2014-06-13 14:51:04

标签: ios uiwebview swift ios8 wkwebview

使用旧的UIWebView时,您可以通过实现自定义NSURLProtocol来捕获请求。我这是为了处理需要身份验证的请求。

我尝试了相同的代码,它不适用于新的WKWebView,但根本没有调用我的协议类。有人遇到同样的问题,还是有更好的方法使用WKWebView进行身份验证?

在没有任何修改的情况下,我在decisionPolicyForNavigationResponse委托函数中得到了401响应。我还尝试使用NSURLConnection连接到服务器并使用NSURLConnectionDataDelegate处理身份验证。这样可行,但WKWebView不会获取存储的凭据。

4 个答案:

答案 0 :(得分:47)

更新了iOS 11和macOS 10.13

的答案

从iOS 11开始,可以声明符合WKURLSchemeHandler协议的对象,并在WKWebView配置中注册它:-[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]

旧答案

WKWebView发出请求并将内容呈现在进程外,这意味着您的应用无法听到他们发出的请求。如果您缺少某项功能,现在是时候向Apple打开错误报告和/或增强请求了。

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


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

答案 1 :(得分:3)

WKWebView具有navigationDelegate属性。如果设置了该委托,WKWebView将调用该委托上的didReceiveAuthenticationChallenge方法(如果该方法已实现)。您需要将身份验证代码放在此方法中。例如:

- (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);
}

答案 2 :(得分:1)

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

它可能使用私有API - 我不确定;)

答案 3 :(得分:0)

如果您仅使用URLProtocol进行身份验证,还有其他方法可以实现此目的。

就像当你从didFailLoad获得错误代码-1202,并使URLConnection进行身份验证时,请重新加载页面。

实际上我也需要将URLProtocol与WKWebView一起使用,lol~