绕过 ObjC 以 Swift 与 KVC 桥接?
Circumvent ObjC to Swift bridge with KVC?
最近 运行 我们的应用程序崩溃了:
EXC_BREAKPOINT 0x00000001c5c8986c
static URLRequest._unconditionallyBridgeFromObjectiveC(_:)
它来自我们访问请求的 webView 决定策略 属性:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let req = navigationAction.sourceFrame.request
}
我认为问题出在 swift 库中的这一行:
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 桥,我们将不得不忍受崩溃?它发生的频率不是太高,但足以让我们很乐意修复。
我认为当错误发生时,您假设 request
是 nil
是正确的。 here.
描述了类似的问题
由于 URLRequest.swift
,如 apple/swift-corelibs-foundation
中所定义,如果请求是 nil
,您引用的内容肯定会崩溃,因此在这种情况下无法使用它。
一种选择是明确使用 KVO,因为 func value(forKey key: String) -> Any?
可以 return nil
值,见 here.
但是,您只能使用它,如果调用函数的对象采用 NSKeyValueCoding
协议,如果对象是 NSObject
的子类,则可以确保该协议,我无法从您的代码片段。
但是既然你已经在你的问题中提出了这个建议,你试过了吗?
最近 运行 我们的应用程序崩溃了:
EXC_BREAKPOINT 0x00000001c5c8986c
static URLRequest._unconditionallyBridgeFromObjectiveC(_:)
它来自我们访问请求的 webView 决定策略 属性:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let req = navigationAction.sourceFrame.request
}
我认为问题出在 swift 库中的这一行: 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 桥,我们将不得不忍受崩溃?它发生的频率不是太高,但足以让我们很乐意修复。
我认为当错误发生时,您假设 request
是 nil
是正确的。 here.
描述了类似的问题
由于 URLRequest.swift
,如 apple/swift-corelibs-foundation
中所定义,如果请求是 nil
,您引用的内容肯定会崩溃,因此在这种情况下无法使用它。
一种选择是明确使用 KVO,因为 func value(forKey key: String) -> Any?
可以 return nil
值,见 here.
但是,您只能使用它,如果调用函数的对象采用 NSKeyValueCoding
协议,如果对象是 NSObject
的子类,则可以确保该协议,我无法从您的代码片段。
但是既然你已经在你的问题中提出了这个建议,你试过了吗?