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

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

إعداد Firebase وحزمة تطوير البرامج (SDK) لمنصّة FCM

Android

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

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

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

  2. أنشئ عنصر تطبيق Firebase، مع تضمين بيئة JNI و Activity:

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

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

  4. يمكنك إعداد FCM، مع إدخال التطبيق ومستمع تم إنشاؤه:

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

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

iOS+

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

    1. داخل مشروعك في وحدة تحكّم Firebase، انقر على رمز الترس، ثم على إعدادات المشروع، ثم على علامة التبويب الرسائل عبر السحابة الإلكترونية.

    2. في مفتاح مصادقة APNs ضمن إعدادات تطبيق iOS، انقر على الزر تحميل .

    3. انتقِل إلى المكان الذي حفظت فيه مفتاحك، واختَره، ثم انقر على فتح. أضِف معرّف المفتاح (متاحًا في Apple Developer Member Center) وانقر على تحميل.

  3. اضبط مشروع Xcode لتفعيل الإشعارات الفورية:

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

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

        لا يظهر هذا الإطار إلا في الإصدار 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

عندما لا يكون التطبيق قيد التشغيل على الإطلاق وينقر المستخدم على إشعار، لا يتم توجيه الرسالة تلقائيًا من خلال FCM المدمجة. في هذه الحالة، يتم استلام حمولات الرسائل من خلال عنصر Intent يُستخدَم لتشغيل التطبيق. لتوجيه FCM هذه الرسائل القادمة إلى دالة الاستدعاء في مكتبة 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);
  }
}

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

وباختصار:

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

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

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

إلغاء طرق ListenerService

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

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 التلقائي لـ FCM. يتم عادةً دمج هذا البيان مع البيان الخاص بالمشروع، وهو الطريقة التي يمكن بها تنفيذ 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) لـ C++ في Firebase (بدءًا من الإصدار 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>

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

ينشئ FCM رمزًا مميَّزًا للتسجيل من أجل استهداف الأجهزة. عند إنشاء رمز مميّز، تحمّل المكتبة معرّف بيانات الضبط إلى Firebase. إذا كنت تريد الحصول على موافقة صريحة قبل استخدام الرمز المميّز، يمكنك منع إنشائه في وقت الضبط من خلال إيقاف خدمة "إشعارات Google من خادم Firebase" (و"إحصاءات Google" على Android). لإجراء ذلك، أضِف قيمة بيانات وصفية إلى 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

لإعادة تفعيل "خدمة إرسال الرسائل إلى الأجهزة الجوّالة من Google"، يمكنك إجراء مكالمة وقت التشغيل:

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

تظل هذه القيمة محفوظة عند إعادة تشغيل التطبيق بعد ضبطها.

يسمح FCM بإرسال الرسائل التي تحتوي على رابط لصفحة في تطبيقك. لتلقّي الرسائل التي تحتوي على رابط لصفحة في تطبيقك، عليك إضافة فلتر أهداف جديد إلى النشاط الذي يعالج الروابط لصفحات في تطبيقك. ومن المفترض أن يرصد فلتر الأهداف الروابط لصفحات في نطاقك. إذا كانت رسائلك لا تحتوي على رابط لصفحة في التطبيق، لن يكون هذا الإعداد ضروريًا. في ملف 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. للاطّلاع على مزيد من المعلومات، يمكنك الاطّلاع على توضيح لهذه الوظيفة في نموذج البدء السريع الذي يمكنك تنزيله وتشغيله ومراجعته.

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

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