8

我正在尝试将 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 13 上崩溃

但是,在 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) {
    }
}

UITextView 没有问题

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

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

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

在此处输入图像描述

4

6 回答 6

8

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

于 2020-12-18T00:41:48.117 回答
3

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

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

诊断选项

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

于 2021-03-09T00:35:25.820 回答
1

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

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)
于 2020-12-12T07:12:49.113 回答
1

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

于 2021-04-16T16:26:29.183 回答
1

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

于 2021-04-28T09:07:05.567 回答
0

你的 UIViewRepresentable 应该struct不是class

struct WebViewWrapper: UIViewRepresentable {
^^^^^^
于 2020-12-10T12:24:37.853 回答