0Pricing
Android Academy · درس

الدفع باستخدام Cloud Messaging

أرسل إشعارات FCM واستقبلها

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

ما هي Cloud Messaging؟

تُرسل Firebase Cloud Messaging (FCM) إشعارات الدفع ورسائل البيانات إلى تطبيقك — حتى عندما يكون مغلقًا.

التدفق بسيط:

  • يحصل كل تثبيت للتطبيق على رمز تسجيل فريد.
  • يرسل خادمك (أو وحدة تحكم Firebase) رسالة إلى ذلك الرمز (أو إلى موضوع).
  • توجّه FCM الرسالة إلى الجهاز، الذي يعرضها أو يتعامل معها.

إضافة اعتماد Messaging

تتضمن مكتبة firebase-messaging خدمة FCM، ويحدد إصدارها BoM الذي أعددته سابقًا.

لا تحتاج إلى رقم إصدار عند وجود BoM.

// app/build.gradle.kts
dependencies {
    implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
    implementation("com.google.firebase:firebase-messaging")
}

إذن الإشعارات

في Android 13 (API 33) والإصدارات الأحدث، يتطلب نشر الإشعارات إذن وقت التشغيل POST_NOTIFICATIONS.

أعلن عن الإذن في ملف manifest، ثم اطلبه أثناء التشغيل — فبدون موافقة المستخدم تُسقط إشعاراتك بصمت.

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

طلب الإذن

استخدم Activity Result API لطلب POST_NOTIFICATIONS أثناء التشغيل. لا تطلبه إلا في API 33 والإصدارات الأحدث؛ أما الإصدارات الأقدم فتمنحه ضمنيًا.

import android.Manifest
import android.os.Build
import androidx.activity.result.contract.ActivityResultContracts

val requestPermission = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { granted ->
    println(if (granted) "Notifications allowed" else "Notifications denied")
}

fun askNotificationPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        requestPermission.launch(Manifest.permission.POST_NOTIFICATIONS)
    }
}

رمز التسجيل

يمتلك كل تثبيت رمز FCM فريدًا يعرّفه كهدف. احصل عليه باستخدام Firebase.messaging.token.

أرسل هذا الرمز إلى خادمك الخلفي حتى يتمكن من الدفع إلى ذلك الجهاز تحديدًا. قد تتغير الرموز، لذا تعامل دائمًا مع أحدث رمز باعتباره المعتمد.

import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await

suspend fun currentToken(): String {
    return Firebase.messaging.token.await()
}

خدمة Messaging

لتلقي الرسائل، وسّع FirebaseMessagingService. أعد تعريف onMessageReceived لمعالجة البيانات الواردة، وonNewToken للاستجابة عند تغيير الرمز.

سجّل الخدمة في ملف manifest باستخدام مرشح intent الخاص بـ FCM.

import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class MyFcmService : FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        // Upload the fresh token to your backend
        sendTokenToServer(token)
    }

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

    private fun sendTokenToServer(token: String) { /* ... */ }
    private fun showNotification(title: String, body: String) { /* ... */ }
}

تسجيل الخدمة

أعلن عن خدمتك في ملف manifest حتى يتمكن Android من تسليم الرسائل إليها. مرشح intent MESSAGING_EVENT مطلوب.

<!-- AndroidManifest.xml inside <application> -->
<service
    android:name=".MyFcmService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

رسائل الإشعارات مقابل رسائل البيانات

تأتي رسائل FCM بنوعين:

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

اقرأ الحقول المخصصة من message.data.

import com.google.firebase.messaging.RemoteMessage

fun handle(message: RemoteMessage) {
    val type = message.data["type"]      // your custom field
    val itemId = message.data["itemId"]
    when (type) {
        "chat" -> openChat(itemId)
        "promo" -> openPromo(itemId)
    }
}
fun openChat(id: String?) {}
fun openPromo(id: String?) {}

إنشاء قناة إشعارات

منذ Android 8، يحتاج كل إشعار إلى قناة. أنشئها مرة واحدة عند بدء التشغيل؛ ويستخدم النظام القناة للتحكم في الصوت والأهمية وإعدادات المستخدم الخاصة بكل قناة.

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context

fun createChannel(context: Context) {
    val channel = NotificationChannel(
        "messages",
        "Messages",
        NotificationManager.IMPORTANCE_HIGH
    )
    val manager = context.getSystemService(NotificationManager::class.java)
    manager.createNotificationChannel(channel)
}

عرض الإشعار

أنشئ الإشعار باستخدام NotificationCompat.Builder واربطه بمعرّف قناتك، ثم انشره باستخدام NotificationManagerCompat.

تذكّر: في API 33 والإصدارات الأحدث، لن يظهر الإشعار إلا إذا منح المستخدم الإذن POST_NOTIFICATIONS.

import android.content.Context
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat

fun showNotification(context: Context, title: String, body: String) {
    val notification = NotificationCompat.Builder(context, "messages")
        .setSmallIcon(android.R.drawable.ic_dialog_info)
        .setContentTitle(title)
        .setContentText(body)
        .setAutoCancel(true)
        .build()

    NotificationManagerCompat.from(context).notify(1, notification)
}

الاشتراك في الموضوعات

بدلًا من تتبع الرموز الفردية، يمكنك البث إلى موضوع. يشترك العملاء في اسم موضوع، ويرسل خادمك رسالة واحدة إلى جميع المشتركين.

وهذا مناسب لأشياء مثل إعلانات news أو sports أو all-users.

import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await

suspend fun subscribeToNews() {
    Firebase.messaging.subscribeToTopic("news").await()
}

suspend fun unsubscribeFromNews() {
    Firebase.messaging.unsubscribeFromTopic("news").await()
}

تحقق سريع

تطبيقك في الخلفية ويتلقى من FCM رسالة إشعار خالصة. ماذا يحدث؟

مراجعة: Cloud Messaging

يمكنك الآن الوصول إلى المستخدمين عبر إشعارات الدفع:

  • أضف firebase-messaging واطلب POST_NOTIFICATIONS في API 33 والإصدارات الأحدث.
  • يمتلك كل تثبيت رمز FCM؛ ارفعه إلى خادمك.
  • وسّع FirebaseMessagingService وأعد تعريف onMessageReceived / onNewToken.
  • اعرف الفرق بين رسائل الإشعارات ورسائل البيانات.
  • أنشئ قناة إشعارات، وأنشئ الإشعار باستخدام NotificationCompat، أو بثّه عبر الموضوعات.

وبذلك تكتمل ثلاثية Firebase: Auth وFirestore وMessaging — وهي توفّر خلفية متكاملة لتطبيق Android.

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

هل درس «الدفع باستخدام Cloud Messaging» مجاني؟

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

ماذا ستتعلم في «الدفع باستخدام Cloud Messaging»؟

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

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

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

كم من الوقت يستغرق درس «الدفع باستخدام Cloud Messaging»؟

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

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

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

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

  1. إعداد Firebase
  2. المصادقة باستخدام Firebase
  3. أساسيات Cloud Firestore
  4. الدفع باستخدام Cloud Messaging
← العودة إلى Android Academy