إعداد تطبيق عميل "المراسلة عبر السحابة الإلكترونية من Firebase" باستخدام C++

لكتابة تطبيق عميل "المراسلة عبر السحابة الإلكترونية من Firebase" من عدّة منصات باستخدام C++ ، استخدِم واجهة برمجة التطبيقات Firebase Cloud Messaging. تعمل حزمة C++ SDK على نظامي Android وApple الأساسيين، مع بعض الإعدادات الإضافية المطلوبة لكل نظام أساسي.

إعداد Firebase و"SDK للمراسلة عبر السحابة الإلكترونية من Firebase"

Android

  1. أضِف Firebase إلى مشروع C++ إذا لم يسبق لك إجراء ذلك.

    • في تعليمات الإعداد المرتبطة، راجِع متطلبات الأجهزة والتطبيق لاستخدام حزمة تطوير البرامج (SDK) الخاصة بمنصة Firebase C++ ، بما في ذلك الاقتراحات المتعلقة باستخدام أداة CMake لإنشاء تطبيقك.

    • في ملف build.gradle على مستوى المشروع، احرص على تضمين مستودع Maven التابع لشركة Google في القسمَين buildscript وallprojects.

  2. أنشئ كائن تطبيق Firebase، مع إرساله في بيئة JNI والنشاط:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. حدِّد فئة تنفذ واجهة firebase::messaging::Listener.

  4. إعداد خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" وتمريرها في التطبيق وأداة استماع تم إنشاؤها:

    ::firebase::messaging::Initialize(app, listener);

  5. يجب أن تتحقق التطبيقات التي تعتمد على حزمة SDK لخدمات Google Play من وجود حزمة APK متوافقة لخدمات Google Play في الجهاز قبل الوصول إلى الميزات. لمعرفة مزيد من المعلومات، يمكنك الرجوع إلى مقالة التحقّق من توفّر حزمة APK لخدمات Google Play.

iOS+

  1. يجب الحصول على شهادة أسماء نقاط الوصول (APN) صالحة. إذا لم يكن لديك حساب، احرص على إنشاء حساب في Apple Developer Member Center.
  2. أضِف Firebase إلى مشروع C++ إذا لم يسبق لك إجراء ذلك. بعد ذلك، لإعداد مشروعك من أجل خدمة "المراسلة عبر السحابة الإلكترونية من Firebase":
    1. في Podfile الخاص بمشروعك، أضِف اعتمادية FCM:
      pod 'FirebaseMessaging'
    2. اسحب إطار عمل firebase.framework وfirebase_messaging.framework إلى مشروع Xcode من حزمة تطوير البرامج (SDK) الخاصة بـ Firebase C++.
  3. اضبط مشروع Xcode لتفعيل الإشعارات الفورية:

    1. اختَر المشروع من منطقة المستكشف.
    2. اختَر هدف المشروع من منطقة المحرِّر.
    3. اختَر علامة التبويب عام من منطقة المحرِّر.

      1. مرِّر لأسفل وصولاً إلى أُطر العمل والمكتبات المرتبطة، ثم انقر على الزر + لإضافة أطر عمل.
      2. في النافذة التي تظهر، انتقِل إلى UserNotifications.framework، وانقر على الإدخال المطلوب، ثم انقر على إضافة.

        لا يظهر إطار العمل هذا إلا في الإصدار 8 من Xcode والإصدارات الأحدث، وهو مطلوب في هذه المكتبة.

    4. اختَر علامة التبويب الإمكانات من منطقة المحرِّر.

      1. بدِّل مفتاح الإشعارات الفورية إلى تفعيل.
      2. انتقِل للأسفل وصولاً إلى أوضاع الخلفية، ثم بدِّل الوضع إلى تفعيل.
      3. انقر على الإشعارات عن بُعد ضمن أوضاع الخلفية.
  4. إنشاء كائن تطبيق في Firebase:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. حدِّد فئة تنفذ واجهة firebase::messaging::Listener.

  6. إعداد خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" وتمريرها إلى التطبيق وأداة استماع تم إنشاؤها:

    ::firebase::messaging::Initialize(app, listener);

الوصول إلى الرمز المميّز لتسجيل الجهاز

عند إعداد مكتبة "المراسلة عبر السحابة الإلكترونية من Firebase"، يتم طلب رمز مميز للتسجيل لمثيل تطبيق العميل. سيتلقّى التطبيق الرمز المميّز مع استدعاء OnTokenReceived، والذي يجب تحديده في الفئة التي تنفّذ firebase::messaging::Listener.

