برمجة الأندرويد

FCM بالعربية – Firebase Cloud Messaging الجزء الأول

قمنا بكتابة مقالتين من قبل عن GCM وكيفية عمل Push Notification باستخدامها فى درسين من الدروس السابقة GCM بالـعربية  الدرس الأول  و GCM بالـعربية – الدرس الثانى وخرجت علينا جوجل فى المؤتمر الاخير للاعلان عن دمج Firebase مع GCM والان اصبحت FCM  اختصارا لـ Firebase Cloud Messaging وهو ما سنقوم بشرحه اليوم فى هذه التدوينة .

 

بداية Firebase تشبه GooglePlayService فى الخدمات حيث تجد ان PlayService يمكنك استخدام ads و gcm و maps وغيرها كذلك الـ Firebase تقدم لك العديد من الخدمات الاخرى مثل الـ Testing والـ Crash Reports و الـCloud Messaging وغيرها من الخدمات والتى ستناول احداها اليوم ونتعلم كيفية ارسال الاشعارات بواسطة firebase

 

إنشاء تطبيق فى Firebase Console 

كما فعلنا فى GCM عند استخدامها سابقا وكنا  نحتاج لانشاء تطبيق عن طريق الـ Console الخاصة بجوجل لكن هذه المرة سيكون عن طريق الـ Console الخاصة بـ firebase  من هذا الرابط

 

نقوم بإنشاء تطبيق جديد او استيراد تطبيق موجود مسبقا فى Console جوجل كما تحب

 

 

لك الخيار لكن هنا لاجل التجربة ساقوم باستيراد المشروع القديم الخاص بالدرس السابق HelloGCM   ثم نقوم بالضغط على ADD FIREBASE

 

 

 

الان تظهر لديك هذه الصفحة عباره عن overview عن المشروع او تطبيق الـ Console سنقوم بالضغط على اضافة تطبيق

واختيار الـ Android وهنا سيطلب منك ان تقوم بإدخال الـ package الخاصة بالتطبيق سأقوم بإنشاء تطبيق جديد فى Android Studio واضع اسم الـ package هنا

 

ثم نضغط على زر ADD APP فى الصورة السابقة حيث ان الخيار الثانى الخاص بالبصمة SHA-1 غير اجبارى فسنتركه فارغا .

 

 

بعد الضغط على زر ADD APP تجد انه تم تحميل ملف google-services.json وهو ملف جيسون يحتوى على بيانات الكونفيجرشن الازمة كـ project id وببعض البيانات الاخرى التى تحتاجها فى تطبيق الاندرويد   وموضح به المكان الذى تضيفه فيه فى تطبيقك

 

 

إضافة ملف التهيئة للتطبيق وتهيئة الـ Gradle

 

وفى الوضع العادى فى الاندرويد تجد التطبيق بالشكل التالى

 

نقوم بالضغط على كلمة Android لتغيير هيكلة عرض المشروع لنستطيع اضافة ملف الـ json الذى حملناه قبل قليل ونختار كلمة project بدلا من كلمة Android  ونقوم بعمل drag & drop  او نقل لملف google-services.josn ليكون تحت مجلد app  كالتالى

 

يمكننا الان العودة للوضع العادى

 

عند الضغط على Continue فى موقع Firebase نجد انه هناك بعض  السطور يجب علينا اضافتها فى ملفات الجرادل

 

 

السطر الاول يجب ان يضاف فى ملف Gradle الخاص بالمشروع ككل وستجد بجانبه كلمة Project فى الأندرويد ستوديو كالتالى

 

سوف نقوم باضافة السطر classpath ‘com.google.gms:google-services:3.0.0’  ليصبح ملف الجرادل كالتالى :

 

ننتقل لملف الـ Gradle الخاص بالـ app وليس المشروع وتجده قد كتب بجانبه Module : app

 

نقوم بفتحه واضافة  السطر apply plugin: ‘com.google.gms.google-services’ فى نهاية الملف كالتالى :

 

الان تبقى شىء أخير وهو اضافة firebase نفسها حيث ان كل ما قمنا بعمله حتى الان هو اضافة ملف Json وتهيئة الـ Gradle للتعامل مع ملف الـ Json ولم نتطرق الى Firebase حيث يجب ان نقوم باضافتها مثلما نضيف المكتبات الاخرى بشكل عادى عن طريق سطر compile

وفى هذه الصفحة  تجد المكتبات المتاحة والتى يمكنك اضافتها للـ firebase والذى يهمنا هو هذه المكتبة بالـ Notifications والـ Cloud Messaging

 

سنقوم باضافتها فى ملف الـ Gradle ايضا كمكتبة عادية ليصبح كالتالى :

 

