如何使用WKWebView检索文件?

Dev*_*kle 35 webkit ios ios8 wkwebview

我想下载一个文件(CSV).它位于网站的登录屏幕后面.我想显示一个WKWebView允许用户登录,然后让应用程序在登录后下载文件.

我尝试WKWebView在用户登录网站后下载文件,但会话数据似乎是沙箱,因为它下载了一个带有登录表单而不是所需文件的html文档.

我也尝试WKUserScriptWKUserContentController对象中添加一个,但是在加载非HTML文件时脚本不会运行.

我是否有办法访问此文件,同时允许用户通过WKWebView?登录?

Ale*_*lex 95

眼下,WKWebView情况下,将忽略任何默认网络存储器(NSURLCache,NSHTTPCookieStorage,NSCredentialStorage),你也可以使用自定义的网络请求的标准网络类(NSURLProtocol等).

所以WKWebView实例的cookie不存储在您的应用程序的标准的Cookie存储等NSURLSession/NSURLConnection的只使用标准的Cookie存储有WKWebView的饼干没有访问(和准确这可能是你有问题: "登录状态"很可能存储在cookie中,但NSURLSession/NSURLConnection将不会看到cookie.

对于缓存,凭证等也是如此.WKWebView有自己的私有存储,因此不能很好地使用标准的Cocoa网络类.

您也无法自定义请求(添加自己的自定义HTTP标头,修改现有标头等),使用您自己的自定义URL方案等,因为WKWebView也不支持NSURLProtocol.

所以现在WKWebView对许多应用程序来说都没用,因为它不参与Cocoa的标准网络API.

我仍然希望Apple能够在iOS 8发布之前对其进行更改,因为否则WKWebView对于许多应用程序来说都是无用的,而且我们可能会更长时间地使用UIWebView.

因此,向Apple发送错误报告,以便Apple知道这些问题是严重的,需要修复.

  • 我希望更多人在实施之前发现这篇文章.这完全不明显,我认为这是一个严重的错误.请对此回复进行投票以获得更多可见性,并确保提交至bugreport.apple.com (11认同)
  • 一些问题已通过iOS 9解决.您现在可以使用"WKWebsiteDataStore"类来请求cookie,缓存等.对于某些应用程序,这可能就足够了.但主要限制仍然存在:仍然不支持NSURLProtocol,因此仍无法过滤和自定义WKWebView的网络流量. (3认同)

小智 15

您是否检查了从请求中返回的响应cookie.您可以使用这样的委托方法.

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
    NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;
    NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL];

    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
    }

    decisionHandler(WKNavigationResponsePolicyAllow);
}
Run Code Online (Sandbox Code Playgroud)

  • 我没有为此创建cookie. (2认同)