线程 1:访问外部时从 Web 视图发出 SIGABRT 信号 link

Thread 1: signal SIGABRT from web view when accessing external link

我目前正在尝试通过 WebView 在移动设备(iPhone 和 iPad)上部署响应式网站。

以下是有关该应用程序的一些详细信息:

源代码:

ViewController.swift

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

// edit the url the app should load here
private var domain = "https://example.com/"

@IBOutlet weak var webView: WKWebView!

override func loadView()  {
    //delegates the navigation of other urls while still inside the webview
    let webConfiguration = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero, configuration: webConfiguration)
    webView.navigationDelegate = self
    webView.allowsLinkPreview = false
    view = webView
}

override func viewDidLoad() {
    super.viewDidLoad()
    // calls the website in a 'iframe' style
    let url = URL(string: domain)
    let request = URLRequest(url: url!)
    webView.load(request)


}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping ((WKNavigationActionPolicy) -> Void)) {

    // outputs are for debugging purpose
    print("webView :\(webView)" + "\n")
    print("decidePolicyForNavigationAction :\(navigationAction)" + "\n")
    print("decisionHandler :\(decisionHandler)" + "\n")

    switch navigationAction.navigationType {
    case .linkActivated:
        print("request : " + navigationAction.request.url!.absoluteString)
        self.webView?.load(navigationAction.request)
        return
    default:
        break
    }

    if let url = navigationAction.request.url {
        print("url : " + url.absoluteString)
    }
    decisionHandler(.allow)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

AppDelegate.swift :

import UIKit
import WebKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    return true
}

}

我在尝试打开外部和内部 links 时遇到了麻烦;该应用程序将抛出信号 SIGABRT。

据我了解,此错误通常发生在 Outlet 不匹配时,但我的项目只有一个 Outlet (WebView / ViewController)。我试过删除它并重新创建它无济于事。

如果问题是在从外部 link 加载的页面和我的应用程序之间没有创建 Outlet,我不知道如何解决这个问题,因为我无法控制网站。

注意:当我将 webView.allowsLinkPreview 设置为 true(在 func loadView() 中)时,应用程序会加载新页面但会花费大量时间。当发生这种情况时,函数 webView 也不会被第二次调用。

任何帮助将不胜感激。 谢谢。

编辑。根据评论中的要求,这是调试器抛出的内容:

libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) 

此外,Thread 1 SIGABRT 信号似乎在 AppDelegate class。

有趣的错误信息应该是

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Completion handler passed to -[myAppName webView:decidePolicyForNavigationAction:decisionHandler:] was not called'

webView(_ webView:, decidePolicyFor navigationAction:, decisionHandler:) 中,在一种特定情况下你不这样做 decisionHandler(someValue),这就是它崩溃的原因。

所以在

case .linkActivated:
    print("request : " + navigationAction.request.url!.absoluteString)
    self.webView?.load(navigationAction.request)
    return

您需要在执行 return 之前执行 decisionHandler(someValue)