Présentation
Malheureusement, même maintenant, dans le monde moderne, il n'est pas toujours possible de profiter des avantages de la 
technologie push, et parfois vous devez implémenter des solutions de contournement, par exemple, sous la forme d'un sondage long, qui vous permet d'émuler le mécanisme des notifications push. En particulier, un tel besoin est apparu lors de l'implémentation 
du client VKontakte pour Sailfish OS .
Cet article ne traitera pas des principes d'interaction avec le serveur Long Poll VKontakte - il contient une 
documentation très détaillée et des exemples de base ont déjà été publiés 
précédemment . Au lieu de cela, une mise en œuvre pratique pour une plate-forme spécifique sera envisagée.
Il est entendu que le lecteur est familier avec le développement de Sailfish OS non seulement en 
QML , mais aussi en 
C ++ .
Client Long Poll
La classe client principale est la classe 
LongPoll , qui interroge le serveur Long Poll et analyse ses réponses.
La méthode 
getLongPollServer , dont la tâche est d'obtenir des informations pour ouvrir une connexion au serveur, est appelée lors de l'initialisation de l'application, ce qui vous permet de recevoir immédiatement les mises à jour utilisateur:
  void LongPoll::getLongPollServer() { QUrl url("https://api.vk.com/method/messages.getLongPollServer");  
Si la demande aboutit, les informations de connexion avec le serveur Long Poll sont enregistrées et la connexion est ouverte à l'aide de la méthode 
doLongPollRequest :
  void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());  
Dans la méthode 
doLongPollRequest Long Poll, les paramètres de connexion nécessaires sont transmis au serveur:
  void LongPoll::doLongPollRequest() { QUrl url("https://" + _server);  
Il convient de noter que la valeur du champ 
mode , égale à 10, a été obtenue en ajoutant l'option de réception des pièces jointes (2) et en renvoyant un ensemble étendu d'événements (8).
En réponse à l'ouverture d'une connexion, le serveur renvoie un JSON contenant les derniers événements. La réponse est traitée dans la méthode 
finished :
  void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());  
Le champ ayant 
failed dans la réponse peut prendre quatre valeurs, mais une seule d'entre elles, égale à une, ne nécessite pas de demande répétée d'informations pour se connecter au serveur d'interrogation longue. Pour cette raison, la condition a été ajoutée au code.
 jObj.value("failed").toInt() == 1 
La méthode 
parseLongPollUpdates est un cycle simple pour tous les événements entrants avec une vérification de leur type:
 enum LONGPOLL_EVENTS { NEW_MESSAGE = 4,  
Le code montre que pour chaque nouvel événement Long Poll, le client envoie un 
signal qui doit être traité par une autre partie de l'application. L'argument signal n'est pas l'objet événement entier, mais seulement ses parties nécessaires. Par exemple, le signal 
gotNewMessage ne transmet que l'identifiant d'un nouveau message, par lequel son contenu complet est 
demandé :
 void VkSDK::_gotNewMessage(int id) { _messages->getById(id); } 
Du fait de cette fonction monoligne 
, une demande est faite au serveur VKontakte pour obtenir des informations complètes sur le message par son identifiant avec la 
création ultérieure 
de l' objet de ce message. En conclusion, un signal est envoyé associé à l'interface utilisateur, transmettant des données sur un nouveau message, qui 
s'affiche dans le panneau de notification:
 import QtQuick 2.0  
Interface de dialogue
Maintenant, sur la base des principes de l'interaction du client avec le serveur Long Poll et des principes de transfert des informations reçues vers l'interface utilisateur, nous pouvons considérer un exemple de mise à jour d'un 
dialogue ouvert.
La première chose qui attire votre attention est le composant 
Connections :
 Connections {  
Le créneau 
onUserTyping traite l'événement d'un ensemble par l'interlocuteur du message en affichant la notification correspondante à l'utilisateur. Ici, à la première étape, l'identifiant de la salle est obtenu (la salle signifie le terme généralisé pour les dialogues et les chats), et à la deuxième étape, une notification est affichée si l'identifiant reçu et l'identifiant de la salle actuelle correspondent.
Il convient de noter qu'une notification concernant un ensemble de messages s'affiche pendant dix secondes, si pendant ce temps il n'y a pas eu de nouvel événement qui active à nouveau la notification. Ceci est réalisé en utilisant le composant 
Timer :
 Label {  
La fente 
onSavedPhoto responsable du traitement de la fin du chargement de l'image dans les messages, ce qui dépasse le cadre de l'article actuel.
La deuxième chose qui est intéressante est la liste des messages:
 SilicaListView {  
Ici, le composant 
MessageItem est responsable de l'affichage d'un seul message. Son examen dépasse le cadre de cet article.
Les messages eux-mêmes sont extraits du modèle 
vksdk.messagesModel . Ce modèle est une liste d'objets 
Message qui peuvent être mis à jour en temps réel à l'aide 
clear méthodes 
add , 
prepend , 
addProfile , 
readMessages et 
clear :
  void MessagesModel::clear() { beginRemoveRows(QModelIndex(), 0, _messages.size());  
L'utilisation des signaux 
dataChanged , qui indique que les données ont été mises à jour dans le modèle, est commune aux cinq méthodes. L'émission de ce signal met à jour les éléments 
SilicaListView pour afficher l'état actuel des messages. L'ajout de messages à 
SilicaListView fourni en appelant les 
endInsertRows beginInsertRows et 
endInsertRows qui envoient 
rowsInserted rowsAboutToBeInserted et 
rowsInserted . En conséquence, l'utilisateur verra les nouveaux messages et leur statut en temps réel dans la boîte de dialogue.
Conclusion
Cet article a examiné l'interaction avec le serveur Long Poll lors du développement pour Sailfish OS en utilisant l'exemple de l'application VK. Certaines fonctionnalités de l'implémentation client et un moyen de mettre à jour l'interface utilisateur en temps réel ont été envisagés. Le code de l'application décrite dans cet article est 
disponible sur GitHub.