เหตุการณ์พุช

Matt Gaunt

เมื่อถึงจุดนี้ เราจะพูดถึงการติดตามผู้ใช้และการส่งข้อความพุช ขั้นตอนถัดไปคือการ รับข้อความ Push นี้บนอุปกรณ์ของผู้ใช้ และแสดงการแจ้งเตือน (รวมถึง งานที่เราอาจอยากทำ)

เหตุการณ์การพุช

เมื่อได้รับข้อความ ระบบจะส่งออกเหตุการณ์พุชใน Service Worker ของคุณ

โค้ดสำหรับการตั้งค่า Listener เหตุการณ์พุชควรคล้ายกับเหตุการณ์อื่นๆ Listener ที่คุณจะเขียนใน JavaScript:

self.addEventListener('push', function(event) {
    if (event.data) {
    console.log('This push event has data: ', event.data.text());
    } else {
    console.log('This push event has no data.');
    }
});

โค้ดที่แปลกที่สุดสำหรับนักพัฒนาซอฟต์แวร์ส่วนใหญ่ที่เพิ่งเริ่มใช้งานบริการคือ self ตัวแปร self มีการใช้งานอย่างแพร่หลายใน Web Workers ซึ่งเป็นโปรแกรมทำงานของบริการ self หมายถึง ขอบเขตรวมทั้งหมด คล้ายๆ กับ window ในหน้าเว็บ แต่สำหรับโปรแกรมทำงานบน เว็บและโปรแกรมทำงานของบริการ self หมายถึงตัวผู้ปฏิบัติงานเอง

ในตัวอย่างข้างต้น self.addEventListener() อาจหมายถึงการเพิ่ม Listener เหตุการณ์ ตัวโปรแกรมทำงานของบริการเอง

ในตัวอย่างเหตุการณ์พุช เราจะตรวจสอบว่ามีข้อมูลหรือไม่ แล้วพิมพ์บางอย่างไป��ังคอนโซล

การแยกวิเคราะห์ข้อมูลจากเหตุการณ์พุชมีวิธีอื่นๆ อีกดังนี้

// Returns string
event.data.text()

// Parses data as JSON string and returns an Object
event.data.json()

// Returns blob of data
event.data.blob()

// Returns an arrayBuffer
event.data.arrayBuffer()

ผู้คนส่วนใหญ่ใช้ json() หรือ text() ตามที่คาดหวังจากการสมัคร

ตัวอย่างนี้แสดงถึงวิธีเพิ่ม Listener เหตุการณ์พุชและวิธีเข้าถึงข้อมูล แต่ ฟังก์ชันที่สำคัญมาก 2 อย่างขาดหายไป ไม่ได้แสดงการแจ้งเตือนและ ไม่ได้ใช้ประโยชน์จาก event.waitUntil()

รอจนกว่า

สิ่งหนึ่งที่ควรทราบเกี่ยวกับ Service Worker ก็คือคุณจะควบคุมได้น้อยว่าจะ ระบบจะเรียกใช้รหัสโปรแกรมทำงานของบริการ เบราว์เซอร์จะเลือกว่าจะปลุกระบบเมื่อใดและเมื่อใด ก็สิ้นสุดเลย วิธีเดียวที่คุณจะบอกเบราว์เซอร์ได้ว่า "นี่ ฉันยุ่งมากๆ เรื่องสำคัญ นั่นก็คือการทำตามสัญญาลงในเมธอด event.waitUntil() เบราว์เซอร์จะ ให้โปรแกรมทำงานของบริการทำงานต่อไปจนกว่าคำสัญญาที่คุณส่งเข้ามาจะตกลงกัน

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

ต่อไปนี้เป็นตัวอย่างพื้นฐานของการแสดงการแจ้งเตือน

self.addEventListener('push', function(event) {
    const promiseChain = self.registration.showNotification('Hello, World.');

    event.waitUntil(promiseChain);
});

การเรียกใช้ self.registration.showNotification() เป็นวิธีแสดงการแจ้งเตือนแก่ และผู้ใช้จะให้สัญญาว่าจะแก้ไขได้ก็ต่อเมื่อระบบแสดงการแจ้งเตือน

เพื่อทำให้ตัวอย่างนี้ชัดเจนที่สุดเท่าที่จะทำได้ ผมจึงได้ให้คำสัญญา ตัวแปรที่ชื่อ promiseChain ซึ่งจะส่งไปยัง event.waitUntil() ฉันรู้ว่านี่คือ มีรายละเอียดเยอะมาก แต่ฉันเคยเห็นปัญหาหลายอย่างที่ทำให้เกิด ความเข้าใจผิดถึงสิ่งที่ควรส่งผ่านไปยัง waitUntil() หรือเป็นผลจากสัญญาที่ไม่สมบูรณ์ เชนธุรกิจ

