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