بدء استخدام "المراسلة عبر السحابة الإلكترونية من Firebase" في تطبيقات Android

اختيار المنصة: iOS+ Android الويب Flutter Unity C++‎


يوضّح هذا الدليل كيفية بدء استخدام Firebase Cloud Messaging في تطبيقات Android الخاصة بالعملاء حتى تتمكّن من إرسال الرسائل بشكل موثوق.

تتطلّب عملاء FCM أجهزة تعمل بالإصدار 6.0 من نظام التشغيل Android أو إصدار أحدث، وأن يكون تطبيق "متجر Google Play" مثبّتًا عليها، أو محاكيًا يعمل بالإصدار 6.0 من نظام التشغيل Android مع واجهات Google البرمجية. يُرجى العِلم أنّه لا يقتصر نشر تطبيقات Android على "متجر Google Play".

إعداد حزمة تطوير البرامج (SDK)

أضِف Firebase إلى مشروع Android، في حال لم يسبق لك إجراء ذلك.

للحصول على أفضل تجربة مع FCM، ننصحك بشدة بتفعيل Google Analytics في مشروعك. Google Analytics شرط أساسي لإعداد تقارير حول تسليم الرسائل في FCM.

تعديل بيان تطبيقك

أضِف ما يلي إلى بيان تطبيقك:

  • خدمة توسّع نطاق FirebaseMessagingService. ويكون ذلك مطلوبًا إذا أردت تنفيذ أي إجراءات أخرى على الرسائل غير تلقّي الإشعارات على التطبيقات التي تعمل في الخلفية. لتلقّي الإشعارات في التطبيقات التي تعمل في المقدّمة، ولتلقّي حمولة البيانات وغير ذلك، عليك توسيع نطاق هذه الخدمة.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (اختياري) ضمن مكوّن التطبيق، عناصر البيانات الوصفية التي تضبط رمزًا ولونًا تلقائيين للإشعارات يستخدم نظام التشغيل Android هذه القيم عندما لا تحدّد الرسائل الواردة الرمز أو اللون بشكل صريح.
  • <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
         See README(https://goo.gl/l4GJaQ) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_ic_notification" />
    <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
         notification message. See README(https://goo.gl/6BKBk7) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />
  • (اختياري) بدءًا من الإصدار 8.0 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 26) والإصدارات الأحدث، تتوفّر قنوات الإشعارات ويُنصح باستخدامها. توفّر FCM قناة إشعارات تلقائية تتضمّن إعدادات أساسية. إذا كنت تفضّل إنشاء واستخدام قناتك التلقائية، اضبط قيمة default_notification_channel_id على معرّف عنصر قناة الإشعارات كما هو موضّح، وستستخدم FCM هذه القيمة عندما لا تحدّد الرسائل الواردة قناة إشعارات بشكل صريح. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة إدارة قنوات الإشعارات.
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

طلب إذن إرسال الإشعارات أثناء التشغيل على الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث

يقدِّم نظام التشغيل Android 13 إذن التشغيل الجديد لعرض الإشعارات. يؤثّر ذلك في جميع التطبيقات التي تعمل على نظام التشغيل Android 13 أو الإصدارات الأحدث والتي تستخدم FCMالإشعارات.

تتضمّن حزمة تطوير البرامج (SDK) FCM (الإصدار 23.0.6 أو إصدار أحدث) تلقائيًا الإذن POST_NOTIFICATIONS المحدّد في ملف البيان. ومع ذلك، سيحتاج تطبيقك أيضًا إلى طلب إصدار الإذن الخاص بوقت التشغيل باستخدام الثابت android.permission.POST_NOTIFICATIONS. ولن يُسمح لتطبيقك بعرض الإشعارات إلى أن يمنحه المستخدم هذا الإذن.

لطلب إذن التشغيل الجديد، اتّبِع الخطوات التالية:

Kotlin

// Declare the launcher at the top of your Activity/Fragment:
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission(),
) { isGranted: Boolean ->
    if (isGranted) {
        // FCM SDK (and your app) can post notifications.
    } else {
        // TODO: Inform user that that your app will not show notifications.
    }
}

private fun askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
        }
    }
}

Java

// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                // FCM SDK (and your app) can post notifications.
            } else {
                // TODO: Inform user that that your app will not show notifications.
            }
        });

private void askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
                PackageManager.PERMISSION_GRANTED) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
        }
    }
}

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

اطّلِع على إذن وقت التشغيل الخاص بالإشعارات للتعرّف على المزيد من أفضل الممارسات بشأن الحالات التي يجب أن يطلب فيها تطبيقك إذن POST_NOTIFICATIONS من المستخدم.

أذونات الإشعارات للتطبيقات التي تستهدف الإصدار 12L من Android (المستوى 32 لواجهة برمجة التطبيقات) أو الإصدارات الأقدم

يطلب نظام التشغيل Android تلقائيًا من المستخدم منح الإذن في المرة الأولى التي ينشئ فيها تطبيقك قناة إشعارات، طالما أنّ التطبيق يعمل في المقدّمة. ومع ذلك، هناك بعض التحذيرات المهمة بشأن توقيت إنشاء القناة وطلبات الأذونات:

  • إذا أنشأ تطبيقك قناة الإشعارات الأولى أثناء تشغيله في الخلفية، وهو ما تفعله حزمة تطوير البرامج FCM عند تلقّي إشعار FCM، لن يسمح نظام التشغيل Android بعرض الإشعار ولن يطلب من المستخدم منح إذن إرسال الإشعارات إلا في المرة التالية التي يتم فيها فتح تطبيقك. وهذا يعني أنّه سيتم فقدان أي إشعارات تم تلقّيها قبل فتح تطبيقك وقبل أن يوافق المستخدم على الإذن.
  • ننصحك بشدة بتحديث تطبيقك ليصبح متوافقًا مع الإصدار 13 من نظام التشغيل Android أو الإصدارات الأحدث للاستفادة من واجهات برمجة التطبيقات في النظام لطلب الإذن. إذا لم يكن ذلك ممكنًا، يجب أن ينشئ تطبيقك قنوات الإشعارات قبل إرسال أي إشعارات إلى التطبيق من أجل تشغيل مربّع حوار إذن إرسال الإشعارات والتأكّد من عدم فقدان أي إشعارات. يمكنك الاطّلاع على أفضل الممارسات المتعلّقة بإذن إرسال الإشعارات للحصول على مزيد من المعلومات.

اختياري: إزالة إذن POST_NOTIFICATIONS

تتضمّن حزمة تطوير البرامج (SDK) FCM الإذن POST_NOTIFICATIONS تلقائيًا. إذا كان تطبيقك لا يستخدم رسائل الإشعارات (سواء من خلال FCMالإشعارات أو من خلال حزمة SDK أخرى أو من خلال نشرها مباشرةً من تطبيقك) ولا تريد أن يتضمّن تطبيقك الإذن، يمكنك إزالته باستخدام العلامة remove في أداة دمج ملفات البيان. يُرجى العِلم أنّ إزالة هذا الإذن تمنع عرض جميع الإشعارات، وليس فقط إشعارات FCM. أضِف ما يلي إلى ملف بيان التطبيق:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

الوصول إلى معرّف التثبيت في Firebase

عند بدء تشغيل تطبيقك لأول مرة، تسجِّل حزمة تطوير البرامج (SDK) الخاصة بـ FCM مثيل التطبيق في FCM وتعرض معرّفًا لمثيل التطبيق. إذا كنت تريد استهداف مثيلات فردية للتطبيق، عليك الوصول إلى هذا المعرّف من خلال توسيع FirebaseMessagingService وتجاوز onRegistered(). وفقًا لأفضل الممارسات، عليك استرداد أحدث معرّف تم تعديله لأنّه يمكن أن يتغير بعد بدء التشغيل الأوّلي.

تفعيل التسجيل من خلال معرّف تثبيت Firebase

لتفعيل تسجيل مثيل تطبيقك باستخدام معرّف تثبيت Firebase (FID)، أضِف علامة البيانات الوصفية التالية إلى ملف AndroidManifest.xml:FCM
<meta-data
    android:name="firebase_messaging_installation_id_enabled"
    android:value="true" />

تنفيذ وظيفة الاستدعاء onRegistered()

يتم استهداف مثيلات التطبيق باستخدام معرّف التثبيت في Firebase (FID) بعد تسجيلها في FCM. لاسترداد معرّف FID عند التسجيل، نفِّذ دالة ردّ الاتصال onRegistered(). بعد تسجيل مثيل تطبيق، تراقب حزمة تطوير البرامج (SDK) الخاصة بـ FCM تلقائيًا التغييرات في المعرّف FID وتستدعي وظيفة معاودة الاتصال عند رصد أي تغيير. عند تفعيل ميزة "بدء الإعداد تلقائيًا"، تتم مزامنة حزمة تطوير البرامج (SDK) FCM تلقائيًا مع الخلفية FCM لإبقاء التسجيل محدّثًا، ويتم استدعاء وظيفة معاودة الاتصال لضمان حصول خادم تطبيقك على المعرّف الحالي. للحماية من فقدان معرّف FID أو أن يصبح قديمًا، عليك إرسال معرّف FID إلى خادم تطبيقك كلما تم تشغيل هذا الإجراء.

