【问题标题】:SwiftUI - iOS 13 UIViewRepresentable of WKWebView gets Thread 1: EXC_BREAKPOINT crashSwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃
【发布时间】:2020-12-09 20:54:31
【问题描述】:

我正在尝试将 WKWebView 移植到 SwiftUI。这是我的代码:

import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        WebViewWrapper()
    }
}

/**
 WKWebView ported over to SwiftUI with `UIViewRepresentable`.
 */
final class WebViewWrapper: UIViewRepresentable {
    
    /// `UIViewRepresentable` required function #1.
    func makeUIView(context: Context) -> WKWebView  {
        print("make")
        let webView = WKWebView() /// EXC_BREAKPOINT error here
        return webView
    }
      
    /// `UIViewRepresentable` required function #2
    func updateUIView(_ uiView: WKWebView, context: Context) {
    }
}

就是这样。我创建了一个新的 SwiftUI 项目并将其粘贴进去。但是,我收到了这个错误:

线程 1:EXC_BREAKPOINT(代码=EXC_I386_BPT,子代码=0x0)

... 控制台中没有打印任何内容。这发生在 iOS 13.0 和 iOS 13.1 上。

但是,在 iOS 14.2 上,它运行良好。崩溃似乎也只发生在 WKWebView。例如,如果我将其替换为UITextView,则它可以正常运行。

import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        TextViewWrapper()
    }
}

/**
 UITextView ported over to SwiftUI with `UIViewRepresentable`.
 */
final class TextViewWrapper: UIViewRepresentable {
    
    /// `UIViewRepresentable` required function #1.
    func makeUIView(context: Context) -> UITextView  {
        print("make")
        let textView = UITextView() /// no error, works fine
        return textView
    }
      
    /// `UIViewRepresentable` required function #2
    func updateUIView(_ uiView: UITextView, context: Context) {
    }
}

我在 M1 Mac 上运行 Big Sur 11.0.1,但我认为这应该不是问题。我的 Xcode 版本是 12.2 (12B45b)。

编辑:Big Sur / M1 可能是问题所在。

我刚刚在我的 Intel Mac Catalina 10.15.5 上运行相同版本的 Xcode,它运行良好。

【问题讨论】:

  • 当您使用init(frame: CGRect, configuration: WKWebViewConfiguration) 和非零帧时会发生什么。 ?
  • @WarrenBurton 感谢您的建议,但没有任何改变。 screenshot
  • 适用于 Xcode 12.1 / iOS 13.4。你用的是哪一个?
  • @Asperi 我在 Xcode 12.2 (12B45b) 和 iOS 13.0 上。也在 iOS 13.1 上测试

标签: ios swift swiftui wkwebview uiviewrepresentable


【解决方案1】:

这个问题是由于在 M1 Mac 上运行和使用 14 之前的 iOS 版本的组合造成的。这个问题是 Apple 已知的。

【讨论】:

  • 嗯,那好吧。希望尽快修复!
  • 我也遇到了这种情况。有没有人可以链接到 Apple 的雷达或任何地方来验证 Apple 是否知道并监控其分辨率?
  • 同样的问题,在 xCode 版本 12.5 beta 上没有解决这个问题
  • 不敢相信我买了一个新的 M1,因为我担心我的 2015 年 Macbook 即将装箱并且无法在 ios 模拟器上运行......具有讽刺意味!
  • @BrandonMedenwald 我相信它是雷达://FB8920323,但它不在 Open Radar 上,我不知道如何跟踪进度。
【解决方案2】:

我找到了一个简单的解决方法。
在方案设置中设置以下任何诊断选项都可以防止崩溃。

  • 地址消毒剂
  • 线程消毒剂
  • Malloc 涂鸦
  • Malloc 保护边缘
  • 守卫马洛克
  • Malloc 堆栈日志记录

Diagnostic Options

我使用 Xcode 12.4 (12D4e)、iOS 13.7 Simulator、macOS Big Sur 11.2.3(20D91)和 M1 Apple Silicon Mac 验证了这一点。

【讨论】:

  • 不错!这有什么缺点吗?比如隐藏的控制台消息之类的?
  • @aheze 据我所知,目前没有缺点。
  • 听起来不错。我将在当前答案上留下复选标记,因为它很可能是 Apple 的错误。不过,我投票赞成你的答案。
  • 对不起,我不明白,我们需要勾选还是取消勾选方案中的设置?
  • @xhinoda 是的。您可以通过检查列表中的任何一项来避免崩溃。请参考“诊断选项”的链接图片。
【解决方案3】:

由于不可重现,只是猜测...尝试不同的构造函数,例如

let wkWebConfiguration = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: wkWebConfiguration)

甚至有一些已定义的框架(无论如何,以后对于 SwiftUI 视图层次结构都没有关系)

let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 100, height: 100), 
                        configuration: wkWebConfiguration)

【讨论】:

  • 感谢您的建议!不过我已经用@Warren Burton 的comment 试过了。我也刚刚在我的英特尔 Mac 上进行了测试,并且我的原始代码有效。我认为问题可能出在 Big Sur 或 Apple Silicon 上。
【解决方案4】:

正如 Norman 所说,如果您使用 xcode 12 并运行 ios 版本低于 14 的模拟器,它会破坏应用程序,这是 M1 芯片的问题。我在 2 个系统上对应用程序进行了自我测试,一个在旧 mac 上,一个在带有 m1 芯片的新 mac 上

【讨论】:

  • 是啊... M1 速度快,但测试设备就很头疼
  • 由于兼容性问题,即使您无法在 M1 芯片上运行低于 12 版本的 xcode
【解决方案5】:

我认为 BigSur 11.3 解决了这个问题

【讨论】:

  • 我今天会更新,看看它是否有效。感谢您发布答案!
【解决方案6】:

您的 UIViewRepresentable 应该是 struct 而不是 class

struct WebViewWrapper: UIViewRepresentable {
^^^^^^

【讨论】:

  • 我更改了它,但仍然收到错误:screenshot
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2020-07-05
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多