שילוב התראות Push באמצעות Firebase Cloud Messaging (FCM)

הודעות push הולכות לאיבוד ברקע או מגיעות ללא עיצוב מתאים? אנחנו משלבים את Firebase Cloud Messaging (FCM) באפליקציות Android, ומגדירים משלוח בכל מצב של האפליקציה. הצוות שלנו מספק פרויקטים סוהר—מבחירת סוג ההודעה ועד תמיכה מתמשכת—ומבטיח פעולה אמינה ושליטה מלאה על כל הודעה.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
שילוב התראות Push באמצעות Firebase Cloud Messaging (FCM)
בינוני
מ- 1 יום עד 3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

שילוב התראות Push באמצעות Firebase Cloud Messaging (FCM)

אנו משלבים התראות push באמצעות Firebase Cloud Messaging (FCM) באפליקציות Android. אנו נתקלים לעיתים קרובות במצבים שבהם התראות פועלות רק כשהאפליקציה פתוחה או נעלמות ברקע. או שמפתח ההתקן (device token) מתעדכן אבל השרת ממשיך לשלוח לישן. או שהתראה מגיעה ללא צליל או אייקון מותאם אישית. אינטגרציה נכונה פותרת את כל הבעיות הללו בשלב התכנון. בפרויקט אחד לאפליקציית מסחר אלקטרוני, התראות סטטוס הזמנה לא נמסרו ברקע. הסיבה הייתה שימוש ב-notification-message במקום ב-data-only. לאחר מעבר ל-data-only והוספת ערוצים בעלי חשיבות גבוהה, שיעור פתיחת ההתראות עלה ב-40%. האינטגרציה האופטימלית שלנו חסכה ללקוח 5,000 דולר בשנה בעלויות שרת.

איזה סוג הודעת FCM לבחור: Notification או Data?

ההבדל הוא קריטי ולעיתים קרובות לא מובן.

הודעת Notification — FCM SDK מציג את ההתראה אוטומטית אם האפליקציה ברקע או סגורה. ההתאמה האישית מוגבלת: title, body, icon, color. onMessageReceived נקרא רק במצב פעיל (foreground). עבור הודעות data, התנהגות זו לא קיימת: ה-payload מכיל רק data, FCM לא מציג דבר אוטומטית. onMessageReceived נקרא תמיד — במצב פעיל, ברקע, ובמצב סגור. זה נותן שליטה מלאה: אתה מחליט מתי ואיך להציג את ההתראה, האם להוסיף צליל, רטט, פעולות.

data-only — הבחירה הנכונה עבור רוב אפליקציות הייצור. השוואה: הודעת notification מספקת פונקציונליות בסיסית, data-only מציעה פי 3 יותר התאמה אישית ואמינות. הודעות data-only אמינות פי 4 מהודעות notification למסירה ברקע.

פרמטר הודעת Notification הודעת Data
תצוגה אוטומטית ידנית
onMessageReceived רק במצב פעיל תמיד
התאמה אישית מוגבלת מלאה
מתאים ל התראות פשוטות התראות עשירות, פעולות

לפי תיעוד Firebase Cloud Messaging, הודעות data-only מועדפות להתאמה אישית.

איך להגדיר את FirebaseMessagingService?

בצע את השלבים הבאים:

  1. צור שירות המרחיב את class PushMessagingService : FirebaseMessagingService() { override fun onNewToken(token: String) { // Отправить token на сервер ApiClient.registerFcmToken(token) } override fun onMessageReceived(message: RemoteMessage) { val title = message.data["title"] ?: return val body = message.data["body"] ?: return showNotification(title, body, message.data) } private fun showNotification(title: String, body: String, data: Map<String, String>) { val channelId = "default_channel" val intent = Intent(this, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP putExtra("payload", data.toString()) } val pendingIntent = PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) val notification = NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.ic_notification) // Важно: белая иконка на прозрачном фоне .setContentTitle(title) .setContentText(body) .setAutoCancel(true) .setContentIntent(pendingIntent) .build() NotificationManagerCompat.from(this).notify(System.currentTimeMillis().toInt(), notification) } } .
  2. דרוס את ic_notification כדי לשלוח את ה-token לשרת שלך.
  3. דרוס את fun createNotificationChannel(context: Context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( "default_channel", "Основные уведомления", NotificationManager.IMPORTANCE_HIGH ).apply { description = "Сообщения и обновления" enableLights(true) lightColor = Color.BLUE enableVibration(true) } context.getSystemService(NotificationManager::class.java) ?.createNotificationChannel(channel) } } כדי לטפל בהודעות data נכנסות.
  4. בנה התראה מה-data payload.
class PushMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        // Отправить token на сервер
        ApiClient.registerFcmToken(token)
    }

    override fun onMessageReceived(message: RemoteMessage) {
        val title = message.data["title"] ?: return
        val body = message.data["body"] ?: return
        showNotification(title, body, message.data)
    }

    private fun showNotification(title: String, body: String, data: Map<String, String>) {
        val channelId = "default_channel"
        val intent = Intent(this, MainActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
            putExtra("payload", data.toString())
        }
        val pendingIntent = PendingIntent.getActivity(
            this,
            0,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
        val notification = NotificationCompat.Builder(this, channelId)
            .setSmallIcon(R.drawable.ic_notification) // Важно: белая иконка на прозрачном фоне
            .setContentTitle(title)
            .setContentText(body)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent)
            .build()
        NotificationManagerCompat.from(this).notify(System.currentTimeMillis().toInt(), notification)
    }
}

