最近在我们的应用程序中遇到崩溃:
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这是一场我们不得不忍受的车祸?这种情况并不经常发生,但已经足够让我们愿意修复了。
最佳答案
我认为当错误发生时,假设request
是nil
是正确的。一个类似的问题被描述为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/