مقدمة
لسوء الحظ ، حتى الآن ، في العالم الحديث ، ليس من الممكن دائمًا الاستفادة من مزايا
تقنية الدفع ، وأحيانًا يجب عليك تنفيذ الحلول ، على سبيل المثال ، في شكل استطلاع طويل ، والذي يسمح لك بمحاكاة آلية دفع الإشعارات. على وجه الخصوص ، نشأت هذه الحاجة عند تنفيذ
عميل VKontakte لنظام Sailfish OS .
لن تناقش هذه المقالة مبادئ التفاعل مع خادم Long Poll VKontakte - تحتوي على
وثائق مفصلة للغاية ، وقد تم بالفعل نشر أمثلة أساسية في
وقت سابق . بدلاً من ذلك ، سيتم النظر في التنفيذ العملي لمنصة معينة.
من المفهوم أن القارئ على دراية بتطوير Sailfish OS ليس فقط في
QML ، ولكن أيضًا في
C ++ .
عميل استطلاع طويل
فئة العميل الرئيسية هي فئة
LongPoll
، التي تستعلم عن خادم Long Poll وتقوم بتحليل استجاباتها.
يتم
getLongPollServer
طريقة
getLongPollServer
، التي تتمثل مهمتها في الحصول على معلومات لفتح اتصال بالخادم ، أثناء تهيئة التطبيق ، مما يسمح لك بتلقي تحديثات المستخدم على الفور:
void LongPoll::getLongPollServer() { QUrl url("https://api.vk.com/method/messages.getLongPollServer");
إذا تم إكمال الطلب بنجاح ، يتم حفظ معلومات الاتصال بخادم Long Poll ويتم فتح الاتصال باستخدام طريقة
doLongPollRequest
:
void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());
في طريقة
doLongPollRequest
Long Poll ، يتم تمرير معلمات الاتصال الضرورية إلى الخادم:
void LongPoll::doLongPollRequest() { QUrl url("https://" + _server);
تجدر الإشارة إلى أنه تم الحصول على قيمة حقل
mode
، تساوي 10 ، عن طريق إضافة خيار استلام المرفقات (2) وإرجاع مجموعة موسعة من الأحداث (8).
كرد فعل لفتح اتصال ، يعرض الخادم JSON الذي يحتوي على أحدث الأحداث. تتم معالجة الاستجابة بالطريقة
finished
:
void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());
يمكن أن يأخذ الحقل
failed
في الاستجابة أربع قيم ، ولكن واحدة فقط ، تساوي واحدة ، لا تتطلب طلبًا متكررًا للحصول على معلومات للاتصال بخادم الاستطلاع الطويل. لهذا السبب ، تمت إضافة الشرط إلى الرمز.
jObj.value("failed").toInt() == 1
طريقة
parseLongPollUpdates
هي دورة بسيطة لجميع الأحداث الواردة مع التحقق من نوعها:
enum LONGPOLL_EVENTS { NEW_MESSAGE = 4,
يُظهر الرمز أنه لكل حدث Long Poll جديد ، يرسل العميل
إشارة يجب معالجتها بواسطة جزء آخر من التطبيق. الوسيطة إشارة ليست كائن الحدث بأكمله ، ولكن فقط الأجزاء الضرورية. على سبيل المثال ،
gotNewMessage
إشارة
gotNewMessage
فقط معرف الرسالة الجديدة ، والتي يتم من خلالها
طلب محتواها الكامل:
void VkSDK::_gotNewMessage(int id) { _messages->getById(id); }
نتيجة لهذه الوظيفة أحادية الخط
، يتم تقديم طلب إلى خادم فكونتاكتي للحصول على معلومات كاملة حول الرسالة من خلال معرفها مع
إنشاء مزيد
من كائن هذه الرسالة. في الختام ، يتم إرسال إشارة مرتبطة بواجهة المستخدم ، تنقل البيانات حول رسالة جديدة ، والتي يتم
عرضها في لوحة الإخطار:
import QtQuick 2.0
واجهة الحوار
الآن ، استنادًا إلى مبادئ تفاعل العميل مع خادم Long Poll ومبادئ نقل المعلومات المستلمة إلى واجهة المستخدم ، يمكننا التفكير في مثال لتحديث
حوار مفتوح.
أول شيء يلفت انتباهك هو مكون
Connections
:
Connections {
تقوم فتحة
onUserTyping
بمعالجة حدث مجموعة بواسطة محاور الرسالة عن طريق عرض الإخطار المقابل للمستخدم. هنا ، في الخطوة الأولى ، يتم الحصول على معرف الغرفة (تعني الغرفة المصطلح العام للحوارات والدردشات) ، وفي المرحلة الثانية ، يتم عرض إشعار إذا كان المعرف المستلم ومعرف الغرفة الحالية متطابقين.
تجدر الإشارة إلى أنه يتم عرض إشعار حول مجموعة من الرسائل لمدة عشر ثوانٍ ، إذا لم يكن هناك خلال هذا الوقت حدث جديد ينشط الإخطار مرة أخرى. يتم تحقيق ذلك باستخدام مكون
Timer
:
Label {
تعتبر فتحة
onSavedPhoto
مسؤولة عن معالجة نهاية تحميل الصورة في الرسائل ، وهو ما يتجاوز نطاق المقالة الحالية.
الشيء الثاني الذي يهم هو قائمة الرسائل:
SilicaListView {
هنا ، يكون مكون
MessageItem
مسؤولاً عن عرض رسالة واحدة. نظرها خارج نطاق هذه المقالة.
يتم أخذ الرسائل نفسها من نموذج
vksdk.messagesModel
. هذا النموذج عبارة عن قائمة بكائنات
Message
التي يمكن تحديثها في الوقت الفعلي باستخدام
addProfile
،
readMessages
،
readMessages
،
readMessages
والطرق
clear
:
void MessagesModel::clear() { beginRemoveRows(QModelIndex(), 0, _messages.size());
من الشائع في جميع الطرق الخمسة استخدام إشارة
dataChanged
، والتي تشير إلى أنه تم تحديث البيانات في النموذج. يؤدي تحديث هذه الإشارة إلى تحديث عناصر
SilicaListView
لعرض الحالة الحالية للرسائل.
SilicaListView
توفير إضافة الرسائل إلى
SilicaListView
عن طريق استدعاء
endInsertRows
و
endInsertRows
التي ترسل
rowsInserted
و
rowsInserted
على التوالي. ونتيجة لذلك ، سيرى المستخدم رسائل جديدة وحالتها في الوقت الفعلي في مربع الحوار.
الخلاصة
فحصت هذه المقالة التفاعل مع خادم Long Poll عند التطوير لنظام Sailfish OS باستخدام تطبيق VK كمثال. تم النظر في بعض ميزات تنفيذ العميل وطريقة لتحديث واجهة المستخدم في الوقت الحقيقي.
يتوفر رمز التطبيق الموضح في هذه المقالة على GitHub.