42

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

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

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

4

4 回答 4

56

更新了 iOS 11 和 macOS 10.13 的答案

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

旧答案

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

从 iOS 10.3 SDK 开始,WKWebView仍然无法NSURLProtocol通过公共 API 使用 custom 。


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

于 2014-06-13T14:55:49.500 回答
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);
}
于 2015-07-07T05:44:38.923 回答
1

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

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

于 2016-12-20T08:20:40.683 回答
0

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

就像当你从 didFailLoad 得到错误代码 -1202 并创建 URLConnection 来进行身份验证时,重新加载页面之后。

其实我也需要使用 URLProtocol 和 WKWebView,lol~

于 2014-06-25T02:11:20.230 回答