如何使用 WKWebview 检查链接是不是损坏?

Posted

技术标签:

【中文标题】如何使用 WKWebview 检查链接是不是损坏?【英文标题】:How to check if Link is broken with WKWebview?如何使用 WKWebview 检查链接是否损坏? 【发布时间】:2015-10-26 09:34:51 【问题描述】:

我使用WKWebview 加载网址。

let webView = WKWebview()
let request: NSMutableURLRequest = NSMutableURLRequest(URL: url!)
webView.loadRequest(request)

如何检测 webView 应该加载的链接是否损坏?

【问题讨论】:

您是否在发出请求之前尝试加密 url 以避免空格和“#”等损坏的字符? @Manch 这个加密部分怎么做? 对不起,我的意思是对 url 进行编码,所以看看这个线程 ***.com/a/24552028/4194908 @Manch 为什么要对 url 进行编码? 可能你的 url 有空格,或者 '#' 或者任何东西都可能导致你的 url 无法发出请求。 【参考方案1】:

你可以使用canOpenUrl方法:

UIApplication.sharedApplication().canOpenURL(url)

它将进行 url 验证,如果链接正常,则返回 true。 它主要在你打电话之前使用:

UIApplication.sharedApplication().openURL(url) 

确保此链接可以在 safari 中打开,但在这里也应该对您有所帮助。

确保链接以 http:// 或 https:// 开头。

已编辑:

它只会检查链接是否正确。

如果你想查看页面离线、授权问题等可以实现WKNavigationDelegate协议并查看这个方法:

- webView:didFailNavigation:withError:

这应该会给你更多信息。

最好使用:str.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAl‌​lowedCharacterSet())! 它确保您没有传递 URL 中不允许的字符。

编辑 2: 要检测状态码,您可以尝试实现:

- webView:decidePolicyForNavigationResponse:decisionHandler:

导航响应是一个NSURLResponse 实例,但是 每当您发出 HTTP 请求时,您返回的 NSURLResponse 对象实际上是 NSHTTPURLResponse 类的实例,因此您应该将其转换为 NSHTTPURLResponse。那应该给你一个statusCode。 在方法的最后一行你应该调用处理程序,例如decisionHandler(WKNavigationResponsePolicyAllow)

【讨论】:

假设链接是正确的 url。目标页面可能处于脱机状态。我该如何检查? 您是否还建议在调用之前对每个 url 进行编码,就像这里建议的那样:***.com/questions/24551816/swift-encode-url/… @confile 是的,我愿意。您不想传递 URL 中不允许的字符。我会使用:str.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! 您能否将此添加到您的答案中。 当我得到一个 404 时没有错误并且 webView:didFailNavigation:withError 由于重定向没有被调用。【参考方案2】:

参考:Answer exists here

if let url = NSURL(string: yourUrlString) 
    var canOpen = UIApplication.sharedApplication().canOpenURL(url)
 

【讨论】:

【参考方案3】:

如果您想检查 url 字符串是否正确有效 - 只需创建 NSURL 对象,如果路径包含错误,它将转换为 nil

let string = "http://google.com"
let url = NSURL(string: string)

let brokenString = "http:\\brokenurl.12"
let brokenUrl = NSURL(string: brokenString) // nil - it's not valid!

【讨论】:

【参考方案4】:

如果你已经实现了 NSURLConnectionDelegate 那么可以使用下面的解决方案。

可以使用 NSURLConnectionDelegate

didFailWithError 方法。

如果在加载资源期间发生错误,则会调用此方法。

可以参考以下链接 https://developer.apple.com/documentation/foundation/nsurlconnectiondelegate/1418443-connection

【讨论】:

以上是关于如何使用 WKWebview 检查链接是不是损坏?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 wkwebview 是不是在 UItest 中完成加载

如何检查 WKWebView 是不是已加载 HTML 字符串

当 WKWebView 框架调整大小时,内容大小损坏

检查链接是不是有效,如果没有在视觉上将其识别为已损坏

当在 WKWebView 中加载链接时,我如何知道外部应用程序是不是会打开?

如何在 Star Basic 中检查损坏的内部链接?