0

最近在我们的应用程序中遇到了崩溃:

EXC_BREAKPOINT 0x00000001c5c8986c
static URLRequest._unconditionallyBridgeFromObjectiveC(_:)

它来自 webView 决定我们访问请求属性的策略:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
   let req = navigationAction.sourceFrame.request
}

我相信问题出在 swift lib 中的这一行: https ://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/URLRequest.swift#L298

这里没有守卫,似乎在 objc 方面,请求可能为零。

我的问题是关于如何绕过 objc 来快速桥接。KVC 会避免这种情况吗?

if let req = navigationAction.sourceFrame.value(forKey: "request") as NSURLRequest {
    //do stuff
}

如果没有办法绕过 objc 来快速桥接它是我们将不得不忍受的崩溃?它不会发生得太频繁,但足以让我们愿意修复。

4

1 回答 1

1

我认为你是正确的假设requestnil,当错误发生时。这里描述了一个类似的问题。
因为URLRequest.swift,正如定义的那样apple/swift-corelibs-foundation,如果请求是,您的引用肯定会崩溃nil,因此在这种情况下不能使用它。
一种替代方法是明确使用 KVO,因为func value(forKey key: String) -> Any? 可以返回nil值,请参见此处
但是,只有在调用函数的对象采用协议时才能使用它,如果NSKeyValueCoding对象是 的子类,则可以确保这一点NSObject,我无法从您的代码片段中看出这一点。
但是既然你已经在你的问题中提出了这个建议,你试过了吗?

于 2019-06-05T20:36:31.460 回答