إذا كنت تريد استهداف ذلك الجهاز تحديدًا، ستحتاج إلى الوصول إلى هذا الرمز المميّز.

ملاحظة حول تسليم الرسائل على Android

إذا كان التطبيق لا يعمل على الإطلاق وينقر المستخدم على إشعار، لن يتم توجيه الرسالة تلقائيًا من خلال عمليات معاودة الاتصال المدمجة في خدمة "المراسلة عبر السحابة الإلكترونية من Firebase". في هذه الحالة، يتم استلام حمولات الرسائل من خلال عنصر Intent يُستخدَم لبدء التطبيق. لإعادة توجيه هذه الرسائل الواردة من خلال خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" إلى صفحة معاودة الاتصال بمكتبة C++ ، يجب إلغاء الطريقة onNewIntent في "النشاط" وتمرير Intent إلى MessageForwardingService.

import com.google.firebase.messaging.MessageForwardingService;

class MyActivity extends Activity {
  private static final String TAG = "MyActvity";

  @Override
  protected void onNewIntent(Intent intent) {
    Log.d(TAG, "A message was sent to this app while it was in the background.");
    Intent message = new Intent(this, MessageForwardingService.class);
    message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
    message.putExtras(intent);
    message.setData(intent.getData());
    // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`.
    // startService(message);
    MessageForwardingService.enqueueWork(this, message);
  }
}

تتضمّن الرسائل التي يتم استلامها أثناء تشغيل التطبيق في الخلفية محتوى حقل الإشعارات الذي يتم استخدامه لتعبئة إشعار لوحة النظام، ولكن لن يتم إرسال محتوى الإشعار إلى خدمة "المراسلة عبر السحابة الإلكترونية من Firebase". وهذا يعني أن Message::notification ستكون قيمة خالية.

وباختصار:

حالة التطبيق الإشعار البيانات كلاهما
لون الواجهة OnMessageReceived OnMessageReceived OnMessageReceived
الخلفية علبة النظام OnMessageReceived إشعار: لوحة النظام
البيانات: في التفاصيل الإضافية للغرض

التعامل مع الرسائل المخصصة على Android

يتم تلقائيًا تمرير الإشعارات المُرسَلة إلى التطبيق إلى ::firebase::messaging::Listener::OnMessageReceived، ولكن قد تريد في بعض الحالات إلغاء السلوك التلقائي. ولإجراء ذلك على Android، عليك كتابة صفوف مخصّصة تمتد من com.google.firebase.messaging.cpp.ListenerService بالإضافة إلى تعديل AndroidManifest.xml الخاصة بمشروعك.

إلغاء طُرق ListenerService

وListenerService هي فئة Java التي تعترض الرسائل الواردة المرسَلة إلى التطبيق وتوجّهها إلى مكتبة C++. عندما يكون التطبيق في المقدّمة (أو عندما يكون التطبيق في الخلفية ويتلقّى حمولة بيانات فقط)، تمرّ الرسائل من خلال إحدى عمليات الاستدعاء المقدَّمة في هذا الصف. لإضافة سلوك مخصّص إلى التعامل مع الرسائل، ستحتاج إلى تمديد الإعداد التلقائي ListenerService في خدمة "المراسلة عبر السحابة الإلكترونية من Firebase":

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

عند تجاوز طريقة ListenerService.onMessageReceived، يمكنك تنفيذ الإجراءات استنادًا إلى كائن RemoteMessage الذي تم استلامه والحصول على بيانات الرسالة:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService لديه أيضًا بعض الطرق الأخرى التي يتم استخدامها بشكل أقل تكرارًا. يمكن إلغاء هذه الأخطاء أيضًا. لمزيد من المعلومات، يمكنك الاطّلاع على مرجع FirebaseMessagingService.

@Override
public void onDeletedMessages() {
  Log.d(TAG, "Messages have been deleted on the server.");
  // Do additional logic...
  super.onDeletedMessages();
}

@Override
public void onMessageSent(String messageId) {
  Log.d(TAG, "An outgoing message has been sent.");
  // Do additional logic...
  super.onMessageSent(messageId);
}

@Override
public void onSendError(String messageId, Exception exception) {
  Log.d(TAG, "An outgoing message encountered an error.");
  // Do additional logic...
  super.onSendError(messageId, exception);
}

تَعْدِيلْ "AndroidManifest.xml"

