aheze
aheze

Reputation: 30298

SwiftUI - iOS 13 UIViewRepresentable of WKWebView gets Thread 1: EXC_BREAKPOINT crash

I'm trying to port WKWebView over to SwiftUI. Here's my code:

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) {
    }
}

That's it. I created a new SwiftUI project and pasted it in. However, I get this error:

Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)

... with nothing printed in the console. This happened for both iOS 13.0 and iOS 13.1.

Crashing on iOS 13

But, on iOS 14.2, it works fine. The crash also seems to happen only for WKWebView. For example, if I replace it with UITextView, it runs without problems.

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 has no problems

I'm running Big Sur 11.0.1 on an M1 Mac, but I don't think that should be a problem. My Xcode version is 12.2 (12B45b).

Edit: Big Sur / M1 might be the problem.

I just ran it on the same version of Xcode on my Intel Mac, Catalina 10.15.5, and it works fine.

enter image description here

Upvotes: 9

Views: 3778

Answers (6)

Satoshi Komatsu
Satoshi Komatsu

Reputation: 11

I think this problem is solved with BigSur 11.3

Upvotes: 1

Geetanshu Gulati
Geetanshu Gulati

Reputation: 772

As Norman mentioned it's true if you are using xcode 12 and running simulator having ios version less than 14 it will break the application, it's problem with M1 chip. I my self test the application on 2 systems one on older mac and one on newer mac with m1 chip

Upvotes: 1

Koze
Koze

Reputation: 51

I found a simple workaround.
Setting any of the following diagnostic options in the scheme settings will prevent the crash.

  • Address Sanitizer
  • Thread Sanitizer
  • Malloc Scribble
  • Malloc Guard Edges
  • Guard Malloc
  • Malloc Stack Logging

Diagnostic Options

I verified this with Xcode 12.4 (12D4e), iOS 13.7 Simulator, macOS Big Sur 11.2.3(20D91) and M1 Apple Silicon Mac.

Upvotes: 5

Norman
Norman

Reputation: 3205

The problem is due to a combination of running on an M1 Mac and using an iOS version prior to 14. The problem is known to Apple.

Upvotes: 9

Asperi
Asperi

Reputation: 257653

As not reproducible, just guessing... try different constructors, like

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

or even with some defined frame (anyway it does not matter later for SwiftUI view hierarchy)

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

Upvotes: 1

Casper Zandbergen
Casper Zandbergen

Reputation: 3687

Your UIViewRepresentable should be a struct not a class

struct WebViewWrapper: UIViewRepresentable {
^^^^^^

Upvotes: 1

Related Questions