WKWebView和NSURLProtocol不起作用

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

我尝试了相同的代码,它不适用于新的WKWebView,但我的协议类根本没有被调用。 是否有人遇到同样的问题,或者是否有更好的WKWebView认证方式?

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


更新了iOS 11和macOS 10.13的答案

从iOS 11开始,可以创建WKURLSchemeHandler的子类并将其注册到WKWebView配置中: -[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]

老答案

WKWebView发出请求并呈现进程外的内容,这意味着您的应用程序不会听到他们提出的请求。 如果您缺少某项功能,现在可以开始向Apple发送错误报告和/或增强请求。

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


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


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

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

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

链接地址: http://www.djcxy.com/p/34799.html

上一篇: WKWebView and NSURLProtocol not working

下一篇: Intercepting spawned URL requests from UIWebView