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

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

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

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 من واجهة pyplot.

  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 من Firebase C++ حزمة SDK.
  2. حمِّل مفتاح مصادقة أسماء نقاط الوصول إلى Firebase. إذا لم يكن لديك مفتاح مصادقة لأسماء نقاط الوصول (APN)، احرص على إنشاء مفتاح في مركز أعضاء مطوّري برامج Apple

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

    2. في مفتاح مصادقة أسماء نقاط الوصول (APN) ضمن ضبط تطبيق iOS، انقر على تحميل .

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

  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 من واجهة pyplot.

  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>

تستخدم الإصدارات الجديدة من حزمة تطوير برامج 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>

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

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

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

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

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

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