Обойти мост ObjC для Swift с помощью KVC?

Недавно столкнулся со сбоем в нашем приложении:

EXC_BREAKPOINT 0x00000001c5c8986c
static URLRequest._unconditionallyBridgeFromObjectiveC(_:)

Это исходит из политики выбора webView, где мы получаем доступ к свойству запроса:

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

Я считаю, что проблема в этой строке в быстрой библиотеке: https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/URLRequest.swift#L298

Здесь нет охранников, и, похоже, со стороны объекта запрос может быть нулевым.

Мой вопрос касается того, как обойти объект на быстром мосту. Избежал бы этого KVC?

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

Если нет способа обойти объект, ведущий к быстрому мосту, это авария, с которой нам придется жить? Это происходит не слишком часто, но достаточно, чтобы мы хотели исправить.


person gngrwzrd    schedule 05.06.2019    source источник


Ответы (1)


Я думаю, вы правы, предполагая, что request это nil, когда возникает ошибка. Похожая проблема описана здесь.
Поскольку URLRequest.swift, как определено в apple/swift-corelibs-foundation, ваш процитированный окончательный сбой, если запрос nil, его нельзя использовать в этой ситуации.
Одной из альтернатив является окончательное использование KVO, поскольку func value(forKey key: String) -> Any? может возвращать nil значений, см. здесь.
Однако вы можете использовать его только в том случае, если объект, в котором вызывается функция, принял протокол NSKeyValueCoding, что гарантируется, если объект является подклассом NSObject, что я не могу сказать из вашего фрагмента кода.
Но поскольку вы уже предлагали это в своем вопросе, вы пробовали?

person Reinhard Männer    schedule 05.06.2019
comment
Спасибо! Речь идет о классе WKNavigationAction, который является подклассом NSObject. Я попробовал это, и это работает. Я получаю NSMutableURLRequest, который, как я предполагаю, хранится в objc, но не публикуется как изменяемый. В конечном счете, я пытался подтвердить, что это позволит успешно обойти objc-›swift bridge, что, похоже, так и будет. - person gngrwzrd; 06.06.2019
comment
Может быть, вы можете принять мой ответ, даже если решение было вашей идеей, просто чтобы закрыть вопрос? - person Reinhard Männer; 06.06.2019
comment
Я приму это, хотя я еще не подтвердил. Я смогу подтвердить, как только мы выпустим и обновим, и посмотрю, остановит ли это сбой :) - person gngrwzrd; 06.06.2019