إذا كان خادم تطبيقك ينفِّذ بروتوكول XMPP Connection Server، يمكنه تلقّي الرسائل من جهاز المستخدم إلى السحابة الإلكترونية. لبدء رسالة من المصدر، يرسل تطبيق العميل طلبًا يحتوي على ما يلي:
- عنوان خادم التطبيق المستلِم بالتنسيق
SENDER_ID@fcm.googleapis.com
. - معرّف الرسالة الذي يجب أن يكون فريدًا لكل معرّف مُرسِل.
- بيانات الرسالة التي تتألّف من أزواج المفتاح/القيمة لحمولة الرسالة
عند تلقّي هذه البيانات، ينشئ FCM مقطع XMPP لإرساله إلى خادم التطبيق، ويُضيف بعض المعلومات الإضافية حول الجهاز المُرسِل والتطبيق.
إرسال رسالة إلى التطبيق المُشغِّل من تطبيق Android
يمكن لتطبيق Android إرسال رسالة إلى الخادم باستخدام FirebaseMessaging.send:
Kotlin
val fm = Firebase.messaging fm.send( remoteMessage("$SENDER_ID@fcm.googleapis.com") { setMessageId(messageId.toString()) addData("my_message", "Hello World") addData("my_action", "SAY_HELLO") }, )
Java
FirebaseMessaging fm = FirebaseMessaging.getInstance(); fm.send(new RemoteMessage.Builder(SENDER_ID + "@fcm.googleapis.com") .setMessageId(Integer.toString(messageId)) .addData("my_message", "Hello World") .addData("my_action","SAY_HELLO") .build());
معالجة عمليات استدعاء الرسائل من المصدر
باستخدام FirebaseMessaging
، يمكنك تنفيذ دالّتَي callback
onMessageSent
وonSendError
للتحقّق من حالة رسائل العميل المرسِل. في حالات الخطأ، يعرض onSendError
SendException
مع رمز خطأ. على سبيل المثال، إذا حاول العميل
إرسال المزيد من الرسائل بعد بلوغ الحد الأقصى البالغ 20 رسالة، سيعرض العميل
SendException#ERROR_TOO_MANY_MESSAGES
.
في الحالات التي يكون فيها الجهاز غير متصل بالإنترنت أو لا تتوفّر فيها خدمة FCM
لإعادة توجيه الرسائل الواردة إلى خادمك، يمكن أن تتراكم في مثيلات تطبيق العميل على Android ما يصل إلى 20 رسالة في انتظار المراجعة.
إذا انتهت صلاحية هذه الرسائل قبل أن يتمكّن FCM من إرسالها بنجاح، يعرض onSendError
القيمة SendException#ERROR_TTL_EXCEEDED
.
لتحسين استخدام الشبكة، يُجمِّع FCM الردود إلى onMessageSent
وonSendError
، لذا قد لا يكون الإقرار فوريًا لكل رسالة.
تلقّي رسائل XMPP على خادم التطبيق
عندما يتلقّى FCM طلب مراسلة من تطبيق العميل، ينشئ
الفقرة XMPP اللازمة لإرسال الرسالة.
تُضيف FCM حقلَي category
وfrom
، ثم تُرسِل
فقرة مثل ما يلي إلى خادم التطبيق:
<message id=""> <gcm xmlns="google:mobile:data"> { "category":"com.example.yourapp", // to know which app sent it "data": { "hello":"world", }, "message_id":"m-123", "from":"REGID" } </gcm> </message>
إرسال رسالة ACK
استجابةً لرسالة من الأعلى مثل الرسالة أعلاه، يجب أن يستخدم خادم التطبيق الاتصال نفسه لإرسال رسالة ACK تحتوي على معرّف الرسالة الفريد. إذا لم يتلقّى FCM إشعارًا بالتأكيد، قد يحاول مرة أخرى إرسال الرسالة إلى خادم التطبيق.
<message id=""> <gcm xmlns="google:mobile:data"> { "to":"REGID", "message_id":"m-123" "message_type":"ack" } </gcm> </message>
اطّلِع على مرجع خادم اتصال XMPP لمزيد من المعلومات حول بنية الرسائل الواردة.