لكتابة تطبيق عميل 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 قبل الوصول إلى الميزات. لمعرفة المزيد ، ارجع إلى Check for Google Play services APK .
iOS +
- أنت بحاجة إلى شهادة APNs صالحة. إذا لم يكن لديك واحد بالفعل ، فتأكد من إنشاء واحد في مركز أعضاء مطوري Apple .
- إذا لم تكن قد قمت بذلك بالفعل ، فأضف Firebase إلى مشروع C ++ الخاص بك . بعد ذلك ، لإعداد مشروعك لـ FCM:
- في ملف Podfile الخاص بمشروعك ، أضف تبعية FCM:
pod 'FirebaseMessaging'
- اسحب إطار عمل
firebase.framework
وfirebase_messaging.framework
إلى مشروع Xcode من Firebase C ++ SDK .
- في ملف Podfile الخاص بمشروعك ، أضف تبعية FCM:
تكوين مشروع Xcode الخاص بك لتمكين دفع الإخطارات:
- حدد المشروع من منطقة المستكشف .
- حدد هدف المشروع من منطقة المحرر .
حدد علامة التبويب عام من منطقة المحرر .
- قم بالتمرير لأسفل إلى الأطر والمكتبات المرتبطة ، ثم انقر فوق الزر + لإضافة إطارات عمل.
في النافذة التي تظهر ، قم بالتمرير إلى 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
هذه بخدمة 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);
تستمر هذه القيمة عبر عمليات إعادة تشغيل التطبيق بمجرد تعيينها.
التعامل مع الرسائل ذات الروابط العميقة على 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. لمعرفة المزيد ، راجع هذه الوظيفة الموضحة في نموذج البدء السريع الذي يمكنك تنزيله وتشغيله ومراجعته.
لإضافة سلوك آخر أكثر تقدمًا إلى تطبيقك ، راجع أدلة إرسال الرسائل من خادم التطبيق:
ضع في اعتبارك أنك ستحتاج إلى تطبيق خادم للاستفادة من هذه الميزات.