【问题标题】:How do I properly implement didFailProvisionalNavigation with WKWebView?如何使用 WKWebView 正确实现 didFailProvisionalNavigation?
【发布时间】:2017-12-21 05:32:29
【问题描述】:

我正在制作一个网络浏览器,与其他所有网络浏览器一样,我想通知用户网页加载失败时发生的错误。

目前,我在 didFailProvisionalNavigation 方法中显示错误的 localizedDescription。就是这样!

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
    [self presentError:error.localizedDescription animated:YES];

    [_delegate webViewDidFailNavigation:self error:error];
}

presentError 方法处理一些与问题无关的自定义 UI 内容。

上述方法非常适合显示常见错误,例如:

  1. 互联网连接似乎处于离线状态。
  2. 找不到指定主机名的服务器。

但它也会显示一些不寻常的错误,例如:

  1. 操作无法完成(NSURL ErrorDomain error -999)

我不喜欢这种方法有两个原因:

  • 错误消息显示一些技术内容“NSURL”,但我可以忽略它。
  • 最重要的是,在显示上述错误的大多数情况下,该网页完全可用,但由于这是一个 didFailProvisionalNavigation 错误,我必须禁用该页面,而是显示该错误。

我不知道可能会发生哪些不应该按照我处理它们的方式处理的其他小错误。不幸的是,我不知道如何区分“连接似乎已脱机”等重大错误和“无法完成操作”等小错误。

处理导航失败的标准方法是什么?

【问题讨论】:

    标签: ios objective-c wkwebview


    【解决方案1】:

    我也需要使用 didFailProvisionalNavigation。现在我这样解决了:

    - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(nonnull NSError *)error
    {
        if(error.code != -999) // Prevent the error from showing when didFailProvisionalNavigation is triggered after a cancelled load (reload)
        {
            // Show the error
        }
    }
    

    【讨论】:

    • 但为什么要阻止-999 NSURLErrorCancelled
    • @boog 不想在页面重新加载或更改 URL 的同时仍在加载时显示错误 (?) 除非是因为崩溃或其他原因
    【解决方案2】:

    而不是

    webView(_:didFailProvisionalNavigation:withError:)
    

    你为什么不用这个?

    webView(_:didFail:withError:)
    

    似乎只有在出现阻止站点显示内容的错误时才应该调用它,而不是在页面已经呈现并尝试加载下一页时调用。

    【讨论】:

    • 第一种方法实际上按照它应该的方式运行。它会在正确的时间以所有 URL 错误代码进行响应。当我使用随机字符串“iasdjfoaskfgo.com”进行测试时,didFail:withError: 方法没有触发错误“host not found”
    猜你喜欢
    • 2017-06-29
    • 2017-05-01
    • 1970-01-01
    • 2019-01-27
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多