ارسال الاشعارات في تطبيقات اندرويد برمجياً باستخدام GCM

بسم الله الرحمن الرحيم

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

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

هذا الموضوع اعتبره كبير وضخم, فئة سوف يدخلون هذا الموضوع وينسخون الأكواد ولصقها, وفئة حقاً سوف تستفيد من خلال مراجعة الموضوع أكثر من مرة والتعمق بالموضوع أكثر بالقراءة عنه.

لتعرف ما الذي نتكلم عنه راجع : مقدمة لاستخدام GCM ببرمجة تطبيقات الاندرويد + تجهيزها
ويجب قرائته لمعرفة كيفية تجهيز مشروع والحصول على مفتاح API.

** من المزايا التي يدعمها GCM هي : إنك ترسل اشعار من الخادم إلى سيرفر GCM إلى التطبيق, وفي حال لا يوجد اتصال لدى المستخدم, تبقى الرسالة في قائمة الانتظار .. حال وجود انترنت في جهاز المستخدم تصله هذه الرسالة.

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

معاينة سريعة من اليوتيوب لدرس اليوم :

ما سوف نتعلمه في هذا الدرس :

* برمجة تطبيق اندرويد ويحتوي على نموذج تسجيل بواسطة ايميل المستخدم فقط, لكي يحصل جهازه على id خاص فيه.
* تطبيق جداً بسيط, لمعرفة او كيفية ارسال اشعارات لجميع الاجهزة المسجلة اشعاراً او رسالة نصية قصيرة.
* بعد حصول المستخدم على الاشعار يضغط عليه وينتقل الى اكتفتي داخل التطبيق لرؤية هذه الرسالة.

تطبيق اليوم يحتوي على قسمين مهمين :

– تطبيق ويب Server Application / مبرمج بلغة php لارسال رسالة للمستخدمين.

– تطبيق اندرويد Client Application / لاستقبال هذه الرسالة.

# تجهيز تطبيق الويب : (يجب ان يكون لديك سيرفر لقراءة ملفات php )

سوف اعمل على السيرفر الداخلي الاباتشي .. appserv

قم بإنشاء ملف جديد بصيغة php واسمه gcm.php داخل مجلد اسمه gcm ,داخل ملفات السيرفر وضع فيه الكود التالي : – لا تغير اسم الملف والمجلد إلا اذا كانت لديك الخبرة بتعديل الكود –

ملف الويب هذا هو مبرمج بلغة php لذلك من لديه خبرة يستطيع برمجة نموذج كما يريد, وبشكل يخدمه.

# تجهيز تطبيق الاندرويد :

– قم بإنشاء مشروع جديد, سبق تم شرح كيفية إنشاء مشروع على اندرويد ستوديو. اضغط هنا

– الاستعانة بمكتبة الدعم Android Asynchronous Http Client وهي مكتبة مشهورة ولها خصائص عديدة ويستخدم هذه المكتبة اشهر التطبيقات منها, Instagram,Pinterest,Heyzap,Pose وغيرها .. للتحميل اضغط هنا.
بعد التحميل ملف jar توضع في مجلد libs ضمن مجلدات التطبيق app.

– إعداد خدمات جوجل في مشروعك Google Play Services, في البداية تأكد من وجودها من خلال الذهاب إلى حزمة الـ SDK , في مجلد Extras > Google Play services تأكد من تحميلها .. ثم الذهاب إلى ملف build.gradle داخل ملفات تطبيقك من برنامج الاندرويد ستوديو وقم بفتحه وإضافة السطر التالي :

أو تستطيع استخدام من خدمات جوجل فقط خدمة التراسل السحابية GCM :

يضاف السطر ضمن dependencies, لا تنسى بعد الاضافة الضغط على مزامنة Sync Project with Gradle Files.

# برمجة وتصميم التطبيق – اندرويد -:

في البداية أصدقائي لكي اسهل عليكم, يوجد لدينا في المشروع التالي : ( قم بإنشائه بنفسك )

Two Package :
* Main Package: com.andrody.testandrody // أجعل فيها الاكتفتي المستخدمة لتطبيقك
* gcm Package: com.andrody.testgcm // سوف أضع فيها فقط الاكتفتي الداعمة لخدمة التراسل السحابية gcm

بحب وضح انو انا عملتها حزمتين, مشان ما بصير عندك اشكال وقت تبني مشروع ضخم وتضيفلو هي الميزة, لتكون منفصلة باكتفتي لحالها .. وإذا كان المشروع كبير تستطيع نقلها كلها في حزمة جانبية, واستخدامها بالحزمة الرئيسية.

Two class inside Main Package :
* Main_Activity // الاكتفتي الرئيسية التي تعمل ببداية تشغيل التطبيق, وفيها يتم تسجيل ايميل المستخدم وتعمل فقط مرة واحدة لتسجيل الايميل .. من بعدها سوف تظهر اكتفتي هوم هي الرئيسية بشكل دائم لأن الايميل يتسجل لمرة واحدة.
* Home_Activity // الاكتفتي الرئيسية من بعد تسجيل ايميل المستخدم, وفيها سوف يتم اظهار الايميل المسجل للمستخدم, وهي الاكتفتي التي يتم فتحها عن الضغط على الاشعار لإظهار الرسالة التي تصل من السيرفر داخلها.

Two class & One interface inside gcm Package :
* Gcm_Application_Constants // انترفيس يتصل بمشروعك على جوجل لتسجيل الاي دي الخاص بالمستخدم وجلب الرسالة من السيرفر.
* Gcm_Broadcast_Receiver // بإمكانك اعتبار هذا الاكتفتي البسيط انه جهاز استقبال للاشارة في حال وجود رسالة من السيرفر يلتقطها ويمررها لـ انتنت سيرفس من اجل معالجتها وارسالها للاكتفتي الهوم لعرضها
* Gcm_Notification_Intent_Service // يتعامل مع الرسالة التي تاتي من السيرفر ويرسل الاشعار وبعد الضغط عليه ياخذك للهوم اكتفتي لعرض هذه الرسالة

Two Layout :
* main.xml // context for “.Main_Activity”
* home.xml // context for “.Home_Activity”

حسناً أصدقائي بينا ما الذي نقوم بإنشائه, و الآن سوف أدرج لكم الأكواد .. وهي طويلة بعض الشيء لذلك سوف أجعل فيها سطور التعليقات لتوضيح بعض الأمور. ” سطور التعليقات كثيرة بالعربية والانجليزية ” الانجليزية تم اقتباسها من نفس موقع الرسمي مطوريين اندرويد.

# Layout :

main.xml

home.xml

# Activity :

رسائل التوست كثيرة وذلك لتخبرك كمبرمج ماذا يحدث الان .. في حال بناء التطبيق تستطيع الاستغناء عنها, أغلب الأكواد واضحة, عن طريق اندرويد ستوديو تستطيع متابعة كل متغير ومن أي أتى, ومنها تعرف ما وظيفته.

Main_Activity.java

Home_Activity.java

Gcm_Application_Constants.java

Gcm_Broadcast_Receiver.java

Gcm_Notification_Intent_Service.java

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

# تجهيز ملف AndroidManifest.xml :

الصلاحيات المطلوبة والمستخدمة في هذا الدرس : (المقصود فيها صلاحيات التطبيق في جهاز المستخدم)

– android.permission.INTERNET
اذن للتطبيق بالاتصال بالانترنت من أجل تسجيل رقم الاي دي للجهاز في السيرفر.

– android.permission.GET_ACCOUNTS -غير مطلوب , للاحتياط-
اذن للوصول الى حساب الـ gmail, حيث يشترط على الاجهزة القديمة ان يكون يجد بالجهاز حساب gmail ولكن بالاجهزة الحديثة لا مشكلة.

– android.permission.WAKE_LOCK
اذن بالاستيقاظ في حال كان جهازك في حال سبات ” اطفاء الشاشة ” لتلقي الرسالة.

– permission.C2D_MESSAGE + اسم الحزمة
اذن لمنع التطبيقات الاخرى من استلام الرسائل الموجهة لهذا التطبيق, والفرق بين : uses-permission & permission واحدة للاذن من المستخدم وصلاحية للتطبيق والاخرى استخدام هذا الاذن.

– com.google.android.c2dm.permission.RECEIVE
اذن لتمكين التطبيق من استقبال وتسجيل الرسائل.

– android.permission.ACCESS_NETWORK_STATE
اذن مشابه تقريباً لصلاحية دخول التطبيق للانترنت permission.INTERNET ولكن أحداها للاتصال بالانترنت والاخرى لمعرفة حالة الاتصال.

– android.permission.VIBRATE
اذن لاستخدام التطبيق لخاصية الاهتزاز.

– com.google.android.gms.version
بإمكانك اعتباره ضمان لتشغيل خدمات جوجل بشكل سليم.

– com.google.android.c2dm.permission.SEND
صعب شرحها نوعاً ما , ولكن هي أسفل الاكتفتي المشتقة من WakefulBroadcastReceiver , كإننا نخبره فقط سيرفر GCM هو من يستقبل الاشعارات لهذا الاكتفتي ” التطبيق “.

– تسجيل اكتفتي service
وهي الاكتفتي المشتقة من IntentService, التي تمر بالاكتفتي المشتقة من WakefulBroadcastReceiver لكي تتعامل مع الرسالة التي تأتي من السيرفر GCM , تستطيع التعامل مع الرسالة في BroadcastReceiver ولكن الاغلب يستخدم IntentService.

** بالنسبة لتوضيح بعض الخصائص في الاعلى, أقول الاكتفتي والمشتقة .. لأن اسم الاكتفتي يختلف على حسب مزاج المبرمج وما يقوم بتسمية هذه الاكتفتي وأقصد بمشتقة “extends”.

AndroidManifest.xml

التعديلات المطلوبة منك :
داخل gcm.php لوضع رقم API Key الذي أنشئناه في الدرس السابق. ( وصلة الموضوع في الاعلى).
+ في اكتفتي Gcm_Application_Constants تقوم بوضع رقم مشروعك على جوجل + مسار ملف gcm.php.

إضافة للمشروع : وهي ( لا يستطيع المستخدم التسجيل بغير الاحرف الانجليزية ووضع بريد الكتروني صحيح )
من دون هذه الاضافة يستطيع كتابة اي كلام عربي او احرف ويتم تسجيله المهم ان لا يكون الحقل فارغ.

نقوم بإضافة كلاس جديد بإسم : Utility.java ونقوم بوضع داخل الكود التالي :

ونذهب لاستخدام هذا الكلاس في خانة الحقل النصي لاضافة الايميل .. في داخل اكتفتي Main_Activity, ابحث عن السطر :

وقم باستبداله إلى :

*** انتهى ***

لمعرفة المزيد وبشرح أدق .. راجع التالي >

*https://developer.android.com/google/gcm/client.html
*http://developer.android.com/reference/com/google/android/gms/gcm/GoogleCloudMessaging.html
*https://developer.android.com/google/gcm/gcm.html

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

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

عن عبدالقادر عليوي

مواليد 1996 , سوري الجنسية, طالب علم, لدي شغوف كبير في تعلم كل ما يتعلق بالانترنت من تطوير وحماية, أحب القراءة كثيراً .. هدفي نشر العلم بشتى أنواعه ومجالاته, متابع من الدرجة الأولى لـ الدكتور ابراهيم الفقي و الشيخ أحمد ديدات – رحمهم الله -.

شاهد أيضاً

تحميل ملف من السيرفر لجهازك الأندرويد برمجياً

بسم الله الرحمن الرحيم في هذه التدوينة إن شاء الله سوف نتعلم كيفية تحميل ملف …

15 تعليق

  1. شكرا إلك ♥

  2. انا عندى مشكلة ..الكود بيتم تنفيذة بشكل كويس
    ولكن لما احط اللينك بتاع السيرفر بتاعى
    وال project _ID

    بيرجعلى انه تم تسجيله

    لكن لما بفتح مش بلاقيه سجل ؟؟

  3. حضرتك انا عملت كل الخطوات بس ظهرلى الخطأ ده

    Error:Execution failed for task ‘:app:processDebugManifest’.
    > Manifest merger failed : uses-sdk:minSdkVersion 8 cannot be smaller than version 9 declared in library C:\testandrody\app\build\intermediates\exploded-aar\com.google.android.gms\play-services-gcm\7.3.0\AndroidManifest.xml
    Suggestion: use tools:overrideLibrary=”com.google.android.gms.gcm” to force usage

    مش عارف ال http://schemas.android.com/apk/res/android مش راضيه تتظبط

    • كم رقم الاصدار الذي تعمل عليه ؟! .. وما هو اقل اصدار لحزمة sdk ?! ..

      و بالنسبة لـ تفعيل خدمات جوجل بلاي .. الان احدث اصدار 7.5.0

      أين مكانها الذي لا تضبط فيه !؟ .. ممكن صورة من الخطأ او الكود الذي عليه الخطأ .. لافهمك بشكل اوضح ~

      • الاصدار الذى اعمل عليه من اندرويد استوديو 1.2,1,1
        التطبيق لما انشأته كان على بيئة froyo
        جوجل بلاي منزلها من ال sdk ومتحدثه
        بس سؤالى هل فيه اي حاجه اعملها تانى غير انى احدثها من ال sdk
        ولا لازم مثلا اعملها استيراد وكده

        انا مبتدى ولسه مش عارف قوى فى المواضيع دى

    • افتح الحزمة SDK و حمل المطلوب منك فيها .. من خلال مراجعت للدرس التالي :
      http://andrody.com/2015/02/before_programming_begins_android_studio/

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

  4. نواف الرشيدي

    شكرا جزيلا

  5. الله ** ** ** تعبك
    يعني مفكر نفسك فهمان وبتمنع النسخ
    يعني انت بتعمل زي الي بيقول عندي ميا بس لاتشربوا
    روح شوف موقع عبدالله عيد كل شيء متاح مجانا ً
    شوف موقع بشير شلاح كل الاكواد مجاناً

    .
    الله وكيلك كرهتني موقعك وكرهتني ادخل عليه
    ولا زر ولا ماوس بتشتغل

    • اهلا وسهلا بك .. تشرفنا 🙂

      بالحقيقة الكلام البذيء عادة لا ارد عليه ..

      لكنك لو كنت فعلاً مهتم لرأيت ان النسخ مفتوح للاكواد .. ولكن لم تجرب 🙂 وحصل ذلك مع الكثير ..

      عموماً السيد المحترم تستطيع الضغط على اعلى الكود يوجد فتح الكود في نافذة صغيرة لنسخه ..

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

  6. مرحبا طبقت المكتوب تمام و اشتغل التطبيق و طلب مني في الأندرويد اسجل ايمل سجلت و حكالي انو سجل بس ملف النوت باد GSMRegId ما اجا في مجلد ال gcm الي ع السيرفر xampp و بس اكتب رسالة في الموقع و اعمل ارسال بضهري السطر التالي في مكان حالة الرسالة !!!!

    {“multicast_id”:5731427341574576584,”success”:0,”failure”:1,”canonical_ids”:0,”results”:[{“error”:”InvalidRegistration”}]}

    • اهلا .. لما تدخل السيرفر المحلي xampp من جوالك بيفتح بالمتصفح بشكل طبيعي ؟! ..

      واذا لم يعمل معك, جرب تشغيله على اي استضافة مجانية ..

  7. السلام عليكم
    أنا عندي تطبيق باصات
    المطلوب انه كيف ارسل اشعار للطالب أو الطالبة أنه الباص قرب من البيت أو هو وصل بالقعل ؟
    هل هذا الكود ينفعني ؟

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

+ 39 = 48