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

iOS +

  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. قم بالتمرير لأسفل إلى الأطر والمكتبات المرتبطة ، ثم انقر فوق الزر + لإضافة إطارات عمل.
      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 هذه بخدمة cusom listener. يتم تحقيق ذلك عن طريق إزالة 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 ، Analytics). للقيام بذلك ، أضف قيمة بيانات وصفية إلى 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. لمعرفة المزيد ، راجع هذه الوظيفة الموضحة في نموذج البدء السريع الذي يمكنك تنزيله وتشغيله ومراجعته.

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

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