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

لكتابة تطبيق عميل "المراسلة عبر السحابة الإلكترونية من Firebase" من عدّة أنظمة أساسية باستخدام C++ ، استخدِم واجهة برمجة تطبيقات المراسلة عبر السحابة الإلكترونية من Firebase تعمل حزمة تطوير البرامج (SDK) بلغة C++ على نظامَي التشغيل 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 من واجهة pyplot.

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

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

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

iOS+

  1. إذا لم تكن قد فعلت ذلك بالفعل، إضافة Firebase إلى مشروع C++ بعد ذلك، يُرجى اتّباع الخطوات التالية: لإعداد مشروعك للمراسلة عبر السحابة الإلكترونية من Firebase:
    1. في Podfile الخاص بمشروعك، أضف تبعية FCM:
      pod 'FirebaseMessaging'
    2. سحب firebase.framework وfirebase_messaging.framework إطارات العمل في مشروع Xcode من حزمة تطوير البرامج (SDK) C++ من Firebase.
  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

عندما لا يكون التطبيق قيد التشغيل على الإطلاق وينقر المستخدم على إشعار، لا يتم توجيه الرسالة بشكل تلقائي من خلال خدمة "المراسلة عبر السحابة الإلكترونية من 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 التلقائية:

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. الذي يعرّف القيمة التلقائية للمراسلة عبر السحابة الإلكترونية من Firebase.ListenerService هذا البيان عادةً ما يتم دمجها مع البيان الخاص بالمشروع والذي يمثل كيف يمكن تشغيل "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>

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

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

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

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