WKWebView和NSURLProtocol不起作用

43

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

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

如果没有进行任何修改,我将在decidePolicyForNavigationResponse委托函数中收到401响应。我还尝试使用NSURLConnection连接到服务器,并使用NSURLConnectionDataDelegate处理身份验证。那个方法是可行的,但WKWebView没有检测到存储的凭据。

4个回答

56

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
如此令人失望。苹果有没有给出这个变化的任何理由? - Alex
@Alex,这个外部进程使得实现变得困难。 - Léo Natan
1
感谢您更新最新的iOS SDK!令人失望的是,它仍然没有得到支持...希望已经开了很多radar来实现这一目标。 - karlbecker_com
这是在iOS 11中添加的。 - catlan
1
@Neftanic 如果你要使用私有API,至少要尝试最小化隐藏它。你可以在谷歌上搜索如何做到这一点。 - Léo Natan
显示剩余3条评论

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

1

这很有趣,尽管写得有些奇怪。所需的只是调用[WKBrowsingContextController registerSchemeForCustomProtocol:@"schemes"]; - Léo Natan

0

如果您只是为了身份验证而使用URLProtocol,则有其他方法可以实现。

例如,当您从didFailLoad获得错误代码-1202时,并进行URLConnection以执行身份验证操作后,重新加载页面。

实际上,我也需要在WKWebView中使用URLProtocol,哈哈~


我尝试了那个解决方案,但是在重新加载后WKWebView没有获取到凭据。 - Johan
很抱歉听到这个消息,如果你有任何消息,请告诉我。 - ivanC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接