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)

SwiftUI WebKit WKWebView:如何支持多 url

在 SwiftUI 中关闭 WKWebView

SwiftUI如何监听WKWebView加载网页的进度

iOS14,WKWebView 无法打开带有 _blank 目标的链接