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.