由于 NSInvalidUnarchiveOperationException 导致 iOS11 WKWebview 崩溃

Posted

技术标签:

【中文标题】由于 NSInvalidUnarchiveOperationException 导致 iOS11 WKWebview 崩溃【英文标题】:iOS11 WKWebview crash due to NSInvalidUnarchiveOperationException 【发布时间】:2018-04-18 22:33:41 【问题描述】:

使用 ObjectiveC,我正在开发一个针对 ios 11 的 SingleView 应用程序,该应用程序具有一个视图控制器/视图。在视图顶部的 Main.storyboard 中,我放置了一个 WebKit 视图 (WKWebView)。

我在模拟器和运行 iOS 11.0.1 的 iPhone 6 上都看到了崩溃:

由于未捕获的异常“NSInvalidUnarchiveOperationException”而终止应用程序,原因:“无法实例化名为 WKWebView 的类”

我还需要其他什么才能让它工作吗?从情节提要唤醒后,它似乎无法实例化 WKWebView。

其他细节:

Xcode 版本 9.0 9A235 当我从情节提要中删除 WKWebView 时,崩溃消失了 App Base SDK - 最新 iOS (iOS 11);部署目标 11.0 使用 WebView(已弃用) -- UIWebView,它可以工作 我没有尝试手动实例化它

崩溃堆栈:

2017-11-06 18:38:27.765519+0200 XYZZMap[15689:1093338] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named WKWebView'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001056d01cb __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x0000000105032f41 objc_exception_throw + 48
    2   CoreFoundation                      0x0000000105744b95 +[NSException raise:format:] + 197
    3   UIKit                               0x000000010692d2c0 UINibDecoderDecodeObjectForValue + 323
    4   UIKit                               0x000000010692d5db UINibDecoderDecodeObjectForValue + 1118
    5   UIKit                               0x000000010692d172 -[UINibDecoder decodeObjectForKey:] + 89
    6   UIKit                               0x00000001062f866b -[UIView initWithCoder:] + 969
    7   UIKit                               0x000000010692d43d UINibDecoderDecodeObjectForValue + 704
    8   UIKit                               0x000000010692d172 -[UINibDecoder decodeObjectForKey:] + 89
    9   UIKit                               0x00000001066dd1a7 -[UIRuntimeConnection initWithCoder:] + 178
    10  UIKit                               0x000000010692d43d UINibDecoderDecodeObjectForValue + 704
    11  UIKit                               0x000000010692d5db UINibDecoderDecodeObjectForValue + 1118
    12  UIKit                               0x000000010692d172 -[UINibDecoder decodeObjectForKey:] + 89
    13  UIKit                               0x00000001066dc3a4 -[UINib instantiateWithOwner:options:] + 1262
    14  UIKit                               0x00000001063f8d07 -[UIViewController _loadViewFromNibNamed:bundle:] + 383
    15  UIKit                               0x00000001063f9610 -[UIViewController loadView] + 177
    16  UIKit                               0x00000001063f9941 -[UIViewController loadViewIfRequired] + 195
    17  UIKit                               0x00000001063fa19e -[UIViewController view] + 27
    18  UIKit                               0x00000001062cdd17 -[UIWindow addRootViewControllerViewIfPossible] + 122
    19  UIKit                               0x00000001062ce41f -[UIWindow _setHidden:forced:] + 294
    20  UIKit                               0x00000001062e12bf -[UIWindow makeKeyAndVisible] + 42
    21  UIKit                               0x0000000106255015 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4711
    22  UIKit                               0x000000010625a245 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1720
    23  UIKit                               0x0000000106615c6c __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 924
    24  UIKit                               0x00000001069e33ef +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153
    25  UIKit                               0x0000000106615865 -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 249
    26  UIKit                               0x00000001066160c3 -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 668
    27  UIKit                               0x0000000106f73c11 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 262
    28  UIKit                               0x0000000106f73aca -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 444
    29  UIKit                               0x0000000106c61b9c __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 420
    30  UIKit                               0x0000000106e5cc3e _performActionsWithDelayForTransitionContext + 100
    31  UIKit                               0x0000000106c61998 -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 231
    32  UIKit                               0x00000001069e2a4c -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392
    33  UIKit                               0x0000000106258ac6 -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 523
    34  UIKit                               0x0000000106821523 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 369
    35  FrontBoardServices                  0x000000010b539158 -[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 338
    36  FrontBoardServices                  0x000000010b541c4d __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 235
    37  libdispatch.dylib                   0x00000001096b643c _dispatch_client_callout + 8
    38  libdispatch.dylib                   0x00000001096bbaf4 _dispatch_block_invoke_direct + 592
    39  FrontBoardServices                  0x000000010b56d672 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
    40  FrontBoardServices                  0x000000010b56d328 -[FBSSerialQueue _performNext] + 464
    41  FrontBoardServices                  0x000000010b56d897 -[FBSSerialQueue _performNextFromRunLoopSource] + 45
    42  CoreFoundation                      0x00000001056732b1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    43  CoreFoundation                      0x0000000105712d31 __CFRunLoopDoSource0 + 81
    44  CoreFoundation                      0x0000000105657c19 __CFRunLoopDoSources0 + 185
    45  CoreFoundation                      0x00000001056571ff __CFRunLoopRun + 1279
    46  CoreFoundation                      0x0000000105656a89 CFRunLoopRunSpecific + 409
    47  GraphicsServices                    0x000000010be609c6 GSEventRunModal + 62
    48  UIKit                               0x000000010625bd30 UIApplicationMain + 159
    49  XYZZMap                             0x00000001047274bf main + 111
    50  libdyld.dylib                       0x0000000109732d81 start + 1
    51  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

谢谢!

【问题讨论】:

【参考方案1】:

加载 nib/storyboard 时出现 NSInvalidUnarchiveOperationException 意味着 nib/storyboard 中有一个运行时不理解的对象。这是因为缺少定义这种对象的框架。

因此,在这种情况下,您需要将应用目标链接到 WebKit 框架,以便应用在从情节提要解码时了解 WKWebView 是什么。

这是一个屏幕截图,显示了正确配置后应用目标的构建阶段:

【讨论】:

嗨,我也面临同样的错误,也已经添加了 webkit 框架。知道为什么会这样吗? 简单,当您考虑时。 @Matrix 如果您遇到问题,请确保您进行了清理和重建,并确保您已将框架添加到正确的目标 你太棒了,这是我的问题 我遇到了这个问题,行为很奇怪。如果我启动应用程序并尝试立即使用 web 视图,它会崩溃。但是,如果我先做其他事情,然后在下次启动应用程序时需要 webview,它就可以正常工作。我没有链接 webkit 框架。有没有可能在第一次运行时出现问题? 当我在 ios 14 中运行我的应用程序时,我没有收到此错误,但在 ios 13 中运行时我收到此错误。为什么这是 13 而不是 14【参考方案2】:

选择目标 -> 常规 -> 链接的框架和库 -> 点击下面的 + 符号 -> 搜索 webKit.Framwork -> 添加。

【讨论】:

Xcode -> TARGETS -> YourTarget -> Link Binary With Libraries -> + -> 选择要添加的框架和库:-> 输入 webKit -> WebKit.framework -> 添加![enter image description here]( i.stack.imgur.com/vkvTc.png)【参考方案3】:

我也遇到过同样的问题。

没有将 WKWebView 声明为 Outlet

在模拟器中运行时遇到此错误

添加 Outlet 后,它对我来说效果很好。

希望这会有所帮助:)

