התנהגות ההתראות

עד עכשיו בחנו את האפשרויות שמשנות את המראה החזותי של התראה. יש אפשרויות שמשנות את אופן הפעולה של התראות.

כברירת מחדל, כשמתקשרים אל showNotification() עם אפשרויות חזותיות בלבד, הפרטים הבאים יהיו: התנהגויות:

  • לחיצה על ההתראה לא תגרום לשום דבר.
  • כל התראה חדשה מוצגת אחת אחרי השנייה. הדפדפן לא יכווץ את התראות בכל דרך שהיא.
  • הפלטפורמה עשויה להשמיע צליל או לרטוט את המכשיר של המשתמש (בהתאם לפלטפורמה).
  • בפלטפורמות מסוימות ההתראה תיעלם לאחר זמן קצר, ואילו בפלטפורמות אחרות ההתראה תיעלם להציג את ההתראה, אלא אם המשתמש מקיים איתה אינטראקציה. (לדוגמה, אפשר להשוות בין ההתראות ב-Android ובמחשבים).

בחלק הזה נראה איך אפשר לשנות את התנהגויות ברירת המחדל האלה באמצעות אפשרויות בלבד. קל יחסית ליישם את השיטות האלה ולנצל אותן.

אירוע של קליק על התראה

כשמשתמש לוחץ על התראה, התנהגות ברירת המחדל היא שלא יקרה כלום. אבל היא לא אפילו לסגור או להסיר את ההתראה.

שיטת העבודה הנפוצה של קליק על התראה היא לסגור אותו ולבצע לוגיקה אחרת (כלומר, לפתוח חלון או לבצע קריאה כלשהי ל-API לאפליקציה).

כדי לעשות זאת, צריך להוסיף ל-service worker שלנו פונקציות event listener ב-'notificationclick'. הזה תופעל בכל פעם שלוחצים על התראה.

self.addEventListener('notificationclick', (event) => {
  const clickedNotification = event.notification;
  clickedNotification.close();

  // Do something as the result of the notification click
  const promiseChain = doSomething();
  event.waitUntil(promiseChain);
});

כמו שאפשר לראות בדוגמה הזאת, אפשר לגשת להודעה שלחצו עליה בתור event.notification מכאן ניתן לגשת למאפיינים ולשיטות של ההתראה. כאן עליך לקרוא ל-method close() שלו ולבצע עבודה נוספת.

פעולות

פעולות מאפשרות לך ליצור רמה נוספת של אינטראקציה עם המשתמשים שלך, במקום פשוט ללחוץ על התראה.

לחצנים

בקטע הקודם הסברת איך להגדיר לחצני פעולה כששלחת קריאה אל showNotification():

const title = 'Actions Notification';

const options = {
  actions: [
    {
      action: 'coffee-action',
      title: 'Coffee',
      type: 'button',
      icon: '/images/demos/action-1-128x128.png',
    },
    {
      action: 'doughnut-action',
      type: 'button',
      title: 'Doughnut',
      icon: '/images/demos/action-2-128x128.png',
    },
    {
      action: 'gramophone-action',
      type: 'button',
      title: 'Gramophone',
      icon: '/images/demos/action-3-128x128.png',
    },
    {
      action: 'atom-action',
      type: 'button',
      title: 'Atom',
      icon: '/images/demos/action-4-128x128.png',
    },
  ],
};

registration.showNotification(title, options);

אם המשתמש לוחץ על לחצן פעולה, צריך לבדוק את הערך של event.action בnoticationclick אירוע כדי לדעת על איזה לחצן פעולה לחץ.

event.action יכיל את הערך action שהוגדר באפשרויות. בדוגמה שלמעלה, הערכים של event.action הם אחד מהערכים הבאים: 'coffee-action', 'doughnut-action', 'gramophone-action' או 'atom-action'.

כך נזהה קליקים על התראות או קליקים על פעולות, למשל:

self.addEventListener('notificationclick', (event) => {
  if (!event.action) {
    // Was a normal notification click
    console.log('Notification Click.');
    return;
  }

  switch (event.action) {
    case 'coffee-action':
      console.log("User ❤️️'s coffee.");
      break;
    case 'doughnut-action':
      console.log("User ❤️️'s doughnuts.");
      break;
    case 'gramophone-action':
      console.log("User ❤️️'s music.");
      break;
    case 'atom-action':
      console.log("User ❤️️'s science.");
      break;
    default:
      console.log(`Unknown action clicked: '${event.action}'`);
      break;
  }
});

תשובות בשרשור

בנוסף, בקטע הקודם ראית איך להוסיף להתראה תשובה בגוף ההודעה:

const title = 'Poll';

const options = {
  body: 'Do you like this photo?',
  image: '/images/demos/cat-image.jpg',
  icon: '/images/demos/icon-512x512.png',
  badge: '/images/demos/badge-128x128.png',
  actions: [
    {
      action: 'yes',
      type: 'button',
      title: '👍 Yes',
    },
    {
      action: 'no',
      type: 'text',
      title: '👎 No (explain why)',
      placeholder: 'Type your explanation here',
    },
  ],
};

registration.showNotification(title, options);

event.reply יכיל את הערך שהמשתמש הקליד בשדה להזנת הקלט:

self.addEventListener('notificationclick', (event) => {
  const reply = event.reply;

  // Do something with the user's reply
  const promiseChain = doSomething(reply);
  event.waitUntil(promiseChain);
});

תיוג

האפשרות tag היא בעצם מזהה מחרוזת ש"groups" הודעות ביחד, כדי לקבוע כמה התראות יוצגו למשתמש. הכי קל להסביר את זה עם דוגמה.

נציג הודעה וניתן לה תג, מתוך 'message-group-1'. אנחנו נציג את התראה עם הקוד הבא:

const title = 'Notification 1 of 3';

const options = {
  body: "With 'tag' of 'message-group-1'",
  tag: 'message-group-1',
};

registration.showNotification(title, options);

שבו תוצג ההתראה הראשונה שלנו.

התראה ראשונה עם התג של קבוצת הודעות 1.

עכשיו נציג התראה שנייה עם תג חדש של 'message-group-2', למשל:

const title = 'Notification 2 of 3';

const options = {
  body: "With 'tag' of 'message-group-2'",
  tag: 'message-group-2',
};

registration.showNotification(title, options);

תוצג למשתמש התראה שנייה.

שתי התראות שבהן התג השני של קבוצת הודעות 2.

עכשיו נציג התראה שלישית, אבל נשתמש שוב בתג הראשון של 'message-group-1'. ביצוע הפעולה הזו נסגור את ההתראה הראשונה ונחליף אותה בהודעה החדשה שלנו.

const title = 'Notification 3 of 3';

const options = {
  body: "With 'tag' of 'message-group-1'",
  tag: 'message-group-1',
};

registration.showNotification(title, options);

עכשיו יש לנו שתי התראות למרות שהתקשרו אל showNotification() שלוש פעמים.

שתי התראות שבהן ההתראה הראשונה מוחלפת בהתראה שלישית.

האפשרות tag היא פשוט קיבוץ הודעות כך שכל ההתראות הישנות שמוצגים כרגע ייסגרו אם הם כוללים את אותו תג כמו התראה חדשה.

השימוש ברכיב tag הוא עדין, כאשר הוא מחליף התראה, הוא עושה זאת בלי צליל או רטט.

כאן נכנסת לתמונה האפשרות renotify.

עדכון

זה נכון בעיקר לגבי מכשירים ניידים בזמן הכתיבה. אם האפשרות הזו מוגדרת, ההתראות רוטטות ומשמיעות צליל מערכת.

יש תרחישים שבהם כדאי להודיע למשתמש על החלפה במקום לעדכן בשקט. אפליקציות צ'אט הן דוגמה טובה לכך. במקרה הזה, צריך להגדיר tag וגם renotify עד true.

const title = 'Notification 2 of 2';

const options = {
  tag: 'renotify',
  renotify: true,
};

registration.showNotification(title, options);

שקט

האפשרות הזו מאפשרת להציג התראה חדשה אבל מונעת את התנהגות ברירת המחדל של רטט, צליל והפעלה של המסך במכשיר.

האפשרות הזו אידיאלית אם ההתראות לא דורשות את תשומת הלב של המשתמש באופן מיידי.

const title = 'Silent Notification';

const options = {
  silent: true,
};

registration.showNotification(title, options);

נדרשת אינטראקציה

Chrome במחשב יציג התראות לפרק זמן מוגדר לפני ההסתרה שלהן. Chrome פועל ההתנהגות הזו לא קיימת ב-Android. ההתראות מוצגות עד שהמשתמש יוצר איתן אינטראקציה.

כדי לאלץ את ההתראה להמשיך להיות גלויה עד שהמשתמש יקיים איתה אינטראקציה, צריך להוסיף את requireInteraction כאפשרות. ההתראה תוצג עד שהמשתמש יסגור את ההתראה או ילחץ עליה.

const title = 'Require Interaction Notification';

const options = {
  requireInteraction: true,
};

registration.showNotification(title, options);

כדאי להשתמש באפשרות הזו כדי להפעיל שיקול דעת. הצגת התראה ואילוץ המשתמש להפסיק את הפעולה זה יכול להיות מתסכל.

בחלק הבא נבחן כמה מהדפוסים הנפוצים שבהם משתמשים באינטרנט ניהול התראות וביצוע פעולות כמו פתיחת דפים כשמשתמש לוחץ על התראה.

מה השלב הבא?

שיעורי Lab קוד