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

EXC_BREAKPOINT 0x00000001c5c8986c
static URLRequest._unconditionallyBridgeFromObjectiveC(_:)

它来自一个webView decise策略,我们在其中访问请求属性:
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方面,请求可能是nil。
我的问题是关于如何绕行objc到swift桥。KVC会避免吗?
if let req = navigationAction.sourceFrame.value(forKey: "request") as NSURLRequest {
    //do stuff
}

如果没有办法绕过objc到swift bridge这是一场我们不得不忍受的车祸?这种情况并不经常发生,但已经足够让我们愿意修复了。

最佳答案

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

关于ios - 用KVC绕过ObjC到Swift桥?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56467123/

10-12 12:54
查看更多