SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃
Posted
技术标签:
【中文标题】SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃【英文标题】:SwiftUI - iOS 13 UIViewRepresentable of WKWebView gets Thread 1: EXC_BREAKPOINT crash 【发布时间】: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 上测试
【参考方案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以上是关于SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
iOS SwiftUI App Clip WKWebView 和 SFSafariViewController 不起作用
SwiftUI:WKWebView 在 macOS 上截断页面内容(NSViewRepresentable)