还有,我想下载一个文件(CSV)。 这是一个网站上的登录屏幕后面。 我想表现一个WKWebView
允许用户登录,然后让应用程序下载的文件,他们已经登录后。
我试着下载之外的文件WKWebView
到网站的用户登录后,但会话数据似乎是沙箱,因为它下载登录表单,而不是想要的文件的HTML文档。
我也尝试添加一个WKUserScript
到WKUserContentController
对象,但是当加载非HTML文件中的脚本没有得到运行。
有我的方式来访问该文件,同时允许用户通过登录WKWebView
?
眼下,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中坚持长一点。
所以发送错误报告给苹果,所以苹果开始知道,这些问题严重,需要修复。
你检查来从请求回响应饼干。 你可以使用这样的委托方法。
- (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);
}
我已经完成类似于你想做什么事情:
- 使用Web视图登录,你已经做
- 设置
navigationDelegate
您的WebView - 实施
-webView:decidePolicyForNavigationResponse:decisionHandler
在您的代理 - 当委托方法被调用(在用户登录后),您可以检查
navigationResponse.response
(它转换为NSHTTPURLResponse*
),并寻找一个Set-Cookie
包含你所需要身份验证的会话的会话信息标题。 - 那么你可以手动指定下载CSV
Cookie
与在响应中指定的Cookie中的请求头。
需要注意的是委托方法只要求“主框架”的要求。 这意味着AJAX请求或内部框架不会触发它。 整个页面必须刷新这个工作。
如果您需要触发行为AJAX请求,I帧等你需要注入一些JavaScript。
您可以获取该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()
})
我似乎不具备会话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()