الان نقوم بعمل Sync بالضغط على Sync Now  وننتظر قليلا بينما يتم تضمين المكتبة فى المشروع

 

الان اصبح كل شىء جاهز ويمكنك الحصول على Token الخاص بالجهاز مباشرة عن طريق الكلاس FirebaseInstanceId وطباعته فى الـ Log كالتالى :

            Log.e("Token is ", FirebaseInstanceId.getInstance().getToken());

 

وستجد أن الـ Token تم طباعته كالتالى :

 

اذا لم يتم طباعته قم بمراجعة الخطوات السابقة مرة اخرى وتأكد ان كل شىء تم وضعه فى المكان الصحيح .

 

 

 

الان لديك الـ Token ويمكنك محاولة استخدامه فى ارسال الرسائل الى هذا الجهاز والاخبار الجيدة أن Firebase توفر لك واجهة سريعة لارسال الرسائل مباشرة فاذا قمت بالضغط على Notification من الشريط الجانبى الايسر ستجد أنه بامكانك ارسال رسالة مباشرة لمستخدمين التطبيق الذى انتهيت للتو من اضافة الـ firebase اليه

 

اذا ضغطت على Send Your First Message تفتح لك نافذه اخرى يمكنك من خلالها ادخال الرسالة التى تريد ارسالها وقطاع المستخدمين المستهدف هل جميع مستخدمى التطبيق ام المشتركين فى Topic معين (سنتحدث عن الـ Topics لاحقا ) او لجهاز واحد عن طريق الـ Token الخاص به وهناك خيارات متقدمة مثل تحديد Title الاشعار و كذلك اذا كنت تريد ارفاق بيانات اخرى مع الاشعار على هيئة ازواج من ال keys و values

 

وعند الضغط على Send Message سيتم ارسال الرسالة لكن ستفاجأ  بان شىء لم يحدث اى شىء امامك على الموبايل اطلاقا وهذا طبيعى فكر لماذا ؟

ببساطه لانه لا يوجد Listener يستمع للرسائل من Firebase هل تذكر أننا كنا نقوم بإنشاء كلاس GCM Listener  ليستمع لرسائل GCM ويظهر الاشعارات ؟

 

إنشاء FCMListener للإستماع لرسائل FCM

سنفعل هنا ايضا ذلك لكن هذه المرة سنستمع الى رسائل الـ FireBase وسنقوم بإنشاء Service يستمع الى الـ Firebase وكذلك سيرفس تستمع الى تحديث الـ Token كما فعلنا سابقا مع GCM  حيث كنا نقوم بعمل extends من GCMListenerService هذه المرة سنقوم بعمل extends من FirebaseMessagingService كالتالى :

 

public class MyFCMService extends FirebaseMessagingService {
    

}

 

حيث ستقوم هذه الكلاس بالاستماع الى الـ FCM واستقبال الرسائل الان سنقوم بعمل Override للـ onMessageReceived كالتالى :

public class MyFCMService extends FirebaseMessagingService {
  
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        
    }
}

وتحتوى على Parameter من النوع RemoteMessage وهو كائن يحتوى على الرسالة القادمة من FCM الى الجهاز سنقوم بجلب الرسالة منه واظهار Notification للمستخدم

public class MyFCMService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        sendNotification(remoteMessage.getNotification().getBody());

    }

    private void sendNotification(String messageBody) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("FCM Message")
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

 

الان نضيف هذه الـ Service إلى Manifest مع Intent filter الخاص بـ FCM  داخل التاج  application كالتالى :

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

 

الان قم بتشغيل التطبيق وقم بإرسال رسالة من لوحة الـ Notification وستجدها وصلت الى الجهاز وظهر النوتيفيكشن بنجاح

 

يتبقى الان معرفة كيفية ارسال النوتيفيكشن عبر الـ Server Side مثلما فعلنا فى  GCM حيث ارسلنا الـ Notification عبر php  وهو ما سنفعله فى الجزء الثانى .

 

السابق
RX Android بالعربية – الدرس الثالث
التالي
FCM بالعربية – Firebase Cloud Messaging الجزء الثانى

21 تعليق

أضف تعليقا

  1. محمد قال:

    مواكبة التغيير والتحديث شيء
    جميل .. جميل .. جميل
    رائــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــع

    بارك الله فيكم
    ننتظر الجزء الثاني.

    1. Hendiware قال:

      نورت المدونة يامحمد ^_^ إن شاء الله خلال يومين هينزل الجزء الثانى

    1. Hendiware قال:

      يارب ويوفقك ياغازى نورت التدوينة

  2. KYEDSA LOUHF قال:

    السلام عليكم

    هل هناك طريق باستخدام الــ firebase أني أرسل بوقت معين إشعار للمستخدم

    يعني مثلاً الــ 8 صباحاً يرسل له إشعار

    و أيضاً أجعل المستخدم يضع إشعار بوقت معين و مدة معينة ؟؟؟

    أم ذلك لا يتم إلا عن طريق التطبيق فقط ؟؟؟

    1. Gemi قال:

      اعتقد دي ممكن تهندلها عن طريق Timer جوا ثريد لل السيرفس و تحددلها وقت معين تشغل ال service فيه …

    2. Hendiware قال:

      يوجد خاصية جدولة الاشعارات فى firebase يمكنك استخدامها لكن اذا اردت ان يتم ذلك بشكل دورى فاعتقد انك ستحتاج لعمل ذلك يدويا من جهة السيرفر الخاص بك وكذلك من الاندرويد

      1. قصي باجس قال:

        مرحبا اخي انا عامل تطبيق اخباري على الفاير بايز
        اريد عندما اضيف خبر ينبعث اشعار لكل المستخدمين بتطبيق كيف اعملها

  3. Gemi قال:

    ربنا يوفقكم ي شباب و يجازيكم كل خير..
    كان ليا سؤال صغير .. بس كنت حابب اعرف فكرته بس .. لو حابب ابعت حاجات مع الرساله زي : URL او صوره او اي حاجه غير الرساله ..؟

    1. Hendiware قال:

      مرحبا Gemi تابعنا فى الدرس الثانى وستعرف كيف يمكن تضمين key و value مع الرسالة برمجيا ويمكن عمل هذا ايضا من firebase قم بالضغط على Advanced Options فى صفحة ارسال الرسالة وستجد ان هناك خيار للارسال.

  4. محمد زاهر عبد المولى قال:

    السلام عليكم
    شكرا على هل شرح الكافي والوافي أن شاء الله.
    لكن سؤال بالنسبة للتصميم التنبيهات ما تغير عن التصميم الأفتراضي رغم أني تتبعت الكود من خلال debug لكن ما تغير شئ حيث اني حاولت تغير الأيقونة.

    1. Hendiware قال:

      وعليكم السلام ،
      تابع الدرس الثانى يامحمد

  5. Abuhassan قال:

    بارك لك فيك أخي
    شرح وافي ورائع….
    تعجبني بصراحة مواكبة التغيير والتطوير دائماً، وتحريك الماء الراكد!!
    شكرا لك عزيزي وإلى مزيد من التألق والإبداع
    تقبل فائق تحياتي وتقديري

  6. عبدالله النجار قال:

    شرح رائع وشغل عالى ربنا يوفقك

  7. عمر محمد احمد قال:

    شرح تحفة و فوق الوصف بجد
    الله ينور عليك …. ربنا يزيدك من العلم و يبارك لك فيه
    عندي حاجتين بس
    انا مشيت خطوه بخطوه مع الشرح ده بس للأسف لما باجي ابعت لنفسي إشعار مش بيوصل مش عارف ليه .. مع ان التوكن بيجي و مطبوع قدامي
    وعامل كل حاجة بالضبط زي ماهي .. هل من اقتراح ؟!
    الحاجة الثانية : اخر خطوه ال service اللي في ملف ال manifest الاسم اللي حضرتك قولت نضيفه اللي هو .MyFirebaseMessegingService
    ده آيه ؟! احنا الكلاس اللي عملناه مش اسمه كدة فهل دي حاجة تانية ؟! لان الأندوريد مش راضي يقبله مني و عامل عليه احمر

  8. Kaaed قال:

    شرح عربي والأول بهذه الدقة نتمنى الأستمرار لتغطية هذه الخدمة بما في ذلك تحليل ومرقبة تطبيقك

  9. Kaaed قال:

    أخي الكريم لا زر الدرس التالي رغم إن الدرس موجود
    ولا يوجد أزرار التنقل بشكل عام في موقعك طبعاً اتا استخدم الآن الجوال

  10. Ahmed قال:

    بارك الله فيك ربنا يكرمك

  11. التنبيهات : المستودع التقني

  12. Kacem قال:

    أبدعتم أخي…
    سؤال عند النقر في notifiction أريد أن أفتح الرسالة القادمة في Activity مصممة للاستقبال …
    هل من شرح ترسلونني إليه أو تشرحونه أنتم وشكرا لكم

  13. هل يمكنني ارسال اشعار من جهاز الى جهاز فقط وليس الكل؟

اترك تعليقاً

This site uses Akismet to reduce spam. Learn how your comment data is processed.