1. Introdução
Infelizmente, mesmo agora, no mundo moderno, nem sempre é possível aproveitar os benefícios
da tecnologia push e, às vezes, é necessário implementar soluções alternativas, por exemplo, na forma de Long Poll, que permite emular o mecanismo de notificações push. Em particular, surgiu essa necessidade ao implementar
o cliente VKontakte para o Sailfish OS .
Este artigo não discutirá os princípios de interação com o servidor Long Poll VKontakte - ele possui
documentação muito detalhada e exemplos básicos já foram publicados
anteriormente . Em vez disso, será considerada uma implementação prática para uma plataforma específica.
Entende-se que o leitor está familiarizado com o desenvolvimento do sistema operacional Sailfish, não apenas em
QML , mas também em
C ++ .
Cliente Long Poll
A classe principal do cliente é a classe
LongPoll
, que consulta o servidor Long Poll e analisa suas respostas.
O método
getLongPollServer
, cuja tarefa é obter informações para abrir uma conexão com o servidor, é chamado durante a inicialização do aplicativo, o que permite que você receba imediatamente atualizações do usuário:
void LongPoll::getLongPollServer() { QUrl url("https://api.vk.com/method/messages.getLongPollServer");
Se a solicitação for concluída com êxito, as informações de conexão com o servidor Long Poll
doLongPollRequest
salvas e a conexão será aberta usando o método
doLongPollRequest
:
void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());
No método
doLongPollRequest
Long Poll, os parâmetros de conexão necessários são transmitidos ao servidor:
void LongPoll::doLongPollRequest() { QUrl url("https://" + _server);
Vale ressaltar que o valor do campo
mode
, igual a 10, foi obtido adicionando a opção de receber anexos (2) e retornando um conjunto estendido de eventos (8).
Como resposta à abertura de uma conexão, o servidor retorna um JSON contendo os eventos mais recentes. A resposta é processada no método
finished
:
void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());
O campo com
failed
na resposta pode assumir quatro valores, mas apenas um deles, igual a um, não requer uma solicitação repetida de informações para conectar-se ao servidor Long Poll. Por esse motivo, a condição foi adicionada ao código.
jObj.value("failed").toInt() == 1
O método
parseLongPollUpdates
é um ciclo simples para todos os eventos recebidos com uma verificação do seu tipo:
enum LONGPOLL_EVENTS { NEW_MESSAGE = 4,
O código mostra que, para cada novo evento Long Poll, o cliente envia um
sinal que deve ser processado por outra parte do aplicativo. O argumento do sinal não é o objeto de evento inteiro, mas apenas as partes necessárias. Por exemplo, o sinal
gotNewMessage
transmite apenas o identificador de uma nova mensagem, pela qual seu conteúdo completo é
solicitado :
void VkSDK::_gotNewMessage(int id) { _messages->getById(id); }
Como resultado dessa função de linha única
, é feita
uma solicitação ao servidor VKontakte para obter informações completas sobre a mensagem pelo seu identificador, com a
criação adicional
do objeto dessa mensagem. Em conclusão, um sinal é enviado associado à interface do usuário, transmitindo dados sobre uma nova mensagem, que é
exibida no painel de notificações:
import QtQuick 2.0
Interface de diálogo
Agora, com base nos princípios de interação do cliente com o servidor Long Poll e nos princípios de transferência das informações recebidas para a interface do usuário, podemos considerar um exemplo de atualização de um
diálogo aberto.
A primeira coisa que chama sua atenção é o componente
Connections
:
Connections {
O slot
onUserTyping
processa o evento de um conjunto pelo interlocutor da mensagem, exibindo a notificação correspondente ao usuário. Aqui, na primeira etapa, é obtido o identificador da sala (a sala significa o termo generalizado para diálogos e bate-papos) e, no segundo estágio, uma notificação é exibida se o identificador recebido e o identificador da sala atual corresponderem.
É importante notar que uma notificação sobre um conjunto de mensagens é exibida por dez segundos, se durante esse período não chegar um novo evento que ativará a notificação novamente. Isso é obtido usando o componente
Timer
:
Label {
O slot
onSavedPhoto
responsável pelo processamento do final do carregamento da imagem nas mensagens, que está além do escopo do artigo atual.
A segunda coisa que interessa é a lista de mensagens:
SilicaListView {
Aqui, o componente
MessageItem
é responsável por exibir uma única mensagem. Sua consideração está além do escopo deste artigo.
As próprias mensagens são obtidas do modelo
vksdk.messagesModel
. Este modelo é uma lista de objetos da
Message
que podem ser atualizados em tempo real usando os métodos
add
,
addProfile
,
readMessages
,
readMessages
e
clear
:
void MessagesModel::clear() { beginRemoveRows(QModelIndex(), 0, _messages.size());
Comum a todos os cinco métodos é o uso do sinal
dataChanged
, que indica que os dados foram atualizados no modelo. A emissão desse sinal atualiza os elementos
SilicaListView
para exibir o status atual das mensagens. A adição de mensagens ao
SilicaListView
fornecida chamando os
endInsertRows
e
endInsertRows
que enviam os
rowsInserted
e
rowsInserted
respectivamente. Como resultado, o usuário verá novas mensagens e seu status em tempo real na caixa de diálogo.
Conclusão
Este artigo examinou a interação com o servidor Long Poll ao desenvolver para o Sailfish OS usando o aplicativo VK como exemplo. Alguns recursos da implementação do cliente e uma maneira de atualizar a interface do usuário em tempo real foram considerados. O código para o aplicativo descrito neste artigo está
disponível no GitHub.