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