Cet article ne parle pas du spam téléphonique ni de performances anormales de Flexisip, mais du résultat d’un problème apparu il y a quelques années à cause d’une évolution des plateformes Apple.
Le problème des appareils mobiles
La plupart des proxys SIP ont commencé leur développement en ciblant principalement les appareils dits « fixes », c’est-à-dire des appareils toujours connectés à Internet et surtout sans souci de consommation d’énergie, sur lesquels l’application Linphone fonctionne en permanence. Dans ce cas, lorsqu’un utilisateur est appelé, le proxy tente de router l’appel vers toutes les adresses connues de l’utilisateur. S’il n’y a pas de réponse, le système conclut que l’utilisateur est hors ligne.
Cependant, ce système n’est pas compatible avec les appareils mobiles. Pourquoi ? Il arrive souvent qu’un utilisateur soit « en ligne » sans avoir lancé l’application sur son téléphone. Dans certains cas, les smartphones interrompent ou n’autorisent pas les applications à fonctionner en arrière-plan (pour économiser l’énergie). Le problème est alors que l’utilisateur est identifié comme « hors ligne » par le proxy, qui doit trouver une autre solution pour transmettre l’appel.
L’arrivée des notifications push, une solution pour les mobiles
Les concepteurs de systèmes d’exploitation mobiles ont ensuite proposé des API web permettant d’envoyer des notifications push sur le smartphone de l’utilisateur, soit pour afficher un message à l’utilisateur (message push), soit pour réveiller l’application et transmettre des informations (push en arrière-plan ou push silencieux).
Ce sont ces notifications push qui ont résolu le problème des mobiles injoignables. Lorsqu’un appel est passé, Flexisip tente de contacter les différents appareils de l’utilisateur. S’il détecte qu’un appareil mobile est concerné, il utilise un service de notification push pour envoyer un push silencieux afin que le mobile se reconnecte. Dans ce cas, même si tous les appareils semblent hors ligne, le proxy maintient l’appel pendant un certain temps, en attendant que le mobile se reconnecte après réception de la notification push.
Si l’appel est décroché, raccroché ou annulé sur un autre appareil avant que le mobile ne reçoive le push, le mobile se reconnectera, mais aucun appel ne sera transmis et aucune notification ne sera affichée. Une notification push silencieuse est envoyée, et seule la réception effective de l’appel par l’application déclenche la sonnerie ou une notification.
Limitation du « push silencieux » par Apple
Pour réduire l’utilisation en arrière-plan des applications, Apple a limité le nombre de notifications push silencieuses, nous obligeant à envoyer des push VoIP lorsqu’un appel est passé. L’inconvénient de ce type de push est qu’il fait sonner le téléphone. Si l’utilisateur décroche l’appel sur le téléphone, il n’y a pas de problème, mais si l’appel est décroché, raccroché ou annulé depuis un autre appareil, la notification push déclenchera tout de même la sonnerie, et Linphone ne recevra pas les messages INVITE et/ou CANCEL car l’appel aura déjà été détruit par le proxy.
Pour les utilisateurs d’iPhone, cela peut être assez gênant, leur appareil sonnant alors qu’ils avaient déjà rejeté l’appel ou que l’appelant avait terminé l’appel.
Sauvegarde du contexte de l’appel lors d’un push Apple
Pour résoudre ce problème, le proxy Flexisip conserve désormais les informations de l’appel (les requêtes INVITE et CANCEL) même après la fin de l’appel, afin d’attendre la reconnexion des différents appareils de l’utilisateur. Cela diffère du processus précédent, où l’appel était automatiquement supprimé du proxy une fois décroché, raccroché ou annulé via un autre appareil.
Ainsi, dès qu’un push VoIP est reçu et fait sonner l’appareil, celui-ci peut se réenregistrer et recevoir directement un message INVITE+CANCEL, ce qui arrête la sonnerie et ajoute une entrée dans le journal des appels.
Fini les appels fantômes, dus à un push arrivant après la fin de l’appel !

