Einführung
Leider ist es in der modernen Welt selbst jetzt nicht immer möglich, die Vorteile
der Push-Technologie zu nutzen, und manchmal müssen Sie Problemumgehungen implementieren, beispielsweise in Form von Long Poll, mit denen Sie den Mechanismus von Push-Benachrichtigungen emulieren können. Ein solcher Bedarf trat insbesondere bei der Implementierung
des VKontakte-Clients für Sailfish OS auf .
In diesem Artikel werden die Prinzipien der Interaktion mit dem Long Poll VKontakte-Server nicht erläutert. Er enthält eine sehr detaillierte
Dokumentation , und grundlegende Beispiele wurden bereits früher veröffentlicht. Stattdessen wird eine praktische Implementierung für eine bestimmte Plattform in Betracht gezogen.
Es versteht sich, dass der Leser mit der Entwicklung von Sailfish OS nicht nur in
QML , sondern auch in
C ++ vertraut ist.
Long Poll Kunde
Die Hauptclientklasse ist die
LongPoll
Klasse, die den Long Poll-Server abfragt und seine Antworten analysiert.
Die Methode
getLongPollServer
, deren Aufgabe es ist, Informationen zum
getLongPollServer
einer Verbindung zum Server
getLongPollServer
, wird während der Anwendungsinitialisierung aufgerufen,
getLongPollServer
Sie sofort Benutzeraktualisierungen erhalten können:
void LongPoll::getLongPollServer() { QUrl url("https://api.vk.com/method/messages.getLongPollServer");
Wenn die Anforderung erfolgreich abgeschlossen wurde, werden die Verbindungsinformationen mit dem Long Poll-Server gespeichert und die Verbindung mit der Methode
doLongPollRequest
geöffnet:
void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());
In der Methode
doLongPollRequest
Long Poll werden die erforderlichen Verbindungsparameter an den Server übergeben:
void LongPoll::doLongPollRequest() { QUrl url("https://" + _server);
Es ist anzumerken, dass der Wert des
mode
gleich 10 erhalten wurde, indem die Option zum Empfangen von Anhängen (2) hinzugefügt und eine erweiterte Reihe von Ereignissen (8) zurückgegeben wurde.
Als Antwort auf das Öffnen einer Verbindung gibt der Server einen JSON zurück, der die neuesten Ereignisse enthält. Die Antwort wird in der
finished
Methode verarbeitet:
void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());
Das
failed
Feld in der Antwort kann vier Werte annehmen, aber nur einer von ihnen, der einem entspricht, erfordert keine wiederholte Anforderung von Informationen, um eine Verbindung zum Long Poll-Server herzustellen. Aus diesem Grund wurde die Bedingung zum Code hinzugefügt.
jObj.value("failed").toInt() == 1
Die
parseLongPollUpdates
Methode ist ein einfacher Zyklus für alle eingehenden Ereignisse mit einer Überprüfung ihres Typs:
enum LONGPOLL_EVENTS { NEW_MESSAGE = 4,
Der Code zeigt, dass der Client für jedes neue Long Poll-Ereignis ein
Signal sendet, das von einem anderen Teil der Anwendung verarbeitet werden muss. Das Signalargument ist nicht das gesamte Ereignisobjekt, sondern nur die erforderlichen Teile. Beispielsweise überträgt das
gotNewMessage
Signal nur die Kennung einer neuen Nachricht, von der der vollständige Inhalt
angefordert wird :
void VkSDK::_gotNewMessage(int id) { _messages->getById(id); }
Als Ergebnis dieser einzeiligen Funktion
wird eine Anforderung an den VKontakte-Server gesendet, um vollständige Informationen über die Nachricht durch ihre Kennung zu erhalten, wobei
das Objekt dieser Nachricht weiter erstellt wird. Abschließend wird ein der Benutzeroberfläche zugeordnetes Signal gesendet, das Daten zu einer neuen Nachricht überträgt, die im Benachrichtigungsfeld
angezeigt wird :
import QtQuick 2.0
Dialogoberfläche
Basierend auf den Prinzipien der Client-Interaktion mit dem Long Poll-Server und den Prinzipien der Übertragung der empfangenen Informationen auf die Benutzeroberfläche können wir nun ein Beispiel für die Aktualisierung eines offenen
Dialogs betrachten .
Das erste, was auffällt, ist die
Connections
Komponente:
Connections {
Der
onUserTyping
Slot verarbeitet das Ereignis eines Satzes, den der Gesprächspartner der Nachricht festgelegt hat, indem er dem Benutzer die entsprechende Benachrichtigung anzeigt. Hier wird im ersten Schritt die Raumkennung erhalten (der Raum bedeutet den allgemeinen Begriff für Dialoge und Chats), und in der zweiten Stufe wird eine Benachrichtigung angezeigt, wenn die empfangene Kennung und die Kennung der aktuellen Raumkennung übereinstimmen.
Es ist zu beachten, dass eine Benachrichtigung über eine Reihe von Nachrichten zehn Sekunden lang angezeigt wird, wenn während dieser Zeit kein neues Ereignis aufgetreten ist, das die Benachrichtigung erneut aktiviert. Dies wird mit der
Timer
Komponente erreicht:
Label {
Der
onSavedPhoto
Slot
onSavedPhoto
für die Verarbeitung des Endes des
onSavedPhoto
in Nachrichten verantwortlich, was den Rahmen des aktuellen Artikels
onSavedPhoto
.
Das zweite, was von Interesse ist, ist die Nachrichtenliste:
SilicaListView {
Hier ist die
MessageItem
Komponente für die Anzeige einer einzelnen Nachricht verantwortlich. Ihre Berücksichtigung würde den Rahmen dieses Artikels sprengen.
Die Nachrichten selbst stammen aus dem Modell
vksdk.messagesModel
. Dieses Modell ist eine Liste von
Message
, die in Echtzeit mithilfe der Methoden
addProfile
,
readMessages
,
addProfile
,
readMessages
und
clear
aktualisiert werden können:
void MessagesModel::clear() { beginRemoveRows(QModelIndex(), 0, _messages.size());
Allen fünf Methoden gemeinsam ist die Verwendung des
dataChanged
Signals, das angibt, dass die Daten im Modell aktualisiert wurden. Durch das
SilicaListView
dieses Signals werden die
SilicaListView
Elemente aktualisiert, um den aktuellen Status von Nachrichten anzuzeigen. Das Hinzufügen von Nachrichten zu
SilicaListView
erfolgt durch Aufrufen der
endInsertRows
beginInsertRows
und
endInsertRows
, die die
rowsInserted
beginInsertRows
bzw.
endInsertRows
senden. Infolgedessen sieht der Benutzer in Echtzeit neue Nachrichten und deren Status im Dialogfeld.
Fazit
In diesem Artikel wurde die Interaktion mit dem Long Poll-Server bei der Entwicklung für Sailfish OS am Beispiel der VK-Anwendung untersucht. Einige Funktionen der Client-Implementierung und eine Möglichkeit zum Aktualisieren der Benutzeroberfläche in Echtzeit wurden berücksichtigt. Der Code für die in diesem Artikel beschriebene Anwendung ist auf GitHub
verfügbar .