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