0Pricing
Frontend Academy · บทเรียน

การแจ้งเตือนแบบพุช

ขอสิทธิ์ สมัครรับการพุชด้วย Push API รับข้อความใน Service Worker และแสดงการแจ้งเตือนด้วย showNotification

การแจ้งเตือนแบบพุช เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องมีการแจ้งเตือนแบบพุช

การแจ้งเตือนแบบพุชช่วยดึงผู้ใช้กลับมาเมื่อไม่ได้เปิดแอป เช่น การแจ้งเตือนข้อความ ข่าวสารใหม่ และการเตือนตะกร้าสินค้าที่ถูกละทิ้ง โดยขับเคลื่อนด้วย Service Worker จึงทำงานได้แม้ปิดหน้าเว็บแล้ว

Push API และ Notifications API

API ของเบราว์เซอร์สองรายการทำงานร่วมกัน API การพุช รับข้อความจากเซิร์ฟเวอร์ผ่านการสมัครรับข้อมูลแบบพุช ส่วน API การแจ้งเตือน จะแสดงข้อความให้ผู้ใช้

การขอสิทธิ์

ขอ permission จากผู้ใช้ก่อนสมัครรับข้อมูล และควรทำเพื่อตอบสนองต่อการกระทำที่ชัดเจนของผู้ใช้เท่านั้น เช่น การคลิกปุ่ม ไม่ใช่เมื่อโหลดหน้า

async function enableNotifications() {
  const permission = await Notification.requestPermission();
  if (permission !== 'granted') {
    alert('Notifications denied');
    return;
  }
  // proceed to subscribe...
}

การสมัครรับข้อมูลแบบพุช

สมัครรับข้อมูลผ่านการลงทะเบียน 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) ใช้ระบุเซิร์ฟเวอร์ของคุณกับบริการพุช เช่น FCM และ Mozilla สร้างคีย์ครั้งเดียว แล้วเก็บคีย์ส่วนตัวไว้บนเซิร์ฟเวอร์

# Generate VAPID keys with web-push CLI:
npx web-push generate-vapid-keys

# Output:
# Public Key: BJ...
# Private Key: ka...

การส่งพุชจากเซิร์ฟเวอร์

ใช้ไลบรารี npm web-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'
}));

จัดการพุชใน Service Worker

SW จะรับเหตุการณ์พุชและแสดงการแจ้งเตือน

// 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);
    })
  );
});

ตัวเลือกการแจ้งเตือน

ปรับแต่งได้ดังนี้ ไอคอน ป้าย (ไอคอนขนาดเล็กในพื้นที่การแจ้งเตือน) รูปภาพ (ขนาดใหญ่) การดำเนินการ (ปุ่ม) แท็ก (แทนที่การแจ้งเตือนเก่าที่มีแท็กเดียวกัน) requireInteraction (คงอยู่จนกว่าจะปิด) และแบบเงียบ

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 ไม่รองรับการพุชผ่านเว็บเลย

แนวทางปฏิบัติที่ดี

1) ขอ permission หลังการกระทำที่ชัดเจนของผู้ใช้เท่านั้น 2) ส่งการแจ้งเตือนที่มีความหมายและไม่บ่อยเกินไป 3) แสดงการแจ้งเตือนทุกครั้งที่เกิดเหตุการณ์พุชเสมอ เพราะเบราว์เซอร์อาจเพิกถอนสิทธิ์หากไม่ทำเช่นนั้น 4) มีวิธียกเลิกการสมัครรับข้อมูลที่ง่าย 5) ทดสอบกับบริการพุชทั้ง 3 รายการ ได้แก่ FCM, Mozilla และ WindowsPush

ข้อผิดพลาดที่พบบ่อย

การพุชจะล้มเหลวโดยไม่มีข้อความแจ้งหาก userVisibleOnly เป็น false (Chrome กำหนดให้เป็น true) คีย์ VAPID ไม่ตรงกัน การสมัครรับข้อมูลหมดอายุ (ให้สมัครใหม่) หรือไม่มีการแสดงการแจ้งเตือนเมื่อเกิดเหตุการณ์พุช (เบราว์เซอร์จะเพิกถอนสิทธิ์)

ตรวจสอบอย่างรวดเร็ว

เหตุใดทุกข้อความพุชจึงต้องทำให้เกิดการแจ้งเตือนที่มองเห็นได้ โดยใช้ userVisibleOnly: true

สรุป: การแจ้งเตือนแบบพุช

ขอ permission ผ่านการกระทำของผู้ใช้เท่านั้น สมัครรับข้อมูลผ่าน reg.pushManager.subscribe โดยใช้คีย์สาธารณะ VAPID เซิร์ฟเวอร์ใช้ไลบรารี web-push เพื่อส่งข้อมูล เหตุการณ์พุชของ SW เรียกใช้ showNotification เหตุการณ์คลิกการแจ้งเตือนจะเปิดแอปหรือทำให้แอปอยู่ในโฟกัส ปรับแต่งไอคอน ป้าย รูปภาพ การดำเนินการ และแท็ก ต้องแสดงการแจ้งเตือนเสมอ (ต้องใช้ userVisibleOnly: true) iOS 16.4 ขึ้นไปรองรับ แต่ต้องติดตั้งเป็น PWA เท่านั้น

คำถามที่พบบ่อย

บทเรียน “การแจ้งเตือนแบบพุช” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแจ้งเตือนแบบพุช” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแจ้งเตือนแบบพุช”

ขอสิทธิ์ สมัครรับการพุชด้วย Push API รับข้อความใน Service Worker และแสดงการแจ้งเตือนด้วย showNotification คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การแจ้งเตือนแบบพุช” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม

ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เว็บแอปแม니เฟสต์
  2. การลงทะเบียนและวงจรชีวิตของ Service Worker
  3. กลยุทธ์การแคชออฟไลน์: CacheFirst และ NetworkFirst
  4. การแจ้งเตือนแบบพุช
← กลับไปที่ Frontend Academy