لكتابة تطبيق عميل Firebase Cloud Messaging عبر الأنظمة الأساسية باستخدام C ++ ، استخدم Firebase Cloud Messaging API. تعمل حزمة C ++ SDK مع كل من Android و iOS ، مع بعض الإعداد الإضافي المطلوب لكل نظام أساسي.
قم بإعداد Firebase و FCM SDK
ذكري المظهر
إذا لم تكن قد قمت بذلك بالفعل ، فأضف Firebase إلى مشروع C ++ الخاص بك .
في إرشادات الإعداد المرتبطة ، راجع متطلبات الجهاز والتطبيق لاستخدام Firebase C ++ SDK ، بما في ذلك التوصية باستخدام CMake لبناء تطبيقك.
في ملف
build.gradle
مستوى المشروع ، تأكد من تضمين مستودع Google Maven في كل منbuildscript
الخاص بكbuildscript
allprojects
.
قم بإنشاء كائن تطبيق Firebase ، بالمرور في بيئة ونشاط JNI:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
حدد فئة تنفذ واجهة
firebase::messaging::Listener
.تهيئة FCM ، تمرير في التطبيق والمستمع المركب:
::firebase::messaging::Initialize(app, listener);
يجب أن تتحقق التطبيقات التي تعتمد على خدمات Google Play SDK من الجهاز بحثًا عن ملف APK متوافق لخدمات Google Play قبل الوصول إلى الميزات. لمعرفة المزيد ، ارجع إلى Check for Google Play services APK .
iOS
- أنت بحاجة إلى شهادة APNs صالحة. إذا لم يكن لديك واحدة بالفعل ، فارجع إلى توفير شهادات SSL APNs .
- إذا لم تكن قد قمت بذلك بالفعل ، فأضف Firebase إلى مشروع C ++ الخاص بك . بعد ذلك ، لإعداد مشروعك لـ FCM:
- في Podfile الخاص بمشروعك ، أضف تبعية FCM:
pod 'Firebase/Messaging'
- اسحب
firebase.framework
وfirebase_messaging.framework
الأطر في مشروع Xcode من ++ SDK Firebase C .
- في Podfile الخاص بمشروعك ، أضف تبعية FCM:
تكوين مشروع Xcode الخاص بك لتمكين دفع الإخطارات:
- حدد المشروع من منطقة Navigator .
- حدد هدف المشروع من منطقة المحرر .
حدد علامة التبويب عامة من منطقة محرر.
- قم بالتمرير لأسفل إلى النظم والمكتبات المرتبطة ، ثم انقر فوق الزر + لإضافة إطارات عمل.
في النافذة التي تظهر ، قم بالتمرير إلى 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 ++ callback ، تحتاج إلى تجاوز الطريقة 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()); startService(message); } }
الرسائل المستلمة أثناء وجود التطبيق في الخلفية بها محتوى حقل الإشعارات المستخدم لملء إشعار علبة النظام ، ولكن لن يتم إرسال محتوى الإخطار هذا إلى FCM. أي ، Message::notification
سيكون فارغًا.
باختصار:
حالة التطبيق | تنبيه | البيانات | على حد سواء |
---|---|---|---|
المقدمة | OnMessageReceived | OnMessageReceived | OnMessageReceived |
خلفية | علبة النظام | OnMessageReceived | الإخطار: علبة النظام البيانات: في إضافات النية. |
معالجة الرسائل المخصصة على Android
بشكل افتراضي ، يتم تمرير الإشعارات المرسلة إلى التطبيق إلى ::firebase::messaging::Listener::OnMessageReceived
، ولكن في بعض الحالات قد ترغب في تجاوز السلوك الافتراضي. للقيام بذلك على Android ، ستحتاج إلى كتابة فئات مخصصة تعمل على توسيع com.google.firebase.messaging.cpp.ListenerService
بالإضافة إلى تحديث AndroidManifest.xml
الخاص 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. يتم تحقيق ذلك عن طريق إزالة ListenerService
الافتراضية وإضافة الخدمة المخصصة ، والتي يمكن القيام بها مع الأسطر التالية ملف AndroidManifest.xml
الخاص 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>
منع التهيئة التلقائية
يُنشئ FCM معرّف مثيل ، والذي يتم استخدامه كرمز تسجيل ضمن FCM. عندما يتم إنشاء معرف مثيل ، ستقوم المكتبة بتحميل المعرف وبيانات التكوين إلى Firebase. إذا كنت ترغب في الحصول على اشتراك صريح قبل استخدام معرف المثيل ، يمكنك منع الإنشاء في وقت التكوين عن طريق تعطيل FCM (وعلى Android ، Analytics) . للقيام بذلك ، أضف قيمة بيانات وصفية إلى Info.plist
(وليس GoogleService-Info.plist
الخاص بك) على iOS ، أو 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>
iOS
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. لمعرفة المزيد ، راجع هذه الوظيفة الموضحة في نموذج البدء السريع الذي يمكنك تنزيله وتشغيله ومراجعته.
لإضافة سلوك آخر أكثر تقدمًا إلى تطبيقك ، راجع أدلة إرسال الرسائل من خادم التطبيق:
ضع في اعتبارك أنك ستحتاج إلى تطبيق خادم للاستفادة من هذه الميزات.