برنامه‌نویسی اندروید

آموزش ساخت برنامه چت با Firebase Cloud Messaging

آموزش ساخت برنامه چت با Firebase Cloud Messaging

امروزه تقریباً تمام اپلیکیشن‌های مدرن نیاز به سیستم پیام‌رسانی و نوتیفیکیشن دارند. یکی از بهترین سرویس‌ها برای ارسال اعلان و پیام لحظه‌ای، سرویس Firebase است که توسط Google توسعه داده شده است.

در این مقاله یاد می‌گیریم چگونه یک برنامه چت حرفه‌ای با استفاده از:

  • Firebase Cloud Messaging (FCM)
  • Firebase Authentication
  • Firebase Realtime Database یا Firestore
  • Android (Kotlin)
  • Jetpack Compose

بسازیم.

Firebase Cloud Messaging چیست؟

سرویس FCM امکان ارسال:

  • Push Notification
  • پیام لحظه‌ای
  • پیام گروهی
  • اعلان‌های پس‌زمینه
  • پیام‌های Data

را برای اپلیکیشن‌های Android، iOS و Web فراهم می‌کند.

وب‌سایت رسمی:

Firebase Cloud Messaging

معماری کلی برنامه چت

در این پروژه از ساختار زیر استفاده می‌کنیم:

User A
   ↓
Firestore Database
   ↓
Cloud Function / Server
   ↓
FCM
   ↓
User B Notification

امکانات پروژه

در پایان مقاله اپلیکیشن شما دارای قابلیت‌های زیر خواهد بود:

  • ثبت‌نام و ورود کاربران
  • ارسال پیام متنی
  • دریافت پیام لحظه‌ای
  • ارسال نوتیفیکیشن هنگام دریافت پیام
  • نمایش آنلاین بودن کاربر
  • ذخیره توکن FCM
  • چت خصوصی
  • پشتیبانی از Compose
  • معماری MVVM

مرحله 1 — ساخت پروژه Firebase

ابتدا وارد کنسول Firebase شوید:

Firebase Console

سپس:

  1. روی Create Project کلیک کنید.
  2. نام پروژه را وارد کنید.
  3. Google Analytics را فعال کنید.
  4. پروژه را بسازید.

مرحله 2 — اتصال اپلیکیشن اندروید

افزودن Android App

در Firebase:

  • گزینه Android را انتخاب کنید.
  • Package Name پروژه را وارد کنید.

مثال:

com.example.chatapp
وب سایت Firebase

دانلود google-services.json

پس از ثبت اپلیکیشن:

google-services.json

را دانلود کرده و داخل مسیر زیر قرار دهید:

app/google-services.json

مرحله 3 — افزودن Dependency ها

فایل project build.gradle

plugins {
    id 'com.google.gms.google-services' version '4.4.2' apply false
}
کتابخانه فایربیس اندروید

فایل app/build.gradle

dependencies {

    implementation platform('com.google.firebase:firebase-bom:33.1.0')

    implementation 'com.google.firebase:firebase-auth'
    implementation 'com.google.firebase:firebase-firestore'
    implementation 'com.google.firebase:firebase-messaging'

}

مرحله 4 — فعال‌سازی Authentication

در Firebase Console:

Authentication → Sign-in Method

سپس:

  • Email/Password را فعال کنید.

مرحله 5 — ساخت مدل پیام

data class Message(
    val senderId: String = "",
    val receiverId: String = "",
    val text: String = "",
    val timestamp: Long = System.currentTimeMillis()
)

مرحله 6 — ارسال پیام به Firestore

ساخت Repository

class ChatRepository {

    private val db = FirebaseFirestore.getInstance()

    fun sendMessage(message: Message) {

        db.collection("messages")
            .add(message)
    }
}

مرحله 7 — دریافت پیام‌ها به صورت RealTime

fun listenMessages(
    chatId: String,
    onUpdate: (List<Message>) -> Unit
) {

    FirebaseFirestore.getInstance()
        .collection("messages")
        .addSnapshotListener { value, error ->

            if (value != null) {

                val messages =
                    value.toObjects(Message::class.java)

                onUpdate(messages)
            }
        }
}
سرویس Cloud Messaging

مرحله 8 — راه‌اندازی Firebase Cloud Messaging

ساخت Service

class MyFirebaseMessagingService :
    FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        super.onNewToken(token)

        Log.d("FCM_TOKEN", token)
    }

    override fun onMessageReceived(
        remoteMessage: RemoteMessage
    ) {
        super.onMessageReceived(remoteMessage)

        val title =
            remoteMessage.notification?.title

        val body =
            remoteMessage.notification?.body

        showNotification(title, body)
    }
}

