يوضّح لك هذا الدرس التطبيقي حول الترميز خطوة بخطوة كيفية إنشاء خادم إشعارات فورية. بنهاية هذا الدليل التعليمي، سيكون لديك خادم:
- تتبُّع اشتراكات الإشعارات الفورية (أي أنّ الخادم ينشئ سجلّ قاعدة بيانات جديدًا عندما يوافق العميل على الإشعارات الفورية، ويحذف سجلّ قاعدة بيانات حاليًا عندما يوقف العميل هذه الإشعارات)
- إرسال إشعار فوري إلى عميل واحد
- إرسال إشعار فوري إلى جميع العملاء المشتركين
تركّز ورشة رموز البرمجة هذه على مساعدتك في التعلّم من خلال الممارسة، ولا تتناول كثيرًا من المفاهيم. اطّلِع على المقالة كيف تعمل الإشعارات الفورية؟ للتعرّف على مفاهيم الإشعارات الفورية.
سبق أن اكتمل رمز العميل في هذا الدليل التعليمي. ستتم فقط تنفيذ الخادم في هذا الدليل التعليمي. للتعرّف على كيفية تنفيذ ملف برمجي لإرسال الإشعارات الفورية، اطّلِع على الدرس التطبيقي حول الترميز: إنشاء ملف برمجي لإرسال الإشعارات الفورية.
اطّلِع على push-notifications-server-codelab-complete (source) للاطّلاع على الرمز الكامل.
توافُق المتصفح
من المعروف أنّ ورشة رموز البرامج هذه تعمل مع مجموعات أنظمة التشغيل والمتصفّحات التالية:
- نظام التشغيل Windows: Chrome وEdge
- macOS: Chrome وFirefox
- Android: Chrome وFirefox
من المعروف أنّ ورشة رموز البرامج هذه لا تعمل مع أنظمة التشغيل التالية (أو مجموعات أنظمة التشغيل والمتصفّحات):
- macOS: Brave وEdge وSafari
- iOS
حزمة التطبيق
- تم إنشاء الخادم استنادًا إلى Express.js.
- تعالج مكتبة web-push في Node.js جميع منطق الإشعارات الفورية.
- يتم كتابة بيانات الاشتراك في ملف JSON باستخدام lowdb.
لست بحاجة إلى استخدام أيّ من هذه التقنيات لتطبيق الإشعارات الفورية. اخترنا هذه التقنيات لأنّها توفّر تجربة موثوقة في Codelab.
ضبط إعدادات الجهاز
الحصول على نسخة قابلة للتعديل من الرمز
يُعرف محرِّر الرموز البرمجية الذي يظهر على يسار هذه التعليمات باسم واجهة مستخدم Glitch خلال هذا الدليل التعليمي.
- انقر على Remix to Edit (إنشاء ريمكس لتعديل المحتوى) ليصبح المشروع قابلاً للتعديل.
إعداد المصادقة
قبل أن تتمكّن من تفعيل الإشعارات الفورية، عليك إعداد الخادم والعميل باستخدام مفاتيح المصادقة. اطّلِع على توقيع طلبات بروتوكول إشعارات الويب لمعرفة السبب.
- افتح محطة Glitch الطرفية من خلال النقر على الأدوات ثم النقر على المحطة الطرفية.
- في الوحدة الطرفية، شغِّل
npx web-push generate-vapid-keys
. انسخ قيم المفتاح الخاص والمفتاح العام. - افتح
.env
وعدِّلVAPID_PUBLIC_KEY
وVAPID_PRIVATE_KEY
. اضبطVAPID_SUBJECT
علىmailto:test@test.test
. يجب وضع كل هذه القيم بين علامتَي اقتباس مزدوجتَين. بعد إجراء التعديلات، من المفترض أن يظهر ملف.env
على النحو التالي:
VAPID_PUBLIC_KEY="BKiwTvD9HA…"
VAPID_PRIVATE_KEY="4mXG9jBUaU…"
VAPID_SUBJECT="mailto:test@test.test"
- أغلِق وحدة طرفية Glitch.
- فتح "
public/index.js
" - استبدِل
VAPID_PUBLIC_KEY_VALUE_HERE
بقيمة مفتاحك العام.
إدارة الاشتراكات
يعالج العميل معظم عملية الاشتراك. إنّ الإجراءان الرئيسيان اللذان يجب أن ينفّذهما الخادم هما حفظ الاشتراكات الجديدة في الإشعارات الفورية وحذف الاشتراكات القديمة. تتيح لك هذه الاشتراكات إرسال الرسائل إلى العملاء في المستقبل. اطّلِع على مقالة اشتراك العميل في الإشعارات الفورية لمزيد من المعلومات عن عملية الاشتراك.
حفظ معلومات الاشتراك الجديدة
- لمعاينة الموقع الإلكتروني، اضغط على عرض التطبيق. ثم اضغط على ملء الشاشة .
- انقر على تسجيل عامل الخدمة في علامة تبويب التطبيق. في مربّع الحالة، من المفترض أن تظهر لك رسالة مشابهة لما يلي:
Service worker registered. Scope: https://desert-cactus-sunset.glitch.me/
- في علامة التبويب "التطبيق"، انقر على الاشتراك في الإشعارات الفورية. من المحتمل أن يسألك المتصفّح أو نظام التشغيل إذا كنت تريد السماح للموقع الإلكتروني بإرسال إشعارات فورية إليك. انقر على سماح (أو أي عبارة تعادلها يستخدمها المتصفّح أو نظام التشغيل). في مربّع الحالة، من المفترض أن تظهر لك رسالة مشابهة لهذه:
Service worker subscribed to push. Endpoint: https://fcm.googleapis.com/fcm/send/…
- ارجع إلى الرمز البرمجي بالنقر على عرض المصدر في واجهة مستخدم Glitch.
- افتح سجلّات Glitch بالنقر على الأدوات ثم على السجلّات.
من المفترض أن يظهر لك الرمز
/add-subscription
متبوعًا ببعض البيانات./add-subscription
هو عنوان URL الذي يرسل إليه العميل طلب POST عندما يريد الاشتراك في الإشعارات الفورية. البيانات التالية هي معلومات اشتراك العميل التي يجب حفظها. - فتح "
server.js
" - عدِّل منطق معالِج مسار
/add-subscription
باستخدام الرمز البرمجي التالي:
app.post('/add-subscription', (request, response) => {
console.log('/add-subscription');
console.log(request.body);
console.log(`Subscribing ${request.body.endpoint}`);
db.get('subscriptions')
.push(request.body)
.write();
response.sendStatus(200);
});
حذف معلومات الاشتراك القديمة
- ارجع إلى علامة التبويب "التطبيق".
- انقر على إلغاء الاشتراك في الإشعارات الفورية.
- اطّلِع على سجلّات الأخطاء مرة أخرى. من المفترض أن يظهر لك الرمز
/remove-subscription
يليه معلومات اشتراك العميل. - عدِّل منطق معالِج مسار
/remove-subscription
باستخدام الرمز البرمجي التالي:
app.post('/remove-subscription', (request, response) => {
console.log('/remove-subscription');
console.log(request.body);
console.log(`Unsubscribing ${request.body.endpoint}`);
db.get('subscriptions')
.remove({endpoint: request.body.endpoint})
.write();
response.sendStatus(200);
});
إرسال إشعارات
كما هو موضّح في مقالة إرسال رسالة فورية، لا يرسل الخادم الرسائل الفورية مباشرةً إلى العملاء. بدلاً من ذلك، تعتمد على خدمة دفع لإرسال الإشعارات. يبدأ الخادم في الأساس عملية إرسال الرسائل إلى العملاء من خلال تقديم طلبات لخدمة الويب (طلبات بروتوكول الدفع على الويب) إلى خدمة ويب (خدمة الدفع) يملكها موفّر المتصفّح الذي يستخدمه المستخدم.
- عدِّل منطق معالِج مسار
/notify-me
باستخدام الرمز البرمجي التالي:
app.post('/notify-me', (request, response) => {
console.log('/notify-me');
console.log(request.body);
console.log(`Notifying ${request.body.endpoint}`);
const subscription =
db.get('subscriptions').find({endpoint: request.body.endpoint}).value();
sendNotifications([subscription]);
response.sendStatus(200);
});
- عدِّل الدالة
sendNotifications()
باستخدام الرمز البرمجي التالي:
function sendNotifications(subscriptions) {
// TODO
// Create the notification content.
const notification = JSON.stringify({
title: "Hello, Notifications!",
options: {
body: `ID: ${Math.floor(Math.random() * 100)}`
}
});
// Customize how the push service should attempt to deliver the push message.
// And provide authentication information.
const options = {
TTL: 10000,
vapidDetails: vapidDetails
};
// Send a push message to each client specified in the subscriptions array.
subscriptions.forEach(subscription => {
const endpoint = subscription.endpoint;
const id = endpoint.substr((endpoint.length - 8), endpoint.length);
webpush.sendNotification(subscription, notification, options)
.then(result => {
console.log(`Endpoint ID: ${id}`);
console.log(`Result: ${result.statusCode}`);
})
.catch(error => {
console.log(`Endpoint ID: ${id}`);
console.log(`Error: ${error} `);
});
});
}
- عدِّل منطق معالِج مسار
/notify-all
باستخدام الرمز البرمجي التالي:
app.post('/notify-all', (request, response) => {
console.log('/notify-all');
response.sendStatus(200);
console.log('Notifying all subscribers');
const subscriptions =
db.get('subscriptions').cloneDeep().value();
if (subscriptions.length > 0) {
sendNotifications(subscriptions);
response.sendStatus(200);
} else {
response.sendStatus(409);
}
});
- ارجع إلى علامة التبويب "التطبيق".
- انقر على إلغاء الاشتراك في الإشعارات الفورية ثم انقر على الاشتراك في الإشعارات الفورية مرة أخرى. لا يلزم إجراء ذلك إلا لأنّ Glitch يعيد تشغيل المشروع في كل مرة تعدّل فيها الرمز البرمجي ويتم ضبط المشروع لحذف قاعدة البيانات عند بدء التشغيل.
- انقر على إشعاري. من المفترض أن يصلك إشعار فوري. يجب أن يكون العنوان
Hello, Notifications!
وأن يكون النصID: <ID>
حيث يكون<ID>
رقمًا عشوائيًا. - افتح تطبيقك على متصفّحات أو أجهزة أخرى وحاول اشتراكها في الإشعارات الفورية، ثم انقر على الزر إرسال إشعار إلى الجميع. من المفترض أن يصلك الإشعار نفسه على جميع أجهزتك المشترِكة (أي أنّ رقم التعريف في نص الإشعار الفوري يجب أن يكون هو نفسه).
الخطوات التالية
- اطّلِع على نظرة عامة على الإشعارات الفورية لفهم آلية عمل الإشعارات الفورية بشكل أعمق.
- اطّلِع على Codelab: إنشاء برنامج عميل للإشعارات الفورية لمعرفة كيفية إنشاء برنامج عميل يطلب إذن الإشعارات ويشترك الجهاز لتلقّي الإشعارات الفورية ويستخدم عامل خدمة لتلقّي الرسائل الفورية وعرض الرسائل كإشعارات.