| اختيار النظام الأساسي: | iOS+ Android الويب Flutter Unity C++ |
يوضّح هذا الدليل كيفية البدء باستخدام Firebase Cloud Messaging في تطبيقات عميل Flutter كي تتمكّن من إرسال الرسائل بشكل موثوق به.
بناءً على النظام الأساسي الذي تستهدفه، هناك بعض خطوات الإعداد الإضافية المطلوبة التي عليك اتّخاذها.
لنظام التشغيل iOS+
تغيير وظيفة الإجراء
لاستخدام مكوّن FCM الإضافي لـ Flutter على أجهزة Apple، يجب تغيير وظيفة الإجراء. وبدون ذلك، لن تعمل ميزات Firebase الرئيسية، مثل معالجة رموز FCM بشكل صحيح.
Android
خدمات Google Play
تتطلّب أجهزة عملاء FCM التي تعمل بالإصدار 4.4 من Android أو إصدار أحدث أن تكون "خدمات Google Play" مثبّتة عليها، أو أن يكون المحاكي يعمل بالإصدار 4.4 من Android مع Google APIs. يُرجى العِلم أنّه ليس عليك نشر تطبيقات Android من خلال "متجر Google Play".
يجب أن تتحقّق التطبيقات التي تعتمد على حزمة تطوير البرامج (SDK) لخدمات Play دائمًا من توفّر حزمة APK متوافقة من "خدمات Google Play" على الجهاز قبل الوصول إلى ميزات "خدمات Google Play". ننصحك بإجراء ذلك في موضعَين: في طريقة onCreate() للنشاط الرئيسي وفي طريقة onResume(). يضمن التحقّق في طريقة onCreate() عدم إمكانية استخدام التطبيق بدون إجراء عملية تحقّق ناجحة. يضمن التحقّق في طريقة onResume() أنّه إذا عاد المستخدم إلى التطبيق قيد التشغيل من خلال وسيلة أخرى، مثل زر الرجوع، سيظل التحقّق قيد التنفيذ.
إذا لم يكن الجهاز يتضمّن إصدارًا متوافقًا من "خدمات Google Play"، يمكن لتطبيقك استدعاء
GoogleApiAvailability.makeGooglePlayServicesAvailable()
للسماح للمستخدمين بتنزيل "خدمات Google Play" من "متجر Play".
الويب
ضبط بيانات اعتماد الويب باستخدام FCM
تستخدم واجهة الويب FCM بيانات اعتماد الويب، التي تُعرف باسم Voluntary Application Server Identification أو مفاتيح VAPID، للسماح بطلبات الإرسال إلى خدمات الإشعارات الفورية على الويب المتوافقة. للاشتراك في الإشعارات الفورية، عليك ربط زوج من المفاتيح بمشروع Firebase. يمكنك إما إنشاء زوج مفاتيح جديد أو استيراد زوج المفاتيح الحالي من خلال Firebase وحدة التحكم.
تثبيت مكوّن FCM الإضافي
ثبِّت مكوّنات Firebase الإضافية لـ Flutter وفعِّلها إذا لم يسبق لك إجراء ذلك.
من جذر مشروع Flutter، شغِّل الأمر التالي لتثبيت المكوّن الإضافي:
flutter pub add firebase_messagingبعد اكتمال التثبيت، أعِد إنشاء تطبيق Flutter:
flutter run
الوصول إلى رمز التسجيل
لإرسال رسالة إلى جهاز معيّن، عليك معرفة رمز تسجيل الجهاز. لاسترداد رمز التسجيل لمثيل تطبيق، استدعِ getToken(). إذا لم يتم منح إذن إرسال الإشعارات، سيطلب هذا الإجراء من المستخدم منح أذونات الإشعارات. بخلاف ذلك، يعرض رمزًا أو يرفض المستقبل بسبب حدوث خطأ.
// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);
// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
// APNS token is available, make FCM plugin API requests...
}
على منصات الويب، مرِّر مفتاح VAPID العام إلى getToken():
final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");
لتلقّي إشعار في كل مرة يتم فيها تعديل الرمز، اشترِك في مصدر البيانات onTokenRefresh:
FirebaseMessaging.instance.onTokenRefresh
.listen((fcmToken) {
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new
// token is generated.
})
.onError((err) {
// Error getting token.
});
منع الإعداد التلقائي
عند إنشاء رمز تسجيل FCM، تحمِّل المكتبة المعرّف وبيانات الإعدادات إلى Firebase. إذا كنت تفضّل منع إنشاء الرمز تلقائيًا، عليك إيقاف الإعداد التلقائي في مدّة التصميم.
iOS
على أجهزة iOS، أضِف قيمة بيانات وصفية إلى ملف Info.plist:
FirebaseMessagingAutoInitEnabled = NO
Android
على أجهزة Android، أوقِف جمع البيانات في "إحصاءات Google" والإعداد التلقائي لـ FCM (عليك إيقاف كليهما) من خلال إضافة قيم البيانات الوصفية هذه إلى ملف AndroidManifest.xml:
<meta-data
android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<meta-data
android:name="firebase_analytics_collection_enabled"
android:value="false" />
إعادة تفعيل الإعداد التلقائي لـ FCM في وقت التشغيل
لتفعيل الإعداد التلقائي لمثيل تطبيق معيّن، استدعِ setAutoInitEnabled():
await FirebaseMessaging.instance.setAutoInitEnabled(true);
تظل هذه القيمة ثابتة بعد إعادة تشغيل التطبيق بعد ضبطها.
إرسال رسالة إشعار اختبارية
ثبِّت التطبيق وشغِّله على جهاز الاختبار. على أجهزة Apple، عليك قبول طلب الإذن بتلقّي الإشعارات عن بُعد.
تأكَّد من أنّ التطبيق في الخلفية على الجهاز.
في وحدة تحكّم Firebase، انتقِل إلى DevOps & Engagement > المراسلة.
أنشئ حملة.
إذا كانت هذه هي رسالتك الأولى:
انقر على إنشاء حملتك الأولى.
اختَر رسائل الإشعارات في Firebase وانقر على إنشاء.
إذا سبق لك إنشاء حملات:
في علامة التبويب الحملات ، انقر على حملة جديدة.
انقر على الإشعارات.
أدخِل نص الرسالة.
انقر على إرسال رسالة اختبارية من اللوحة اليمنى.
في الحقل الذي يحمل العنوان إضافة رمز تسجيل FCM، أدخِل رمز التسجيل.
انقر على اختبار.
بعد النقر على اختبار، من المفترض أن يتلقّى جهاز العميل المستهدَف الإشعار مع ظهور التطبيق في الخلفية.
للحصول على إحصاءات حول عملية تسليم الرسائل إلى تطبيقك، انتقِل إلى لوحة بيانات DevOps & Engagement > المراسلة > التقارير في وحدة تحكّم Firebase. تسجِّل لوحة البيانات هذه عدد الرسائل المرسَلة والمفتوحة على أجهزة Apple وAndroid، بالإضافة إلى بيانات "مرات الظهور" (الإشعارات التي يراها المستخدمون) لتطبيقات Android.
معالجة التفاعل
عندما ينقر المستخدمون على إشعار، يكون السلوك التلقائي على كل من Android وiOS هو فتح التطبيق. إذا تم إنهاء التطبيق، سيتم تشغيله، وإذا كان في الخلفية، سيتم عرضه في المقدّمة.
بناءً على محتوى الإشعار، قد تحتاج إلى معالجة تفاعل المستخدم عند فتح التطبيق. على سبيل المثال، إذا تم إرسال رسالة محادثة جديدة باستخدام إشعار ونقر المستخدم عليها، قد تحتاج إلى فتح المحادثة المحدّدة عند فتح التطبيق.
توفّر حزمة firebase-messaging طريقتَين لمعالجة هذا التفاعل:
getInitialMessage():إذا تم فتح التطبيق من حالة الإنهاء ، يعرض هذا الإجراءFutureيحتوي علىRemoteMessage. بعد استخدام ، ستتم إزالةRemoteMessageonMessageOpenedApp: StreamينشرRemoteMessageعند فتح التطبيق من حالة الخلفية.
لضمان حصول المستخدمين على تجربة سلسة، عليك معالجة كلتا الحالتَين. يوضّح مثال الرمز البرمجي التالي كيفية تحقيق ذلك:
class Application extends StatefulWidget { @override StatecreateState() => _Application(); } class _Application extends State { // In this example, suppose that all messages contain a data field with the key 'type'. Future setupInteractedMessage() async { // Get any messages which caused the application to open from // a terminated state. RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); // If the message also contains a data property with a "type" of "chat", // navigate to a chat screen if (initialMessage != null) { _handleMessage(initialMessage); } // Also handle any interaction when the app is in the background using a // Stream listener FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage); } void _handleMessage(RemoteMessage message) { if (message.data['type'] == 'chat') { Navigator.pushNamed(context, '/chat', arguments: ChatArguments(message), ); } } @override void initState() { super.initState(); // Run code required to handle interacted messages in an async function // as initState() must not be async setupInteractedMessage(); } @override Widget build(BuildContext context) { return Text("..."); } }
تعتمد طريقة معالجة التفاعل على الإعدادات. المثال الذي تم عرضه سابقًا هو مثال أساسي على استخدام StatefulWidget.
الخطوات التالية
بعد إكمال خطوات الإعداد، إليك بعض الخيارات للمضي قدمًا في استخدام FCM لـ Flutter: