SwiftUI - iOS 13 WKWebView 的 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃
SwiftUI - iOS 13 UIViewRepresentable of WKWebView gets Thread 1: EXC_BREAKPOINT crash
我正在尝试将 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 项目并将其粘贴进去。但是,我收到此错误:
Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=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,它工作正常。
您的 UIViewRepresentable 应该是 struct
而不是 class
struct WebViewWrapper: UIViewRepresentable {
^^^^^^
由于不可重现,只是猜测...尝试不同的构造函数,例如
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)
问题是由于 运行 在 M1 Mac 上的组合和使用 14 之前的 iOS 版本造成的。Apple 已知该问题。
我找到了一个简单的解决方法。
在方案设置中设置以下任何诊断选项都可以防止崩溃。
- 地址清理器
- 线程清理器
- Malloc 涂鸦
- Malloc 保护边缘
- 守卫 Malloc
- Malloc 堆栈日志记录
Diagnostic Options
我用Xcode 12.4 (12D4e), iOS 13.7 Simulator, macOS Big Sur 11.2.3(20D91)和M1 Apple Silicon Mac.[=11= 验证了这一点]
正如 Norman 提到的那样,如果您使用的 xcode 12 和 运行 模拟器的 ios 版本低于 14,那么它确实会破坏应用程序,这是 M1 芯片的问题。我在 2 个系统上自我测试应用程序,一个在较旧的 mac 上,一个在较新的 mac 上,使用 m1 芯片
我认为 Big Sur 11.3 解决了这个问题
我正在尝试将 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 项目并将其粘贴进去。但是,我收到此错误:
Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=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,它工作正常。
您的 UIViewRepresentable 应该是 struct
而不是 class
struct WebViewWrapper: UIViewRepresentable {
^^^^^^
由于不可重现,只是猜测...尝试不同的构造函数,例如
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)
问题是由于 运行 在 M1 Mac 上的组合和使用 14 之前的 iOS 版本造成的。Apple 已知该问题。
我找到了一个简单的解决方法。
在方案设置中设置以下任何诊断选项都可以防止崩溃。
- 地址清理器
- 线程清理器
- Malloc 涂鸦
- Malloc 保护边缘
- 守卫 Malloc
- Malloc 堆栈日志记录
Diagnostic Options
我用Xcode 12.4 (12D4e), iOS 13.7 Simulator, macOS Big Sur 11.2.3(20D91)和M1 Apple Silicon Mac.[=11= 验证了这一点]
正如 Norman 提到的那样,如果您使用的 xcode 12 和 运行 模拟器的 ios 版本低于 14,那么它确实会破坏应用程序,这是 M1 芯片的问题。我在 2 个系统上自我测试应用程序,一个在较旧的 mac 上,一个在较新的 mac 上,使用 m1 芯片
我认为 Big Sur 11.3 解决了这个问题