ตัวอย่างที่ซับซ้อนมากขึ้นเกี่ยวกับคำขอเครือข่ายสำหรับข้อมูลและการติดตามเหตุการณ์การพุชด้วย Analytics อาจมีลักษณะดังนี้

self.addEventListener('push', function(event) {
    const analyticsPromise = pushReceivedTracking();
    const pushInfoPromise = fetch('/api/get-more-data')
    .then(function(response) {
        return response.json();
    })
    .then(function(response) {
        const title = response.data.userName + ' says...';
        const message = response.data.message;

        return self.registration.showNotification(title, {
        body: message
        });
    });

    const promiseChain = Promise.all([
    analyticsPromise,
    pushInfoPromise
    ]);

    event.waitUntil(promiseChain);
});

เรากำลังเรียกฟังก์ชันที่ให้คำมั่นสัญญา pushReceivedTracking() สำหรับตัวอย่างนี้ เราสามารถสมมติว่าจะส่งคำขอเครือข่าย ไปยังผู้ให้บริการวิเคราะห์ของเรา นอกจากนี้ เรายังส่งคำขอเครือข่ายเพื่อรับ การตอบกลับและแสดงการแจ้งเตือนโดยใช้ข้อมูลคำตอบสำหรับภาพยนตร์/รายการทีวี และ ข้อความของการแจ้งเตือน

เราสามารถดูแลให้โปรแกรมทำงานของบริการทำงานได้ตลอดเวลาขณะที่งานทั้ง 2 อย่างนี้ดำเนินการโดยการรวม สิ่งที่สัญญาไว้กับ Promise.all() ผลลัพธ์ที่ได้จะส่งต่อไปยัง event.waitUntil() ซึ่งหมายความว่าเบราว์เซอร์จะรอจนกว่าคำสัญญาทั้งสองจะเสร็จสิ้น จึงจะตรวจสอบว่าการแจ้งเตือน ถูกแสดงและยุติการทำงานของ Service Worker

เหตุผลที่เราควรกังวลเกี่ยวกับ waitUntil() และวิธีการใช้คือ ปัญหาทั่วไปที่นักพัฒนาซอฟต์แวร์ต้องพบคือ เมื่อห่วงโซ่สัญญาไม่ถูกต้อง / ใช้งานไม่ได้ Chrome จะ แสดง "ค่าเริ่มต้น" นี้ การแจ้งเตือน:

รูปภาพของการแจ้งเตือนเริ่มต้นใน Chrome

Chrome จะแสดงเฉพาะข้อความ "มีการอัปเดตเว็บไซต์นี้ในเบื้องหลัง" เท่านั้น เมื่อ ได้รับข้อความ Push และเหตุการณ์พุชใน Service Worker ไม่แสดง การแจ้งเตือนหลังจากที่สัญญากับ event.waitUntil() สิ้นสุดลงแล้ว

สาเหตุหลักที่ทำให้นักพัฒนาซอฟต์แวร์ถูกตรวจจับได้คือโค้ดของพวกเขาจะ มักจะโทรหา self.registration.showNotification() แต่ไม่ได้เรียกใช้ พร้อมคำมั่นสัญญาว่าจะได้ผลตอบแทน การดำเนินการนี้ส่งผลให้มีการแจ้งเตือนเริ่มต้นเป็นระยะๆ กำลังแสดงอยู่ ตัวอย่างเช่น เราสามารถลบการส่งกลับสำหรับ self.registration.showNotification() ในตัวอย่างข้างต้น และเรามีความเสี่ยงที่จะเห็นข้อความนี้ การแจ้งเตือน

self.addEventListener('push', function(event) {
    const analyticsPromise = pushReceivedTracking();
    const pushInfoPromise = fetch('/api/get-more-data')
    .then(function(response) {
        return response.json();
    })
    .then(function(response) {
        const title = response.data.userName + ' says...';
        const message = response.data.message;

        self.registration.showNotification(title, {
        body: message
        });
    });

    const promiseChain = Promise.all([
    analyticsPromise,
    pushInfoPromise
    ]);

    event.waitUntil(promiseChain);
});

คุณจะเห็นได้ว่า เราพลาดสิ่งที่เกิดขึ้นได้ง่ายๆ

เพียงอย่าลืมว่าหากคุณเห็นการแจ้งเตือนดังกล่าว ให้ตรวจสอบเชนสัญญาของคุณและevent.waitUntil()

ในส่วนถัดไป เราจะมาดูสิ่งที่สามารถทำได้ในการจัดรูปแบบการแจ้งเตือนและ เนื้อหาที่จะแสดงได้

สถานที่ที่จะไปต่อ

Code Lab