Pendahuluan
Sayangnya, bahkan sekarang, di dunia modern, tidak selalu mungkin untuk mengambil keuntungan dari manfaat
teknologi push dan kadang-kadang perlu untuk menerapkan solusi, misalnya, dalam bentuk Long Poll, yang memungkinkan Anda untuk meniru mekanisme pemberitahuan push. Secara khusus, kebutuhan seperti itu muncul ketika menerapkan
klien VKontakte untuk Sailfish OS .
Artikel ini tidak akan membahas prinsip-prinsip interaksi dengan server Long Poll VKontakte - ini memiliki
dokumentasi yang sangat terperinci, dan contoh-contoh dasar telah dipublikasikan
sebelumnya . Sebaliknya, implementasi praktis untuk platform tertentu akan dipertimbangkan.
Dapat dipahami bahwa pembaca tidak asing dengan pengembangan OS Sailfish tidak hanya di
QML , tetapi juga di
C ++ .
Pelanggan Polling Panjang
Kelas klien utama adalah kelas
LongPoll
, yang menanyakan server Long Poll dan mem-parsing responsnya.
Metode
getLongPollServer
, yang tugasnya memperoleh informasi untuk membuka koneksi ke server, dipanggil selama inisialisasi aplikasi, yang memungkinkan Anda untuk segera menerima pembaruan pengguna:
void LongPoll::getLongPollServer() { QUrl url("https://api.vk.com/method/messages.getLongPollServer");
Jika permintaan berhasil diselesaikan, informasi koneksi dengan server Long Poll disimpan dan koneksi dibuka menggunakan metode
doLongPollRequest
:
void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());
Dalam metode Polling Panjang
doLongPollRequest
, parameter koneksi yang diperlukan diteruskan ke server:
void LongPoll::doLongPollRequest() { QUrl url("https://" + _server);
Perlu dicatat bahwa nilai bidang
mode
, sama dengan 10, diperoleh dengan menambahkan opsi untuk menerima lampiran (2) dan mengembalikan rangkaian acara yang diperpanjang (8).
Sebagai tanggapan untuk membuka koneksi, server mengembalikan JSON yang berisi peristiwa terbaru. Respons diproses dalam metode
finished
:
void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());
Bidang yang
failed
dalam respons dapat mengambil empat nilai, tetapi hanya satu dari mereka, sama dengan satu, tidak memerlukan permintaan berulang untuk informasi untuk terhubung ke server Long Poll. Untuk alasan ini, kondisi ditambahkan ke kode.
jObj.value("failed").toInt() == 1
Metode
parseLongPollUpdates
adalah siklus sederhana untuk semua acara yang masuk dengan centang jenisnya:
enum LONGPOLL_EVENTS { NEW_MESSAGE = 4,
Kode menunjukkan bahwa untuk setiap acara Long Poll baru, klien mengirim
sinyal yang harus diproses oleh bagian lain dari aplikasi. Argumen sinyal bukan objek acara keseluruhan, tetapi hanya bagian yang diperlukan. Misalnya, sinyal
gotNewMessage
hanya mentransmisikan pengidentifikasi pesan baru, yang dengannya konten lengkapnya
diminta :
void VkSDK::_gotNewMessage(int id) { _messages->getById(id); }
Sebagai hasil dari fungsi single-line ini
, permintaan dibuat ke server VKontakte untuk mendapatkan informasi lengkap tentang pesan oleh pengidentifikasi dengan
penciptaan lebih lanjut
dari objek pesan ini. Sebagai kesimpulan, sebuah sinyal dikirim terkait dengan antarmuka pengguna, mentransmisikan data tentang pesan baru, yang
ditampilkan di panel notifikasi:
import QtQuick 2.0
Antarmuka dialog
Sekarang, berdasarkan prinsip-prinsip interaksi klien dengan server Long Poll dan prinsip-prinsip mentransfer informasi yang diterima ke antarmuka pengguna, kita dapat mempertimbangkan contoh memperbarui
dialog terbuka.
Hal pertama yang menarik perhatian Anda adalah komponen
Connections
:
Connections {
Slot
onUserTyping
memproses peristiwa yang diatur oleh lawan bicara pesan dengan menampilkan notifikasi yang sesuai kepada pengguna. Di sini, pada langkah pertama, pengidentifikasi ruangan diperoleh (ruangan berarti istilah umum untuk dialog dan obrolan), dan pada tahap kedua, pemberitahuan ditampilkan jika pengidentifikasi yang diterima dan pengidentifikasi dari pencocokan kamar saat ini.
Perlu dicatat bahwa pemberitahuan tentang sekumpulan pesan ditampilkan selama sepuluh detik, jika selama waktu ini belum ada acara baru yang mengaktifkan kembali pemberitahuan tersebut. Ini dicapai dengan menggunakan komponen
Timer
:
Label {
Slot
onSavedPhoto
bertanggung jawab untuk memproses akhir pemuatan gambar dalam pesan, yang berada di luar cakupan artikel saat ini.
Hal kedua yang menarik adalah daftar pesan:
SilicaListView {
Di sini, komponen
MessageItem
bertanggung jawab untuk menampilkan satu pesan. Pertimbangannya berada di luar cakupan artikel ini.
Pesan itu sendiri diambil dari model
vksdk.messagesModel
. Model ini adalah daftar objek
Message
yang dapat diperbarui secara waktu nyata menggunakan metode
add
,
prepend
,
addProfile
,
readMessages
, dan
clear
:
void MessagesModel::clear() { beginRemoveRows(QModelIndex(), 0, _messages.size());
Umum untuk semua lima metode adalah penggunaan sinyal
dataChanged
, yang menunjukkan bahwa data telah diperbarui dalam model.
SilicaListView
sinyal ini memperbarui elemen
SilicaListView
untuk menampilkan status pesan saat ini. Menambahkan pesan ke
SilicaListView
disediakan dengan memanggil
endInsertRows
rowsAboutToBeInserted
dan
rowsInserted
masing-masing mengirim
rowsAboutToBeInserted
dan
rowsInserted
. Akibatnya, pengguna akan melihat pesan baru dan statusnya secara real time dalam dialog.
Kesimpulan
Artikel ini meneliti interaksi dengan server Long Poll ketika mengembangkan untuk Sailfish OS menggunakan aplikasi VK sebagai contoh. Beberapa fitur dari implementasi klien dan cara untuk memperbarui antarmuka pengguna secara real time dipertimbangkan. Kode untuk aplikasi yang dijelaskan dalam artikel ini
tersedia di GitHub.