لكتابة تطبيق عميل Firebase Cloud Messaging عبر الأنظمة الأساسية باستخدام C++، استخدم Firebase Cloud Messaging API. تعمل حزمة C++ SDK لكل من منصات Android وApple، مع بعض الإعدادات الإضافية المطلوبة لكل نظام أساسي.
قم بإعداد Firebase وFCM SDK
ذكري المظهر
إذا لم تقم بذلك بالفعل، قم بإضافة Firebase إلى مشروع C++ الخاص بك .
في تعليمات الإعداد المرتبطة، راجع متطلبات الجهاز والتطبيق لاستخدام Firebase C++ SDK، بما في ذلك التوصية باستخدام CMake لإنشاء تطبيقك.
في ملف
build.gradle
على مستوى المشروع، تأكد من تضمين مستودع Google Maven في قسميbuildscript
allprojects
.
قم بإنشاء كائن تطبيق Firebase، مروراً ببيئة JNI والنشاط:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
حدد فئة تنفذ واجهة
firebase::messaging::Listener
.قم بتهيئة FCM، وتمرير التطبيق والمستمع المُنشأ:
::firebase::messaging::Initialize(app, listener);
يجب على التطبيقات التي تعتمد على SDK لخدمات Google Play التحقق من الجهاز بحثًا عن APK لخدمات Google Play المتوافقة قبل الوصول إلى الميزات. لمعرفة المزيد، راجع التحقق من خدمات Google Play APK .
دائرة الرقابة الداخلية +
- أنت بحاجة إلى شهادة APNs صالحة. إذا لم يكن لديك واحدًا بالفعل، فتأكد من إنشائه في مركز أعضاء مطوري Apple .
- إذا لم تقم بذلك بالفعل، قم بإضافة Firebase إلى مشروع C++ الخاص بك . وبعد ذلك، لإعداد مشروعك لـ FCM:
- في ملف Podfile الخاص بمشروعك، أضف تبعية FCM:
pod 'FirebaseMessaging'
- اسحب إطاري العمل
firebase.framework
وfirebase_messaging.framework
إلى مشروع Xcode الخاص بك من Firebase C++ SDK .
- في ملف Podfile الخاص بمشروعك، أضف تبعية FCM:
قم بتكوين مشروع Xcode الخاص بك لتمكين إشعارات الدفع:
- حدد المشروع من منطقة المستكشف .
- حدد هدف المشروع من منطقة المحرر .
حدد علامة التبويب عام من منطقة المحرر .
- قم بالتمرير لأسفل إلى Linked Frameworks and Libraries ، ثم انقر فوق الزر + لإضافة إطارات العمل.
في النافذة التي تظهر، قم بالتمرير إلى UserNotifications.framework ، وانقر فوق هذا الإدخال، ثم انقر فوق "إضافة" .
يظهر إطار العمل هذا فقط في Xcode v8 والإصدارات الأحدث وهو مطلوب من قبل هذه المكتبة.
حدد علامة التبويب القدرات من منطقة المحرر .
- قم بتبديل الإشعارات الفورية إلى تشغيل .
- قم بالتمرير لأسفل إلى أوضاع الخلفية ، ثم قم بالتبديل إلى تشغيل .
- حدد الإشعارات عن بعد ضمن أوضاع الخلفية .
قم بإنشاء كائن تطبيق Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
حدد فئة تنفذ واجهة
firebase::messaging::Listener
.تهيئة 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);
تستمر هذه القيمة عبر عمليات إعادة تشغيل التطبيق بمجرد تعيينها.
التعامل مع الرسائل ذات الروابط العميقة على Android
يسمح 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. لمعرفة المزيد، راجع هذه الوظيفة الموضحة في نموذج التشغيل السريع الذي يمكنك تنزيله وتشغيله ومراجعته.
لإضافة سلوك آخر أكثر تقدمًا إلى تطبيقك، راجع أدلة إرسال الرسائل من خادم التطبيق:
ضع في اعتبارك أنك ستحتاج إلى تنفيذ خادم للاستفادة من هذه الميزات.