【讨论】:

【参考方案4】:

检查故事板上是否有 WKWebView 实例,而在代码中可能有 UIWebView 实例

【讨论】:

【参考方案5】:

点击Project Target,然后添加webKit.Framwork,如下图所示:

General -> Linked framework and libraries -> 点击下方的 + 符号 -> 搜索 webKit.Framwork -> 添加。

【讨论】:

【参考方案6】:

swift 5.0 ++ 的更新 和 Xcode-11.5 +

如果您在storyboard 中链接WKWebView 后遇到我在下面提到的这个问题。

NSInvalidUnarchiveOperationException',原因:'无法实例化 名为 WKWebView 的类,因为没有找到名为 WKWebView 的类;这 类需要在源代码中定义或从库中链接 (确保类是正确目标的一部分)

只需按照此说明在新的Xcode 中解决此问题。

这是一个屏幕截图,显示了正确配置后项目目标的构建阶段:

【讨论】:

以上是关于由于 NSInvalidUnarchiveOperationException 导致 iOS11 WKWebview 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

由于目标计算机积极拒绝,无法连接。

我在Android Studio工作,由于系统崩溃,一个或多个功能由于频繁的系统崩溃而崩溃。我应该如何恢复它?

SQL Server 服务由于登录失败而无法启动怎么办

Fiddler由于目标计算机积极拒绝,无法连接的解决方法

为啥我收到“由于保护级别而无法访问”错误?

SVN 由于目标机器积极拒绝,无法连接