5

Tôi đã đọc qua các tài liệu để Chrome triển khai API đẩy web here và tôi nhận thấy API nói "bạn hứa sẽ hiển thị thông báo bất cứ khi nào bạn nhận được thông báo" và theo giới hạn được nêu "bạn để hiển thị thông báo khi bạn nhận được thông báo đẩy".Thông báo đẩy im lặng của Google Chrome

Sau khi triển khai ví dụ trên máy cục bộ của tôi, tôi đã sử dụng cURL để gửi thông báo đẩy thành công. Tôi đã tò mò, vì vậy tôi nhận xét ra dòng mà thực sự gọi chức năng showNotification, và đặt trong một console.log thay vào đó và thấy rằng tôi có thể, trên thực tế, gửi, nhận, và hoàn toàn bỏ qua một thông báo đẩy. Tôi thậm chí đã thử sử dụng một câu lệnh if để kiểm soát có hay không hiển thị chúng dựa trên boolean toàn cầu mà tôi đã kiểm soát từ trang chính của tôi, và nó hoạt động. Vì vậy, tôi đã tự hỏi nếu có ai biết những gì họ có nghĩa là bằng cách nói rằng bạn cần phải hiển thị một thông báo, và các thông báo đẩy im lặng không có sẵn?

Đây không chỉ là vấn đề, tôi có thể cần kiểm soát việc có hiển thị các thông báo này trong ứng dụng web của mình hay không, vì vậy sẽ rất tuyệt nếu điều này thực sự có thể. Mã dưới đây trong trường hợp bạn tò mò.

self.addEventListener('push', function(event) { 
    var title = 'New Message'; 
    var body = 'You have received a new message!'; 
    var icon = '/img/favicon.png'; 
    var tag = 'well-notification'; 
    console.log("DID RECEIVE NOTIFICATION") 

    if(settingsShowNotification) { 
    event.waitUntil(
     self.registration.showNotification(title, { 
     body: body, 
     icon: icon, 
     tag: tag 
     }) 
    ); 
    } 
}); 

EDIT: Trên Chrome 47, nếu có liên quan.

CẬP NHẬT: Sau khi thử nghiệm thêm, tôi đã tìm thấy vấn đề rõ ràng là tôi không thể cập nhật biến toàn cầu ban đầu khi người dùng điều hướng khỏi và sau đó điều hướng đến cùng một trang. Tuy nhiên, tôi đã có thể phá vỡ điều này bằng cách sử dụng một biến trên serviceworker chính nó và gửi một tin nhắn đến nhân viên dịch vụ bằng cách sử dụng API mô tả here để chuyển đổi boolean showNotifications.

Trả lời

7

Bạn phải hiển thị thông báo và nếu bạn không hiển thị thông báo, bạn sẽ nhận được thông báo bắt buộc từ trình duyệt cho biết "Trang web này đã được cập nhật ở chế độ nền". Nhưng các yêu cầu hiển thị thông điệp đáng sợ đã được thư giãn một chút:

Tính đến ngày 16 tháng 1, có vẻ như tối đa 10 thông báo cuối cùng được kiểm tra xem liệu mỗi thông báo có hiển thị thông báo hay không. Nếu một thông báo trong mười thông báo cuối cùng đã làm không hiển thị thông báo, được coi là tai nạn và trình duyệt sẽ không hiển thị đáng sợ "Trang web này đã được cập nhật ở chế độ nền". Bạn phải bỏ lỡ hai thông báo trong mười giờ qua để thông báo đáng sợ xuất hiện.

Lưu ý: Nếu URL vào thanh địa chỉ của tab trình duyệt hoạt động phù hợp với nguồn gốc của trang của bạn, và trình duyệt là không thu nhỏ, bạn là không cần thiết để hiển thị một thông báo. Đây có lẽ là lý do tại sao các thử nghiệm của bạn thành công, nếu bạn đang ở trên trang của chính nó trong khi chạy thử nghiệm của bạn.

Chromium lỗi theo dõi việc thực hiện: https://code.google.com/p/chromium/issues/detail?id=437277

dòng có liên quan của mã nguồn: https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/push_messaging/push_messaging_notification_manager.cc&l=249

+0

Wow! Cảm ơn câu trả lời này. Tuyệt vời tìm! –

+3

Trong trường hợp của chúng tôi sau khi nhận được thông báo, chúng tôi kiểm tra trạng thái trên máy chủ và chỉ hiển thị thông báo nếu đáp ứng điều kiện. Để ngăn chặn một thông báo bắt buộc, chúng tôi trả về không bao giờ hoàn thành lời hứa như 'event.waitUntil (new Promise (function() {}))'. –

+0

Vài bình luận. Nếu bạn muốn phát hiện xem bạn có cần hiển thị thông báo hay không, hãy kiểm tra các ứng dụng khách sổ hiện đang mở và xem có bất kỳ chế độ hiển thị nào trong số chúng hiển thịState === 'hiển thị' hay không. Có một thông số mới được gọi là API ngân sách sẽ cho phép nhà phát triển kiểm tra xem họ có thể * không * hiển thị thông báo (tức là cho phép đẩy im lặng) nhưng điều này sẽ bị giới hạn ở một mức nhất định. –

Các vấn đề liên quan