قم بإعداد تطبيق عميل Firebase Cloud Messaging باستخدام C++

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

قم بإعداد Firebase وFCM SDK

ذكري المظهر

  1. إذا لم تقم بذلك بالفعل، قم بإضافة Firebase إلى مشروع C++ الخاص بك .

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

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

  2. قم بإنشاء كائن تطبيق Firebase، مروراً ببيئة JNI والنشاط:

    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 المتوافقة قبل الوصول إلى الميزات. لمعرفة المزيد، راجع التحقق من خدمات Google Play APK .

دائرة الرقابة الداخلية +

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

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

      1. قم بالتمرير لأسفل إلى Linked Frameworks and Libraries ، ثم انقر فوق الزر + لإضافة إطارات العمل.
      2. في النافذة التي تظهر، قم بالتمرير إلى UserNotifications.framework ، وانقر فوق هذا الإدخال، ثم انقر فوق "إضافة" .

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

    4. حدد علامة التبويب القدرات من منطقة المحرر .

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

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

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

  6. تهيئة Firebase Cloud Messaging، وتمرير التطبيق والمستمع المُنشأ:

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

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

عند تهيئة مكتبة Firebase Cloud Messaging، يُطلب رمز تسجيل مميز لمثيل تطبيق العميل. سيتلقى التطبيق الرمز المميز من خلال رد الاتصال 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++. عندما يكون التطبيق في المقدمة (أو عندما يكون التطبيق في الخلفية ويتلقى حمولة البيانات فقط)، فسوف تمر الرسائل عبر إحدى عمليات الاسترجاعات المتوفرة في هذه الفئة. لإضافة سلوك مخصص إلى معالجة الرسالة، ستحتاج إلى توسيع ListenerService الافتراضية الخاصة بـ FCM:

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++ SDK (الإصدار 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. إذا كنت ترغب في الحصول على اشتراك صريح قبل استخدام الرمز المميز، فيمكنك منع الإنشاء في وقت التهيئة عن طريق تعطيل FCM (وتحليلات Android على Android). للقيام بذلك، أضف قيمة بيانات التعريف إلى Info.plist (وليس GoogleService-Info.plist ) على منصات Apple، أو إلى AndroidManifest.xml على 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>

سويفت

FirebaseMessagingAutoInitEnabled = NO

لإعادة تمكين FCM، يمكنك إجراء مكالمة وقت التشغيل:

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

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

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