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.