iOS11 WKWebview 由于 NSInvalidUnarchiveOperationException 崩溃

作者:编程家 分类: ios 时间:2025-06-18

iOS 11中的WKWebView在某些情况下可能会由于NSInvalidUnarchiveOperationException而崩溃。这个问题在使用WKWebView加载某些特定类型的网页时会出现,例如包含某些特定类型的JavaScript代码的网页。

这个问题是由于iOS 11中WKWebView的反序列化机制改变所导致的。在iOS 10及之前的版本中,WKWebView使用的是UIWebView的反序列化机制,而在iOS 11中,WKWebView改为使用自己的反序列化机制。

在iOS 11中,WKWebView的反序列化机制更加严格,对于某些特定类型的JavaScript代码,反序列化过程中可能会出现NSInvalidUnarchiveOperationException异常,导致应用崩溃。

为了解决这个问题,我们可以采取以下两种方法之一:

1. 使用SFSafariViewController替代WKWebView:SFSafariViewController是iOS 9引入的一个组件,用于在应用中展示全屏的Safari浏览器。与WKWebView不同,SFSafariViewController不会出现NSInvalidUnarchiveOperationException异常。因此,如果我们的应用中只需要展示网页内容而不需要与网页进行交互,可以考虑使用SFSafariViewController来替代WKWebView。

下面是一个使用SFSafariViewController展示网页的示例代码:

swift

import SafariServices

...

let url = URL(string: "https://www.example.com")

let safariViewController = SFSafariViewController(url: url!)

present(safariViewController, animated: true, completion: nil)

2. 对WKWebView加载的网页进行检查和处理:如果我们的应用需要使用WKWebView来加载网页,并且无法使用SFSafariViewController来替代,那么我们可以在加载网页之前对网页进行检查和处理,避免出现NSInvalidUnarchiveOperationException异常。

下面是一个对WKWebView加载的网页进行检查和处理的示例代码:

swift

import WebKit

...

let webView = WKWebView(frame: view.bounds)

view.addSubview(webView)

let url = URL(string: "https://www.example.com")

let request = URLRequest(url: url!)

webView.navigationDelegate = self

webView.load(request)

swift

extension ViewController: WKNavigationDelegate {

func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {

if let nsError = error as NSError?, nsError.code == NSInvalidUnarchiveOperationException {

// 处理NSInvalidUnarchiveOperationException异常

// 可以在这里尝试重新加载网页或者给用户一个提示

}

}

}

在iOS 11中,WKWebView由于NSInvalidUnarchiveOperationException异常而崩溃是一个已知的问题。为了解决这个问题,我们可以使用SFSafariViewController来替代WKWebView,或者对WKWebView加载的网页进行检查和处理,避免出现异常。根据具体的应用场景,选择适合的解决方案,确保应用的稳定性和用户体验。