Я пытаюсь создать приложение VOIP
, используя библиотеку с именем VailerSIPLib
. Поскольку библиотека была построена с использованием Obj-C
и интенсивным использованием NotificationCenter
для публикации изменений, активные состояния повсюду.
В настоящее время я нахожусь в CallView
части проекта, я могу начинать, заканчивать, отклонять звонки. Однако мне нужно реализовать connectionStatus
в представлении, которое будет предоставлять информацию о вызове, такую как продолжительность, «соединение ..», «отключено», «звонки» и т. Д.
Код ниже находится в 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
я не смог найти ничего связанного с этим.