بعد كتابة الصفوف المخصّصة، يجب تضمينها في AndroidManifest.xml لكي يتم تطبيقها. تأكَّد من أنّ البيان يتضمّن أدوات الدمج من خلال تعريف السمة المناسبة داخل العلامة <manifest>، كما يلي:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.messaging.cpp.samples"
    xmlns:tools="http://schemas.android.com/tools">

في أرشيف firebase_messaging_cpp.aar، هناك ملف AndroidManifest.xml يعرّف عن قيمة ListenerService التلقائية لخدمة "المراسلة عبر السحابة الإلكترونية من Firebase". ويتم عادةً دمج هذا البيان مع البيان الخاص بالمشروع، وهو طريقة تشغيل ListenerService. يجب استبدال ListenerService هذا بخدمة المستمعين المخصصة. ويمكن تحقيق ذلك من خلال إزالة ListenerService التلقائي وإضافة الخدمة المخصّصة، ويمكنك تنفيذ ذلك من خلال الأسطر التالية لملف AndroidManifest.xml لمشاريعك:

<service android:name="com.google.firebase.messaging.cpp.ListenerService"
         tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService"
         android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT"/>
  </intent-filter>
</service>

تستخدم الإصدارات الجديدة من حزمة تطوير البرامج (SDK) لمنصة Firebase C++ (الإصدار 7.1.0 والإصدارات الأحدث) JobIntentService، ما يتطلب إجراء تعديلات إضافية في ملف AndroidManifest.xml.

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

منع الإعداد التلقائي

تنشئ خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" رمزًا مميّزًا للتسجيل من أجل استهداف الأجهزة. عند إنشاء رمز مميّز، تحمِّل المكتبة بيانات المعرّف والتهيئة إلى Firebase. إذا أردت الحصول على موافقة صريحة قبل استخدام الرمز المميّز، يمكنك منع الإنشاء في وقت الإعداد من خلال إيقاف خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" (وعلى Android و"إحصاءات Google"). لإجراء ذلك، أضِف قيمة للبيانات الوصفية إلى Info.plist (وليس GoogleService-Info.plist) على أنظمة Apple الأساسية أو AndroidManifest.xml على Android:

Android

<?xml version="1.0" encoding="utf-8"?>
<application>
  <meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />
  <meta-data android:name="firebase_analytics_collection_enabled"
             android:value="false" />
</application>

Swift

FirebaseMessagingAutoInitEnabled = NO

لإعادة تفعيل خدمة "المراسلة عبر السحابة الإلكترونية من Firebase"، يمكنك إجراء مكالمة في بيئة التشغيل:

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

تظل هذه القيمة سارية في جميع عمليات إعادة تشغيل التطبيق بعد ضبطها.

تسمح خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" بإرسال الرسائل التي تحتوي على رابط لصفحة في تطبيقك. لاستلام الرسائل التي تحتوي على رابط لصفحة في التطبيق، يجب إضافة فلتر أهداف جديد إلى النشاط الذي يعالج روابط لصفحات في تطبيقك. من المفترض أن يلتقط فلتر الأهداف روابط لصفحات معيّنة في نطاقك. إذا لم تكن رسائلك تحتوي على رابط لموضع معيّن، فلن تكون هذه التهيئة ضرورية. في ملف AndroidManifest.xml:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/>
</intent-filter>

ويمكن أيضًا تحديد حرف بدل لجعل فلتر الأهداف أكثر مرونة. على سبيل المثال:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="*.example.com" android:scheme="http"/>
  <data android:host="*.example.com" android:scheme="https"/>
</intent-filter>

عندما ينقر المستخدمون على إشعار يحتوي على رابط إلى المخطط والمضيف الذي تحدّده، سيبدأ تطبيقك النشاط باستخدام فلتر الأهداف هذا لمعالجة الرابط.

الخطوات اللاحقة

بعد إعداد تطبيق العميل، تصبح جاهزًا لإرسال رسائل المراحل الأدنى والموضوعات من خلال Firebase. لمعرفة المزيد من المعلومات، يمكنك الاطّلاع على هذه الوظيفة الموضّحة في نموذج البدء السريع الذي يمكنك تنزيله وتشغيله ومراجعتها.

لإضافة سلوك آخر أكثر تقدمًا إلى تطبيقك، يمكنك الاطّلاع على أدلة إرسال الرسائل من خادم التطبيق:

ضع في اعتبارك أنك ستحتاج إلى تنفيذ خادم للاستفادة من هذه الميزات.