【问题标题】:In webView leads to crash and UI unresponsiveness在 webView 中导致崩溃和 UI 无响应
【发布时间】:2022-12-07 12:55:29
【问题描述】:

我添加了一个 WebView 来加载 HTML 和 baseUrl 方法。但这会导致应用程序崩溃并显示警告

不应在主线程上调用此方法,因为它可能会导致 用户界面无响应。

//load HTML
let htmlPath = Bundle.main.path(forResource: "index", ofType: "html")
let folderPath = Bundle.main.bundlePath
let baseUrl = URL(fileURLWithPath: folderPath, isDirectory: true)
do {
    let htmlString = try NSString(contentsOfFile: htmlPath!, encoding: String.Encoding.utf8.rawValue)
    self.webView.loadHTMLString(htmlString as String, baseURL: URL(string: newBaseURL))
} catch {
    // catch error
    print(error.localizedDescription)
}
                          

我在 viewDidLoad() 中调用了这段代码。它还已添加到调度队列中。任何帮助深表感谢。

【问题讨论】:

  • 我希望 self.webView 是 WKWebView 也是你在 XCode 日志中遇到的错误是什么? index.html 文件是否存在于您的包中?
  • @Satheesh 它显示并加载 iframe 但是当加载大数据时它会导致崩溃
  • 崩溃日志,好吗?
  • @Satheesh 现在它没有显示崩溃,但会导致 ui 无响应并断开 iphone。甚至无法调试..
  • 为什么不使用您创建的 bundleURL 变量?代码中使用但未显示的 newBaseURL 变量是什么?为什么要从 folderPath 创建 bundleURL ?为什么不直接使用Bundle.main.bundleURL

标签: ios swift xcode webview wkwebview


【解决方案1】:

从主线程调用loadHTMLString

DispatchQueue.main.async {
      self.webView.loadHTMLString(htmlString as String, baseURL: URL(string: newBaseURL))

}

【讨论】:

  • 已经尝试过但仍然面临同样的问题
  • 是的,需要更多信息。
【解决方案2】:

您有 2 个问题,其中之一是 Apple 本身的错误地址 -

一个。主线程上的 WKWebkit 警告 - Apple 的一位工程师已经介绍了这一点,他在 this 线程上进行了详细介绍。简短回答 - 这是一个错误,Apple 正在进一步发布。现在根据他们的说法,这应该是一个警告,API 本身不应该有任何问题。

b. Web 视图没有响应。如上所述,该警告不应导致任何与 API 相关的问题。因此,为此我建议您检查您尝试单独呈现的 HTML。如果一切正常,也许可以尝试在单独的设备甚至模拟器中启动它。尝试在其他环境(设备/模拟器)中以一致的方式呈现 HTML。我认为您使用的设备操作系统较旧。

请尝试在不同的设备/模拟器上测试相同的 HTML,并在此处分享您的结果。

【讨论】:

    【解决方案3】:

    要解决此问题,您可以使用 DispatchQueue 移动加载 HTML 字符串并将 baseURL 设置为后台线程的代码。这将允许主线程继续运行并处理用户输入,防止应用变得无响应。以下是如何做到这一点:

    DispatchQueue.global(qos: .userInitiated).async {
        let htmlPath = Bundle.main.path(forResource: "index", ofType: "html")
        let folderPath = Bundle.main.bundlePath
        let baseUrl = URL(fileURLWithPath: folderPath, isDirectory: true)
        do {
            let htmlString = try NSString(contentsOfFile: htmlPath!, encoding: String.Encoding.utf8.rawValue)
            DispatchQueue.main.async {
                self.webView.loadHTMLString(htmlString as String, baseURL: URL(string: newBaseURL))
            }
        } catch {
            // catch error
            print(error.localizedDescription)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多