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