Kotlin

  /**
   * There are three scenarios when `onRegistered` is called:
   * 1) Every time a manual `register()` call finishes successfully
   * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID.
   * 3) Automatically on app startup or routine sync when auto-initialization is enabled.
   * Under #2, there are three scenarios when the existing FID is changed:
   * A) App is restored to a new device
   * B) User uninstalls/reinstalls the app
   * C) User clears app data
   */
  override fun onRegistered(installationId: String) {
      Log.d(TAG, "Registered installation ID: $installationId")

      // Send the Firebase Installation ID to your app server.
      sendRegistrationToServer(installationId)
  }
    

Java

  /**
   * There are three scenarios when `onRegistered` is called:
   * 1) Every time a manual `register()` call finishes successfully
   * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID
   * 3) Automatically on app startup or routine sync when auto-initialization is enabled.
   * Under #2, there are three scenarios when the existing FID is changed:
   * A) App is restored to a new device
   * B) User uninstalls/reinstalls the app
   * C) User clears app data
   */
  @Override
  public void onRegistered(@NonNull String installationId) {
      Log.d(TAG, "Registered installation ID: " + installationId);

      // Send the Firebase Installation ID to your app server.
      sendRegistrationToServer(installationId);
  }
    

التسجيل يدويًا عند إيقاف ميزة "التهيئة التلقائية"

إذا كان عليك إيقاف ميزة الإعداد التلقائي، لن تتم مزامنة حزمة تطوير البرامج (SDK) الخاصة بـ FCM تلقائيًا أو تشغيل onRegistered() عند بدء التشغيل. ننصح بشدة بإعادة تفعيل الإعداد التلقائي بعد منح أذونات الإشعارات. لمزيد من المعلومات، اطّلِع على مقالة إعادة تفعيل الإعداد التلقائي.

إذا كان يجب إبقاء الإعداد التلقائي غير مفعَّل، استدعِ الدالة FirebaseMessaging.getInstance().register() عند بدء تشغيل التطبيق لتفعيل التسجيل وإرسال المعرّف FID من خلال onRegistered(). يمكنك تنفيذ هذا الاستدعاء ضمن طريقة onCreate() في Activity الرئيسي.

Kotlin

  // Trigger manual registration if auto-initialization is turned off.
  // Consider calling this every time the app starts to guarantee sync status.
  FirebaseMessaging.getInstance().register()
      .addOnCompleteListener(this) { task ->
        if (!task.isSuccessful()) {
          // Registration failed. Consider retrying the registration with exponential backoff.
          Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception)
        }
        // Success! The Firebase Installation ID can be used to target messages to this app
        // instance and will be delivered asynchronously to your `onRegistered()` callback.
      }
    

Java

  // Trigger manual registration if auto-initialization is turned off.
  // Consider calling this every time the app starts to guarantee sync status.
  FirebaseMessaging.getInstance().register()
      .addOnCompleteListener(task -> {
        if (!task.isSuccessful()) {
          // Registration failed. Consider retrying the registration with exponential backoff.
          Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception)
        }
        // Success! The Firebase Installation ID can be used to target messages to this app
        // instance and will be delivered asynchronously to your `onRegistered()` callback.
      });
    

الوصول إلى رمز التسجيل المميز في FCM (متوقّف نهائيًا)

عند بدء تشغيل تطبيقك لأول مرة، تنشئ حزمة تطوير البرامج (SDK) FCM رمزًا مميزًا للتسجيل لنسخة تطبيق العميل. إذا كنت تريد استهداف مثيلات تطبيق فردية أو إنشاء مجموعات أجهزة، عليك الوصول إلى هذا الرمز المميّز من خلال توسيع نطاق FirebaseMessagingService وتجاوز onNewToken. بما أنّه يمكن تغيير الرمز المميّز بعد بدء التشغيل الأوّلي، ننصحك بشدة باسترداد أحدث رمز مميّز معدَّل للتسجيل.

قد يتغيّر رمز التسجيل في الحالات التالية:

  • تمت استعادة التطبيق على جهاز جديد
  • يلغي المستخدم تثبيت التطبيق أو يعيد تثبيته
  • يمحو المستخدم بيانات التطبيق.

استرداد رمز التسجيل الحالي

عندما تحتاج إلى استرداد الرمز المميّز الحالي، استدعِ الدالة FirebaseMessaging.getInstance().getToken():

Kotlin

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

مراقبة إنشاء الرموز المميزة

يتم تشغيل دالة onNewToken عند إنشاء رمز مميّز جديد.

