假设有一个网页A.html,其中包含指向B.html的链接。
如果单击了B.html,那么shouldStartLoadWithRequest中的request.URL将是B.html,因为它应该是.html。但是,如果加载该页面时出现问题(例如,假设它不存在),那么在didFailLoadWithError中:webView.request.URL的值不是B.html而是A.html。
因此,除非我缓存最后一页加载,否则似乎无法知道哪个页面加载失败,但我原本希望webView.request.URL为B.html,因此这是一个缺陷吗? 我没有看到它应该是什么的文档。
[iOS 6]
答案 0 :(得分:7)
我遇到了同样的问题。如果其他人也这样做,则错误地使用error.userInfo字典。
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
if (error.domain == NSURLErrorDomain) {
if (error.code == NSURLErrorCancelled) { //ignore this one, interrupted load
return;
}
}
}
//NSString *theURLString = [webView.request.URL absoluteString]; this won't work - it just returns the last successful url
NSString *theURLString = [error.userInfo objectForKey:@"NSErrorFailingURLStringKey"]; //this works
doco说在iOS4中不推荐使用NSErrorFailingURLStringKey(仅提供向后兼容性),您应该使用NSURLErrorFailingURLStringErrorKey。
但是不返回NSURLErrorFailingURLStringErrorKey(不管我的UIWebView版本是什么)。相反,NSErrorFailingURLKey是返回URL的另一个键,但我无法在任何地方的文档中找到它。
答案 1 :(得分:1)
我遇到了与Swift 3.1相同的问题。要获取失败的URL,请使用此委托方法:
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool{
let failedUrl = (request.url?.absoluteString)! as String
return true
}
答案 2 :(得分:0)
你是正确的,你需要缓存最后发送的请求(shouldStartLoadWithRequest:
委托方法将是一个很好的地方),作为request
的{{1}}属性}似乎总是返回最后一个成功的请求(尽管documentation没有具体指定这个,所以我不会称之为缺陷)。