Я пытаюсь создать приложение VOIP
, используя lib под названием VailerSIPLib
. Поскольку библиотека была построена с использованием Obj-C
и интенсивно с использованием NotificationCenter
, чтобы опубликовать sh, изменения активных состояний повсюду.
Я в настоящее время в CallView
части проекта, я могу начать, завершить, отклонить вызовы. Тем не менее, мне нужно реализовать connectionStatus
в представлении, которое будет предоставлять информацию о вызове, например, длительность, «подключение ..», «отключение», «звонок» и т. Д. c.
Все приведенные ниже коды приведены в CallViewModel: ObservableObject
;
Переменные:
var activeCall: VSLCall!
@Published var connectionStatus: String = ""
Инициализатор:
override init(){
super.init()
NotificationCenter.default.addObserver(self, selector: #selector(self.listen(_:)), name: Notification.Name.VSLCallStateChanged, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.buildCallView(_:)), name: Notification.Name.CallKitProviderDelegateInboundCallAccepted, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.buildCallView(_:)), name: Notification.Name.CallKitProviderDelegateOutboundCallStarted, object: nil)
}
Методы:
func setCall(_ call: VSLCall) {
self.activeCall = call
self.activeCall.observe(\.callStateText) { (asd, change) in
print("observing")
print("\(String(describing: change.oldValue)) to \(String(describing: change.newValue)) for \(call.callId)")
}
}
@objc func listen(_ notification: Notification) {
if let _ = self.activeCall {
print(self.activeCall.callStateText)
}
}
@objc func buildCallView(_ notification: Notification) {
print("inbound call")
self.isOnCall = true
}
Проблема:
Он распечатывает все, кроме completionBlock
в setCall(_:)
. Функция listen(_:)
подтверждает, что состояние activeCall
меняется, и я бы хотел использовать это напрямую, однако оно не всегда работает корректно. Это должно быть вызвано, когда на вызов ответили со значением callState
, равным .confirmed
, но иногда это происходит. Вот так я узнаю, что пора запускать таймер.
Другое дело, что в примере проекта VialerSIPLib
они использовали self.activeCall.addObserver(_:)
, и он отлично работает. Проблема в том, что он выдает ошибку времени выполнения в методе, похожем на didObservedValueChange(_:)
и записывает в журнал An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Наконец, в activeCall.observe(_:)
появляется предупреждение желтого цвета:
Result of call to 'observe(_:options:changeHandler:)' is unused
который я не смог найти ничего связанного с этим.