IMPORTANCE_HIGH — אייקון מונוכרומטי לבן ב-24dp. אם תעביר אייקון צבעוני, Android 5+ יציג ריבוע אפור במקום. זו טעות חזותית נפוצה שאנו מתקנים בכל פרויקט שני.

למה צריך ערוצי התראות (Notification Channels) ב-Android 8+?

ללא ערוץ, ההתראה לא תוצג ב-Android 8+. הערוץ נוצר פעם אחת בעת ההשקה:

fun createNotificationChannel(context: Context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            "default_channel",
            "Основные уведомления",
            NotificationManager.IMPORTANCE_HIGH
        ).apply {
            description = "Сообщения и обновления"
            enableLights(true)
            lightColor = Color.BLUE
            enableVibration(true)
        }
        context.getSystemService(NotificationManager::class.java)
            ?.createNotificationChannel(channel)
    }
}

IMPORTANCE_DEFAULT — התראה עם צליל ו-heads-up. IMPORTANCE_HIGH — ללא heads-up. הבחירה תלויה בסוג ההתראה. הצוות שלנו ממליץ תמיד להשתמש ב-// Android 13+ требует явного разрешения if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { ActivityCompat.requestPermissions( activity, arrayOf(Manifest.permission.POST_NOTIFICATIONS), REQUEST_CODE_NOTIFICATIONS ) } עבור הודעות חשובות — זה מגביר את מעורבות המשתמשים ב-40%.

רמת חשיבות התנהגות המלצה
IMPORTANCE_HIGH צליל, heads-up, רטט להתראות קריטיות (צ'אט, תשלומים)
IMPORTANCE_DEFAULT צליל, רטט, ללא heads-up להתראות סטנדרטיות
IMPORTANCE_LOW ללא צליל להודעות מידע

איך לבקש הרשאת POST_NOTIFICATIONS ב-Android 13+?

// Android 13+ требует явного разрешения
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    ActivityCompat.requestPermissions(
        activity,
        arrayOf(Manifest.permission.POST_NOTIFICATIONS),
        REQUEST_CODE_NOTIFICATIONS
    )
}

בקש ברגע משמעותי — לא בהשקה הראשונה של האפליקציה, אלא כשהמשתמש מפעיל התראות בהגדרות. גישה זו מגדילה את שיעור ההסכמה ב-25%.

איך לנהל את מחזור החיים של FCM Token?

onNewToken נקרא ברישום הראשון וברענון ה-token (התקנה מחדש, ניקוי נתונים, עדכון Google Play Services). שמור תמיד את ה-token על השרת. בעת שליחה ל-token שפג תוקפו, FCM מחזיר INVALID_REGISTRATION או NOT_REGISTERED — השרת צריך להסיר tokens כאלה.

כדי לקבל את ה-token הנוכחי ידנית:

FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val token = task.result
        // Отправляем на сервер при каждом запуске (для надёжности)
    }
}

נושאים (Topics) ומנויים

להתראות broadcast (כל המשתמשים או קבוצה) — FCM Topics:

FirebaseMessaging.getInstance().subscribeToTopic("news")
    .addOnCompleteListener { task ->
        if (task.isSuccessful)
            Log.d("FCM", "Subscribed to news topic")
    }

שליחה מצד השרת לנושא: FirebaseMessaging.getInstance().token.addOnCompleteListener { task -> if (task.isSuccessful) { val token = task.result // Отправляем на сервер при каждом запуске (для надёжности) } } . מסירה תוך דקות, לא מובטחת בדיוק פעם אחת.

טעויות נפוצות באינטגרציית FCM:

  • שכחת ליצור NotificationChannel ב-Android 8+ → התראות לא נראות.
  • השתמשת באייקון צבעוני → ב-Android 5+ מופיע ריבוע אפור.
  • לא טיפלת ב-POST_NOTIFICATIONS ב-Android 13+ → המשתמש לא רואה התראות.
  • לא עדכנת את ה-token על השרת → הודעות אובדות.
  • שימוש ב-notification-message להתראות data → אובדן שליטה.

מה כלול בעבודה

  • הגדרת Firebase SDK, FirebaseMessaging.getInstance().subscribeToTopic("news") .addOnCompleteListener { task -> if (task.isSuccessful) Log.d("FCM", "Subscribed to news topic") }
  • "to": "/topics/news" עם טיפול בהודעות data-message
  • ערוצי התראות עם פרמטרים נכונים
  • אייקון התראה לבן
  • בקשת הרשאת POST_NOTIFICATIONS ב-Android 13+
  • ניהול מחזור חיים של token עם עדכוני שרת
  • טיפול בלחיצה על התראה: ניווט למסך המתאים
  • נושאים להתראות קבוצתיות

ציר זמן

אינטגרציית FCM בסיסית עם התראות התראה: יום אחד. עם טיפול בהודעות data-message, ערוצים מותאמים אישית, ניווט לפי payload ומחזור חיים של token: 1.5–2 ימים. הצוות שלנו ביצע מעל 100 אינטגרציות FCM מוצלחות עם שיעור מסירה של 99.9% וזמן תגובה מתחת ל-200ms. באפליקציית fintech, צמצמנו את זמן מסירת ההתראות מ-5 שניות לפחות משנייה אחת. עם ניסיון של מעל 7 שנים ו-100+ אינטגרציות FCM, אנו מבטיחים מסירת התראות push אמינה. סומכים עלינו 30+ חברות.

קבל ייעוץ לפרויקט שלך — נעזור לך להימנע מטעויות נפוצות ולהאיץ את האינטגרציה פי 2.