【问题标题】:Circumvent ObjC to Swift bridge with KVC?用 KVC 绕过 ObjC 到 Swift 的桥接?
【发布时间】:2019-06-05 19:53:19
【问题描述】:

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

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 来快速桥接它是我们将不得不忍受的崩溃?它发生的频率并不高,但足以让我们愿意修复。

【问题讨论】:

    标签: ios objective-c swift objective-c-swift-bridge


    【解决方案1】:

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

    【讨论】:

    • 谢谢!有问题的类是 WKNavigationAction,它是 NSObject 的子类。我试过了,它有效。我确实收到了一个 NSMutableURLRequest,我猜它是如何存储在 objc 中的,但没有公开公开为可变的。最终,我试图确认这将成功绕过 objc->swift 桥,看起来它会成功。
    • 也许你可以接受我的回答,即使解决方案是你的想法,只是为了结束这个问题?
    • 即使我还没有确认,我也会接受。一旦我们发布和更新,我将能够确认,看看它是否会阻止崩溃:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多