我怎样才能使用WKWebView检索文件?我怎样才能使用WKWebView检索文件?(How can

2019-05-13 04:31发布

还有,我想下载一个文件(CSV)。 这是一个网站上的登录屏幕后面。 我想表现一个WKWebView允许用户登录,然后让应用程序下载的文件,他们已经登录后。

我试着下载之外的文件WKWebView到网站的用户登录后,但会话数据似乎是沙箱,因为它下载登录表单,而不是想要的文件的HTML文档。

我也尝试添加一个WKUserScriptWKUserContentController对象,但是当加载非HTML文件中的脚本没有得到运行。

有我的方式来访问该文件,同时允许用户通过登录WKWebView

Answer 1:

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

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

这同样适用于高速缓存的情况下,凭证等WKWebView拥有自己的私人储藏,因此不符合标准的可可网络类打好。

你也不能自定义要求(添加自定义HTTP头,修改现有的头,等),使用自定义URL方案等,也因为NSURLProtocol不WKWebView支持。

所以现在WKWebView是许多应用程序相当无用的,因为它不与可可的标准网络API参与。

我还是希望苹果将改变这一点,直到iOS 8的得到释放,否则WKWebView将是无用的许多应用程序,并且我们可能与UIWebView中坚持长一点。

所以发送错误报告给苹果,所以苹果开始知道,这些问题严重,需要修复。



Answer 2:

你检查来从请求回响应饼干。 你可以使用这样的委托方法。

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


Answer 3:

我已经完成类似于你想做什么事情:

  • 使用Web视图登录,你已经做
  • 设置navigationDelegate您的WebView
  • 实施-webView:decidePolicyForNavigationResponse:decisionHandler在您的代理
  • 当委托方法被调用(在用户登录后),您可以检查navigationResponse.response (它转换为NSHTTPURLResponse* ),并寻找一个Set-Cookie包含你所需要身份验证的会话的会话信息标题。
  • 那么你可以手动指定下载CSV Cookie与在响应中指定的Cookie中的请求头。

需要注意的是委托方法只要求“主框架”的要求。 这意味着AJAX请求或内部框架不会触发它。 整个页面必须刷新这个工作。

如果您需要触发行为AJAX请求,I帧等你需要注入一些JavaScript。



Answer 4:

您可以获取该cookie 通过Javascript :

然后,您可以使用所获得的cookie来手动下载文件:

webView.evaluateJavaScript("(function() { return document.cookie })()", completionHandler: { (response, error) -> Void in
  let cookie = response as! String
  let request = NSMutableURLRequest(URL: docURL)
  request.setValue(cookie, forHTTPHeaderField:  "Cookie")

  NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in
    // Your CSV file will be in the response object
  }).resume()
})


Answer 5:

我似乎不具备会话cookie,当我尝试从userContentController didReceiveScriptMessage的请求。

然而,从decidePolicyForNavigationAction调用时,下面的代码检测到我登录。

     let urlPath: String = "<api endpoint at url at which you are logged in>"

    let url = NSURL(string: urlPath)
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in

        let string1 = NSString(data: data, encoding: NSUTF8StringEncoding)
        println(string1)
        println(data)
        if(error != nil) {
            println("Error sending token to server")
            // Print any error to the console
            println(error.localizedDescription)
        }
        var err: NSError?

    })

    task.resume()


文章来源: How can I retrieve a file using WKWebView?