Kotlin

/**
 * Called if the FCM registration token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the
 * FCM registration token is initially generated so this is where you would retrieve the token.
 */
override fun onNewToken(token: String) {
    Log.d(TAG, "Refreshed token: $token")

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token)
}

Java

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@Override
public void onNewToken(@NonNull String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token);
}

بعد الحصول على الرمز المميّز، يمكنك إرساله إلى خادم تطبيقك وتخزينه باستخدام طريقتك المفضّلة.

التحقّق من توفّر "خدمات Google Play"

يجب أن تتحقّق التطبيقات التي تعتمد على حزمة تطوير البرامج (SDK) الخاصة بخدمات Play دائمًا من توفّر حزمة APK متوافقة من &quot;خدمات Google Play&quot; على الجهاز قبل الوصول إلى ميزات &quot;خدمات Google Play&quot;. لمزيد من المعلومات، يُرجى الاطّلاع على إعداد "خدمات Google Play". ننصحك بإجراء ذلك في موضعَين: في إجراء onCreate() الخاص بالنشاط الرئيسي، وفي إجراء onResume() الخاص به. يضمن تسجيل الدخول في onCreate() عدم إمكانية استخدام التطبيق بدون إكمال عملية التحقّق بنجاح. يضمن تسجيل الدخول في onResume() أنّه إذا عاد المستخدم إلى التطبيق قيد التشغيل من خلال وسيلة أخرى، مثل زر الرجوع، سيتم إجراء عملية التحقّق.

إذا لم يكن الجهاز يتضمّن إصدارًا متوافقًا من "خدمات Google Play"، يمكن لتطبيقك استدعاء GoogleApiAvailability.makeGooglePlayServicesAvailable() للسماح للمستخدمين بتنزيل "خدمات Google Play" من "متجر Play".

منع بدء التشغيل التلقائي

عند إنشاء FCM تسجيل، تحمّل المكتبة المعرّف وبيانات الإعداد إلى Firebase. إذا كنت تفضّل منع التسجيل التلقائي، أوقِف جمع البيانات في "إحصاءات 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، عليك إجراء عملية استدعاء في وقت التشغيل:

Kotlin

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

لإعادة تفعيل عملية جمع البيانات في &quot;إحصاءات Google&quot;، استدعِ طريقة setAnalyticsCollectionEnabled() الفئة FirebaseAnalytics. على سبيل المثال:

setAnalyticsCollectionEnabled(true);

تظل هذه القيم محفوظة عند إعادة تشغيل التطبيق بعد ضبطها.

إرسال رسالة إشعار

للتأكّد من إعداد تطبيق Android بشكل صحيح، يمكنك إرسال رسالة إشعار اختبارية باتّباع التعليمات التالية:

  1. ثبِّت التطبيق وشغِّله على جهاز الاختبار.

  2. تأكَّد من تشغيل التطبيق في الخلفية على الجهاز.

  3. في وحدة تحكّم Firebase، انتقِل إلى عمليات DevOps والتفاعل > المراسلة

  4. أنشئ حملة.

    • إذا كانت هذه هي رسالتك الأولى:

      1. انقر على إنشاء حملتك الأولى.

      2. اختَر رسائل إشعارات Firebase، ثمّ اختَر إنشاء.

    • إذا سبق لك إنشاء حملات:

      1. في علامة التبويب الحملات، انقر على حملة جديدة.

      2. انقر على الإشعارات.

  5. أدخِل نص الرسالة. جميع الحقول الأخرى اختيارية.

  6. انقر على إرسال رسالة اختبار من اللوحة اليمنى.

  7. في الحقل الذي يحمل التصنيف إضافة رمز مميّز للتسجيل في خدمة "مراسلة Firebase السحابية"، أدخِل رمز التسجيل الذي حصلت عليه في قسم سابق من هذا الدليل.

  8. انقر على اختبار.

يجب أن يتلقّى جهاز العميل المستهدف الإشعار عندما يكون التطبيق مفعّلاً في الخلفية.

للحصول على إحصاءات حول عملية تسليم الرسائل إلى تطبيقك، انتقِل إلى لوحة بيانات التقارير في قسم عمليات تطوير البرامج وإشراك المستخدمين > المراسلة في وحدة تحكّم Firebase. تسجّل لوحة البيانات هذه عدد الرسائل التي تم إرسالها وفتحها على أجهزة Apple وAndroid، بالإضافة إلى بيانات "مرات الظهور" (الإشعارات التي يراها المستخدمون) لتطبيقات Android.

الخطوات التالية

بعد إكمال خطوات الإعداد، إليك بعض الخيارات لمواصلة استخدام FCM على Android: