0Pricing
Android Academy · درس

الإشعارات الفورية

أرسلوا الإشعارات الفورية عبر Firebase Cloud Messaging. أعدّوا FCM، وأنشئوا قنوات الإشعارات، وابنوا إشعارات تتضمن إجراءات، وتعاملوا مع التسليم في الواجهة الأمامية مقابل الخلفية.

الإشعارات الفورية درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 4 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.

ما الإشعارات الفورية؟

تتيح الإشعارات الفورية لخادمك إرسال رسائل إلى المستخدمين حتى عندما لا يكون التطبيق في الواجهة. ومن الاستخدامات الشائعة:

  • تنبيهات الرسائل الجديدة
  • تحديثات حالة الطلب
  • الأخبار العاجلة
  • التذكيرات والعروض الترويجية

في Android، تُعد Firebase Cloud Messaging (FCM) خدمة التوصيل القياسية للإشعارات الفورية.

نظرة عامة على FCM

تدفق Firebase Cloud Messaging (FCM):

  1. يسجّل التطبيق نفسه لدى FCM عند التشغيل الأول ← ويتلقى token للجهاز
  2. يرسل التطبيق الرمز إلى خادمك
  3. عندما تريد إرسال إشعار فوري، يرسل خادمك رسالة إلى FCM
  4. تسلّم FCM الرسالة إلى الجهاز

FCM مجانية وموثوقة وتعمل حتى عند إيقاف التطبيق.

إضافة Firebase إلى المشروع

خطوات إضافة Firebase:

  1. انتقل إلى Firebase Console ← Add project ← Add Android app
  2. سجّل تطبيقك باستخدام اسم الحزمة
  3. نزّل google-services.json وضعه في app/
  4. أضف الإضافات والتبعيات
// project/build.gradle:
buildscript {
    dependencies { classpath 'com.google.gms:google-services:4.4.1' }
}

// app/build.gradle:
plugins { id 'com.google.gms.google-services' }

dependencies {
    implementation platform('com.google.firebase:firebase-bom:32.7.4')
    implementation 'com.google.firebase:firebase-messaging-ktx'
}

إذن FCM (Android 13 فأحدث)

بدءًا من Android 13 (API 33)، يجب طلب إذن POST_NOTIFICATIONS أثناء التشغيل — تمامًا مثل الإذن الخطِر:

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

// In Activity (Android 13+):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    requestPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
}

FirebaseMessagingService

أنشئ خدمة تتعامل مع رسائل FCM الواردة وتحديثات الرمز:

class MyFirebaseService : FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        // Send token to your backend to enable push delivery
        sendTokenToServer(token)
    }

    override fun onMessageReceived(message: RemoteMessage) {
        val title = message.notification?.title ?: "New Message"
        val body  = message.notification?.body  ?: ""
        showNotification(title, body)
    }
}

تسجيل الخدمة في Manifest

صرّح عن الخدمة في AndroidManifest.xml:

<service
    android:name=".MyFirebaseService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

قنوات الإشعارات (Android 8 فأحدث)

منذ Android 8 (Oreo)، يجب إسناد الإشعارات إلى channel. ويمكن للمستخدمين التحكم في الصوت والاهتزاز والأهمية لكل قناة:

fun createNotificationChannel(context: Context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            "messages_channel",           // channel ID
            "Messages",                   // user-visible name
            NotificationManager.IMPORTANCE_HIGH
        ).apply {
            description = "Incoming message notifications"
            enableVibration(true)
        }
        val manager = context.getSystemService(NotificationManager::class.java)
        manager.createNotificationChannel(channel)
    }
}

إنشاء إشعار وعرضه

استخدم NotificationCompat.Builder لضمان التوافق بين إصدارات Android:

fun showNotification(context: Context, title: String, body: String) {
    val intent = Intent(context, MainActivity::class.java)
    val pendingIntent = PendingIntent.getActivity(
        context, 0, intent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )

    val notification = NotificationCompat.Builder(context, "messages_channel")
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle(title)
        .setContentText(body)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setAutoCancel(true)             // dismiss on tap
        .setContentIntent(pendingIntent) // open app on tap
        .build()

    NotificationManagerCompat.from(context)
        .notify(System.currentTimeMillis().toInt(), notification)
}

إشعار مع إجراءات

أضف أزرار إجراءات إلى الإشعارات حتى يتمكن المستخدمون من تنفيذ الإجراءات دون فتح التطبيق:

val replyIntent = Intent(context, ReplyReceiver::class.java)
val replyPending = PendingIntent.getBroadcast(
    context, 1, replyIntent,
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

val notification = NotificationCompat.Builder(context, "messages_channel")
    .setSmallIcon(R.drawable.ic_notification)
    .setContentTitle("New message from Alice")
    .setContentText("Hey, are you coming?")
    .addAction(R.drawable.ic_reply, "Reply", replyPending)
    .addAction(R.drawable.ic_dismiss, "Dismiss", null)
    .build()

التعامل في الواجهة مقابل الخلفية

يعمل FCM بشكل مختلف حسب حالة التطبيق:

  • التطبيق في الواجهة — يُستدعى onMessageReceived()؛ وعليك إنشاء الإشعار وعرضه بنفسك
  • التطبيق في الخلفية أو متوقف — يعرض FCM الإشعار تلقائيًا من حمولة notification؛ ولا يُستدعى onMessageReceived

ضع البيانات الإضافية في حمولة data (وليس notification) لتتلقاها دائمًا في onMessageReceived.

الحصول على رمز FCM

استرجع رمز FCM الحالي لإرساله إلى خادمك:

FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w("FCM", "Fetching token failed", task.exception)
        return@addOnCompleteListener
    }
    val token = task.result
    Log.d("FCM", "Token: $token")
    // Send token to your server
    sendTokenToServer(token)
}

تحقق سريع

ماذا يحدث عندما يكون تطبيقك في الخلفية وتسلّم FCM رسالة تحتوي على حمولة 'notification'؟

مراجعة: الإشعارات الفورية

الإشعارات الفورية باستخدام FCM على Android:

  • أضف Firebase وgoogle-services.json وfirebase-messaging-ktx
  • اطلب POST_NOTIFICATIONS على Android 13 فأحدث
  • أنشئ FirebaseMessagingService ← onNewToken + onMessageReceived
  • أنشئ NotificationChannel لنظام Android 8 فأحدث
  • أنشئ الإشعارات باستخدام NotificationCompat.Builder
  • استخدم حمولة data لتتلقى الرسالة دائمًا في onMessageReceived

التالي: جدولة العمل في الخلفية باستخدام WorkManager.

الأسئلة الشائعة

هل درس «الإشعارات الفورية» مجاني؟

نعم — نص درس «الإشعارات الفورية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.

ماذا ستتعلم في «الإشعارات الفورية»؟

أرسلوا الإشعارات الفورية عبر Firebase Cloud Messaging. أعدّوا FCM، وأنشئوا قنوات الإشعارات، وابنوا إشعارات تتضمن إجراءات، وتعاملوا مع التسليم في الواجهة الأمامية مقابل الخلفية. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 6.

كم من الوقت يستغرق درس «الإشعارات الفورية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Retrofit وواجهات REST API
  2. تحميل الصور باستخدام Coil
  3. معالجة الأخطاء وتجربة المستخدم
  4. الإشعارات الفورية
  5. WorkManager والمهام في الخلفية
  6. النشر على Play Store
← العودة إلى Android Academy