الإشعارات الفورية
اطلب الإذن، واشترك في الإشعارات الفورية باستخدام Push API، واستقبل الرسائل في Service Worker، واعرض الإشعارات باستخدام showNotification
الإشعارات الفورية درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
أهمية الإشعارات الفورية
تعيد الإشعارات الفورية جذب المستخدمين عندما لا يكون التطبيق مفتوحًا، مثل تنبيهات الرسائل وتحديثات الأخبار وتذكيرات عربات التسوق المتروكة. ويشغّلها Service Worker، لذا تعمل حتى عند إغلاق الصفحة.
Push API وNotifications API
تعمل واجهتا API للمتصفح معًا. تستقبل Push API الرسائل من خادم عبر اشتراك push، بينما تعرض Notifications API الرسالة للمستخدم.
طلب الإذن
اطلبوا إذن المستخدم قبل الاشتراك، ولا تفعلوا ذلك إلا استجابةً لإجراء واضح من المستخدم (مثل النقر على زر)، وليس عند تحميل الصفحة.
async function enableNotifications() {
const permission = await Notification.requestPermission();
if (permission !== 'granted') {
alert('Notifications denied');
return;
}
// proceed to subscribe...
}اشتراك Push
اشتركوا من خلال تسجيل Service Worker النشط. ويصادق المفتاح العام لـ VAPID الخاص بالخادم على الاشتراك.
async function subscribeToPush() {
const reg = await navigator.serviceWorker.ready;
const sub = await reg.pushManager.subscribe({
userVisibleOnly: true, // required: every push must show a notification
applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY)
});
// Send sub to your server:
await fetch('/api/save-subscription', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(sub)
});
}مفاتيح VAPID
تعرّف مفاتيح VAPID (Voluntary Application Server Identification) خادمكم لدى خدمات push مثل FCM وMozilla وغيرها. أنشئوا المفاتيح مرة واحدة، وخزّنوا المفتاح الخاص على خادمكم.
# Generate VAPID keys with web-push CLI:
npx web-push generate-vapid-keys
# Output:
# Public Key: BJ...
# Private Key: ka...Push من جهة الخادم
استخدموا مكتبة npm المسماة web-push لإرسال push إلى اشتراك مخزّن.
import webpush from 'web-push';
webpush.setVapidDetails(
'mailto:you@example.com',
process.env.VAPID_PUBLIC,
process.env.VAPID_PRIVATE
);
await webpush.sendNotification(savedSubscription, JSON.stringify({
title: 'New message',
body: 'Alice sent you a message',
url: '/inbox/123'
}));معالجة Push في Service Worker
يستقبل SW حدث push ويعرض إشعارًا.
// sw.js
self.addEventListener('push', (event) => {
const data = event.data ? event.data.json() : {};
event.waitUntil(
self.registration.showNotification(data.title || 'Notification', {
body: data.body,
icon: '/icons/192.png',
badge: '/icons/badge.png',
data: { url: data.url }
})
);
});معالج النقر على الإشعار
افتحوا التطبيق أو أعيدوا التركيز عليه عندما ينقر المستخدم على إشعار.
self.addEventListener('notificationclick', (event) => {
event.notification.close();
const url = event.notification.data.url || '/';
event.waitUntil(
clients.matchAll({ type: 'window' }).then(clientList => {
for (const client of clientList) {
if (client.url.endsWith(url) && 'focus' in client) return client.focus();
}
return clients.openWindow(url);
})
);
});خيارات الإشعارات
خصّصوا: icon، وbadge (أيقونة منطقة الإشعارات الصغيرة)، وimage (الصورة الكبيرة)، وactions (الأزرار)، وtag (استبدال الإشعارات الأقدم التي تحمل الوسم نفسه)، وrequireInteraction (يبقى حتى يتم تجاهله)، وsilent.
self.registration.showNotification('Message', {
body: 'Alice sent you a photo',
icon: '/icons/192.png',
image: '/images/alice-photo.jpg',
actions: [
{ action: 'view', title: 'View' },
{ action: 'reply', title: 'Reply' }
],
tag: 'message-from-alice', // replaces earlier 'message-from-alice'
requireInteraction: false
});إلغاء الاشتراك
أتيحوا للمستخدمين إلغاء الاشتراك، وذلك باستدعاء pushSubscription.unsubscribe() وإزالة الاشتراك من خادمكم.
async function disablePush() {
const reg = await navigator.serviceWorker.ready;
const sub = await reg.pushManager.getSubscription();
if (sub) {
await sub.unsubscribe();
await fetch('/api/delete-subscription', {
method: 'POST',
body: JSON.stringify({ endpoint: sub.endpoint })
});
}
}دعم iOS
يدعم iOS 16.4 والإصدارات الأحدث Web Push، ولكن فقط لتطبيقات PWA المثبّتة على الشاشة الرئيسية. أما الأجهزة التي تسبق iOS 16.4 وSafari على الويب في iPhone فلا تدعم Web Push إطلاقًا.
أفضل الممارسات
1) اطلبوا الإذن فقط بعد إجراء واضح من المستخدم. 2) أرسلوا إشعارات مفيدة وغير متكررة. 3) اعرضوا إشعارًا دائمًا عند وقوع حدث push، إذ قد تلغي المتصفحات الإذن إذا لم تفعلوا ذلك. 4) وفّروا طريقة سهلة لإلغاء الاشتراك. 5) اختبروا باستخدام خدمات push الثلاث كلها (FCM وMozilla وWindowsPush).
الأخطاء الشائعة
يفشل push بصمت إذا كان userVisibleOnly يساوي false (يتطلب Chrome أن تكون قيمته true)، أو كانت مفاتيح VAPID غير متطابقة، أو انتهت صلاحية الاشتراك (أعيدوا الاشتراك)، أو لم يُعرض أي إشعار عند وقوع حدث push (فيُلغي المتصفح الاشتراك).
تحقق سريع
لماذا يجب أن تؤدي كل رسالة push إلى إشعار مرئي، مع userVisibleOnly: true؟
مراجعة: الإشعارات الفورية
اطلبوا الإذن من خلال إجراء من المستخدم فقط. اشتركوا باستخدام reg.pushManager.subscribe مع المفتاح العام لـ VAPID. يستخدم الخادم مكتبة web-push للإرسال. يستدعي حدث push في SW الدالة showNotification. يفتح notificationclick التطبيق أو يعيد التركيز عليه. خصّصوا icon وbadge وimage وactions وtag. اعرضوا إشعارًا دائمًا (القيمة userVisibleOnly: true مطلوبة). يدعم iOS 16.4 والإصدارات الأحدث ذلك، ولكن للتطبيقات المثبّتة كـ PWA فقط.
الأسئلة الشائعة
هل درس «الإشعارات الفورية» مجاني؟
نعم — نص درس «الإشعارات الفورية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «الإشعارات الفورية»؟
اطلب الإذن، واشترك في الإشعارات الفورية باستخدام Push API، واستقبل الرسائل في Service Worker، واعرض الإشعارات باستخدام showNotification تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «الإشعارات الفورية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بيان تطبيق الويب
- تسجيل Service Worker ودورة حياته
- استراتيجيات التخزين المؤقت دون اتصال: CacheFirst وNetworkFirst
- الإشعارات الفورية