בשיעור הזה תלמדו, שלב אחר שלב, איך לבנות שרת של הודעות פוש. בסוף ה-codelab יהיה לכם שרת ש:
- עוקב אחרי הרשמות לקבלת התראות פוש (כלומר, השרת יוצר רשומה חדשה במסד הנתונים כשלקוח מצטרף לקבלת התראות פוש, ומוחק רשומה קיימת במסד הנתונים כשלקוח מבטל את ההצטרפות).
- שליחת הודעת Push ללקוח יחיד
- שליחת הודעת Push לכל הלקוחות הרשומים
ה-Codelab הזה מתמקד בלמידה באמצעות התנסות, ולא מתעמק במושגים. כאן מוסבר על המושגים שקשורים להתראות.
קוד הלקוח של ה-codelab הזה כבר הושלם. ב-codelab הזה תטמיעו רק את השרת. ב-Codelab הזה מוסבר איך ליצור לקוח של התראות פוש.
תאימות דפדפן
ה-Codelab הזה פועל עם השילובים הבאים של מערכות הפעלה ודפדפנים:
- Windows: Chrome, Edge
- macOS: Chrome, Firefox
- Android: Chrome, Firefox
ה-Codelab הזה לא פועל במערכות ההפעלה הבאות (או בשילובים הבאים של מערכת הפעלה ודפדפן):
- macOS: Brave, Edge, Safari
- iOS
סטאק האפליקציות
- השרת מבוסס על Express.js.
- ספריית Node.js web-push מטפלת בכל הלוגיקה של ההתראות בדחיפה.
- נתוני המינויים נכתבים לקובץ JSON באמצעות lowdb.
אתם לא חייבים להשתמש באף אחת מהטכנולוגיות האלה כדי להטמיע התראות פוש. בחרנו בטכנולוגיות האלה כי הן מספקות חוויה אמינה של סדנת קוד.
הגדרה
כדי שההתראות הפוש יפעלו, צריך להגדיר את השרת והלקוח באמצעות מפתחות אימות. במאמר חתימה על בקשות פרוטוקול של הודעות פוש לאתרים מוסבר למה.
- בטרמינל, מריצים את הפקודה
npx web-push generate-vapid-keys. מעתיקים את הערכים של המפתח הפרטי ושל המפתח הציבורי. פותחים את
.envומעדכנים אתVAPID_PUBLIC_KEYואתVAPID_PRIVATE_KEY. מגדירים אתVAPID_SUBJECTלערךmailto:[email protected]. צריך להוסיף מירכאות כפולות לכל הערכים האלה. אחרי שתעדכנו את הקובץ, הוא אמור להיראות כך:.envVAPID_PUBLIC_KEY="BKiwTvD9HA…" VAPID_PRIVATE_KEY="4mXG9jBUaU…" VAPID_SUBJECT="mailto:[email protected]"פתיחת
public/index.js.מחליפים את
VAPID_PUBLIC_KEY_VALUE_HEREבערך של המפתח הציבורי.
ניהול מינויים
הלקוח שלכם מטפל ברוב תהליך המינוי. הפעולות העיקריות שהשרת צריך לבצע הן שמירה של מינויים חדשים להתראות פוש ומחיקה של מינויים ישנים. המנויים האלה מאפשרים לכם לשלוח הודעות ללקוחות בעתיד.
שמירת פרטי מינוי חדשים
לוחצים על Register service worker (רישום של Service Worker) בכרטיסיית האפליקציה. בתיבת הסטטוס אמורה להופיע הודעה דומה לזו:
Service worker registered. Scope: https://example.comבכרטיסיית האפליקציה, לוחצים על הרשמה לקבלת עדכונים. יכול להיות שבדפדפן או במערכת ההפעלה תופיע בקשה לאישור שליחת התראות מהאתר.
לוחצים על אישור (או על הביטוי המקביל שמופיע בדפדפן או במערכת ההפעלה). בתיבת הסטטוס אמורה להופיע הודעה כמו זו:
Service worker subscribed to push. Endpoint: https://fcm.googleapis.com/fcm/send/…פותחים את הטרמינל כדי לראות את היומנים. אמורה להופיע ההודעה
/add-subscriptionואחריה נתונים מסוימים. /add-subscriptionהיא כתובת ה-URL שהלקוח שולח אליה בקשת POST כשהוא רוצה להירשם לקבלת התראות Push. הנתונים שמופיעים בהמשך הם פרטי המינוי של הלקוח שצריך לשמור.פתיחת
server.js.מעדכנים את הלוגיקה של
/add-subscriptionroute handler באמצעות הקוד הבא:
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צריכה להופיע ואחריה פרטי המינוי של הלקוח. מעדכנים את הלוגיקה של ה-handler של המסלול
/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); });
שליחת התראות
כמו שמוסבר במאמר שליחת הודעת פוש, השרת שלכם לא שולח את הודעות הפוש ישירות ללקוחות. במקום זאת, היא מסתמכת על שירות Push כדי לעשות זאת. השרת שלכם בעצם מתחיל את תהליך הדחיפה של הודעות ללקוחות על ידי שליחת בקשות לשירות אינטרנט (בקשות פרוטוקול של הודעות בדחיפה באינטרנט) לשירות אינטרנט (שירות הדחיפה) שנמצא בבעלות של ספק הדפדפן שבו המשתמש שלכם משתמש.
מעדכנים את הלוגיקה של
/notify-meroute handler באמצעות הקוד הבא: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) { // 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-allroute handler באמצעות הקוד הבא: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); } });חוזרים לכרטיסיית האפליקציה.
לוחצים על אני רוצה לקבל התראות. צריכה להתקבל התראה. הכותרת צריכה להיות
Hello, Notifications!והגוף צריך להיותID: <ID>, כאשר<ID>הוא מספר אקראי.פותחים את האפליקציה בדפדפנים או במכשירים נתמכים אחרים. אפשר לנסות להירשם לקבלת התראות פוש ואז ללחוץ על הלחצן הודעה לכולם. ההתראה צריכה להתקבל בכל המכשירים שרשומים למינוי.
השלבים הבאים
- כדי להבין טוב יותר איך פועלות התראות פוש, מומלץ לקרוא את הסקירה הכללית על התראות פוש.
- במאמר Codelab: Build a push notification client (מעבדת קוד: יצירת לקוח של התראות דחיפה) מוסבר איך ליצור לקוח שמבקש הרשאת התראה, רושם את המכשיר לקבלת התראות דחיפה ומשתמש ב-service worker כדי לקבל הודעות דחיפה ולהציג את ההודעות כהתראות.