使用旧的UIWebView时,您可以通过实现自定义NSURLProtocol来捕获请求。我这是为了处理需要身份验证的请求。
我尝试了相同的代码,它不适用于新的WKWebView,但根本没有调用我的协议类。有人遇到同样的问题,还是有更好的方法使用WKWebView进行身份验证?
在没有任何修改的情况下,我在decisionPolicyForNavigationResponse委托函数中得到了401响应。我还尝试使用NSURLConnection连接到服务器并使用NSURLConnectionDataDelegate处理身份验证。这样可行,但WKWebView不会获取存储的凭据。
答案 0 :(得分:47)
从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~