J'essaie de construire un VOIP
utilisant la librairie appelée VailerSIPLib
. Comme la bibliothèque a été construite en utilisant Obj-C
et en utilisant massivement NotificationCenter
de publier les modifications des états actifs partout.
Je suis actuellement à la CallView
Dans le cadre du projet, je peux gérer le début, la fin et le rejet des appels. Cependant, je dois mettre en œuvre connectionStatus
dans la vue qui donne des informations sur l'appel comme la durée, "connexion..", "déconnexion", "sonnerie", etc.
Le code ci-dessous est tout entier dans CallViewModel: ObservableObject
;
Variables :
var activeCall: VSLCall!
@Published var connectionStatus: String = ""
Initialisateur :
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)
}
Méthodes :
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
}
Problème :
Il imprime tout sauf le completionBlock
en setCall(_:)
. listen(_:)
valide que l'état du activeCall
change et je voudrais l'utiliser directement, mais cela ne fonctionne pas toujours correctement. Il devrait être déclenché lorsque l'appel est répondu par callState
valeur de .confirmed
mais c'est parfois le cas. C'est ainsi que je saurai qu'il est temps de démarrer le minuteur.
D'autre part, dans l'exemple de projet de la VialerSIPLib
ils ont utilisé self.activeCall.addObserver(_:)
et cela fonctionne bien. Le problème, c'est qu'il y a une erreur d'exécution au niveau de la méthode, quelque chose comme didObservedValueChange(_:)
et les journaux An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Enfin, un avertissement jaune figure à l'adresse suivante activeCall.observe(_:)
dit
Result of call to 'observe(_:options:changeHandler:)' is unused
mais je n'ai rien trouvé à ce sujet.