مرحله 9 — ثبت Service در Manifest

<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">

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

</service>

مرحله 10 — دریافت توکن FCM

FirebaseMessaging.getInstance().token
    .addOnCompleteListener {

        if (it.isSuccessful) {

            val token = it.result

            Log.d("TOKEN", token)
        }
    }

مرحله 11 — ذخیره توکن کاربران

هر کاربر باید توکن اختصاصی خودش را داخل دیتابیس ذخیره کند.

مثال:

users
   uid
      name
      fcmToken

مرحله 12 — ارسال Push Notification

روش حرفه‌ای

بهترین روش استفاده از:

  • Cloud Functions
  • یا Backend اختصاصی

است.

نمونه ارسال پیام با HTTP API

{
  "to":"FCM_TOKEN",
  "notification":{
    "title":"پیام جدید",
    "body":"سلام، خوبی؟"
  }
}

نمونه کد Retrofit

interface NotificationApi {

    @POST("fcm/send")
    suspend fun sendNotification(
        @Body body: RequestBody
    )
}

مرحله 13 — ساخت Notification

private fun showNotification(
    title: String?,
    body: String?
) {

    val builder =
        NotificationCompat.Builder(this, "chat")

            .setContentTitle(title)
            .setContentText(body)
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setPriority(
                NotificationCompat.PRIORITY_HIGH
            )

    NotificationManagerCompat.from(this)
        .notify(1, builder.build())
}

مرحله 14 — ساخت Notification Channel

برای Android 8+ ضروری است:

if (Build.VERSION.SDK_INT >=
    Build.VERSION_CODES.O) {

    val channel = NotificationChannel(
        "chat",
        "Chat Notification",
        NotificationManager.IMPORTANCE_HIGH
    )

    val manager =
        getSystemService(
            NotificationManager::class.java
        )

    manager.createNotificationChannel(channel)
}

مرحله 15 — رابط کاربری چت با Compose

صفحه چت

@Composable
fun ChatScreen(
    messages: List<Message>
) {

    LazyColumn {

        items(messages) { message ->

            Text(
                text = message.text
            )
        }
    }
}

مرحله 16 — ارسال پیام

Button(
    onClick = {

        repository.sendMessage(
            Message(
                senderId = myId,
                receiverId = otherId,
                text = text
            )
        )
    }
) {
    Text("ارسال")
}
سرویس چت فایربیس

مرحله 17 — معماری پیشنهادی

ساختار حرفه‌ای پروژه:

data/
domain/
presentation/
di/
repository/
network/

مرحله 18 — امنیت Firestore

قوانین امنیتی

rules_version = '2';

service cloud.firestore {

  match /databases/{database}/documents {

    match /messages/{document} {

      allow read, write:
      if request.auth != null;
    }
  }
}

مرحله 19 — قابلیت‌های پیشرفته

می‌توانید امکانات زیر را اضافه کنید:

  • ارسال عکس
  • Voice Message
  • Seen Message
  • Typing Status
  • Online Status
  • گروه چت
  • تماس صوتی
  • تماس تصویری
  • رمزنگاری پیام‌ها
  • حذف پیام
  • Reply Message

مرحله 20 — استفاده از Cloud Functions

برای ارسال اتوماتیک نوتیفیکیشن:

Firestore Trigger
       ↓
Cloud Function
       ↓
FCM Send

مستندات رسمی:

Firebase Cloud Functions

نکات مهم Performance

1. Paging

برای جلوگیری از مصرف زیاد حافظه:

.limit(30)

2. ذخیره Local Cache

از:

  • Room Database

استفاده کنید.

3. استفاده از WorkManager

برای Sync در پس‌زمینه.

مزایای استفاده از Firebase

  • رایگان برای شروع
  • راه‌اندازی سریع
  • RealTime
  • مقیاس‌پذیری بالا
  • امنیت مناسب
  • بدون نیاز به سرور اختصاصی

معایب Firebase

  • وابستگی به Google
  • محدودیت پلن رایگان
  • هزینه بالا در مقیاس بزرگ
  • پیچیدگی Query ها در Firestore

جمع‌بندی

در این مقاله یاد گرفتیم چگونه یک سیستم چت حرفه‌ای با استفاده از:

  • Firebase
  • Firebase Cloud Messaging
  • Firestore
  • Kotlin
  • Jetpack Compose

پیاده‌سازی کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *