الحلقة 10: إشعارات الدفع من جانب الخادم (Server-Side Push Notifications)
حتى الآن، كانت جميع الإشعارات التي قمنا بإنشائها "محلية" — أي يتم إطلاقها من التطبيق نفسه على نفس الجهاز. ولكن ماذا لو كنت تريد تنبيه جميع مستخدميك بشأن عرض ترويجي؟ أو إخطار مستخدم بأنه تلقى رسالة من صديق؟ يتطلب هذا إشعارات الدفع (Push Notifications)، والتي يتم إطلاقها بواسطة خادم (Backend).
سنحترف في هذا الدرس:
- رمز دفع إكسبو (Expo Push Token): فهم "العنوان" الفريد لكل جهاز.
- الحصول على الرمز: استرداد الرمز برمجياً من الجهاز.
- أداة دفع إكسبو (Expo Push Tool): اختبار التسليم من جانب الخادم دون كتابة سطر واحد من كود الـ Backend.
- نظرة عامة على الهندسة المعمارية: كيف يتواصل خادمك مع خدمة إشعارات إكسبو.
1. ما هو رمز الدفع (Push Token)؟
فكر في رمز الدفع (Push Token) كأنه "رقم هاتف" فريد وآمن لنسخة معينة من تطبيقك على جهاز معين. لإرسال رسالة، يحتاج خادمك إلى هذا الرمز.
الجميل في إكسبو هو أنه يوفر تنسيقاً موحداً للرموز. لست بحاجة للتعامل مع خدمة Firebase من Google (FCM) وخدمة Apple Push Notification (APNs) بشكل منفصل؛ إذ تعمل خدمة إكسبو كـ "جسر" لكلتيهما.
2. التسجيل البرمجي للرمز
للحصول على الرمز، نستخدم الدالة getExpoPushTokenAsync. يتطلب ذلك معرف مشروع (projectId)، والذي يمكنك العثور عليه في ملف app.json أو في لوحة تحكم إكسبو الخاصة بك.
index.tstypescriptimport * as Notifications from 'expo-notifications'; import Constants from 'expo-constants'; const registerForPushNotifications = async () => { // 1. الحصول على معرف المشروع من الإعدادات const projectId = Constants.expoConfig?.extra?.eas?.projectId; if (!projectId) { console.error("معرف المشروع غير موجود. تأكد من تكوين EAS."); return; } // 2. طلب الرمز const tokenData = await Notifications.getExpoPushTokenAsync({ projectId: projectId, }); const token = tokenData.data; console.log("رمز دفع إكسبو الخاص بك:", token); // 3. (خطوة الإنتاج) أرسل هذا الرمز إلى خادمك (Backend) لحفظه // await myApi.saveUserToken(token); return token; };
3. الاختبار باستخدام أداة دفع إكسبو
قبل بناء نظام خلفي (Backend) معقد، يجب عليك التحقق من أن رمزك يعمل باستخدام أداة إكسبو الرسمية للدفع (Expo Push Tool).
- انتقل إلى expo.dev/notifications.
- قم بلصق رمز جهازك.
- أدخل العنوان (Title) والرسالة (Message).
- أضف بيانات ديناميكية (مثلاً:
{ "promoCode": "WELCOME2024" }). - انقر على إرسال الإشعار (Send Notification).
إذا كان جهازك مسجلاً ومتصلاً بالإنترنت، فستتلقى الإشعار على الفور.
4. وجهة نظر الخادم (Backend)
في التطبيقات الواقعية، سيقوم خادمك (Node.js، Python، Ruby، إلخ) بإرسال طلب HTTP من نوع POST إلى الرابط https://exp.host/--/api/v2/push/send.
يتكون جسم الطلب (Request Body) من كائن JSON يحتوي على:
to: رمز دفع إكسبو.titleوbody: محتوى الرسالة.data: البيانات الوصفية المخصصة الخاصة بك.priorityوsoundوchannelId: إعدادات السلوك التي تعلمناها في الدروس السابقة.
نصيحة أمنية تقنية
لا تقم أبداً بكشف رمز دفع إكسبو الخاص بك علناً. تعامل معه كأنه كلمة مرور أو رمز جلسة (Session Token). إذا حصل شخص ضار على رمز المستخدم، فيمكنه إرسال إشعارات غير مصرح بها إلى جهاز ذلك المستخدم.
التحدي الخاص بك
استخرج رمز دفع جهازك باستخدام دالة التسجيل. استخدم أداة دفع إكسبو لإرسال إشعار يتضمن فئة (categoryIdentifier) وقناة (channelId) قمت بإنشائهما في الدروس السابقة. تحقق من تشغيل الأزرار والأصوات الصحيحة!