9

Tôi đang cố gắng sử dụng nhân viên dịch vụ với Firebase để triển khai thông báo đẩy trên chrome. Tôi có tệp kê khai và tệp sw.js trong ứng dụng web của mình. Tôi đã tạo một dự án trong Firebase và tôi đã thử nghiệm đăng ký và gửi thông báo. tất cả điều này hoạt động tốt ngoại trừ khi nhận được thông báo dữ liệu là null. Tôi không hiểu tại sao và không có bất kỳ tài nguyên hữu ích nào (theo kiến ​​thức của tôi!). Đây là dịch vụ của tôi tập công nhân:Cách sử dụng nhân viên dịch vụ với FCM để thông báo đẩy

self.addEventListener('push', function(event) { 
    console.log('Push message', event); 
    var title = 'Push message'; 
    event.waitUntil(
    self.registration.showNotification(title, { 
     body: 'The Message', 
     icon: 'images/logo.svg', 
     tag: 'my-tag' 
    })); 
}); 

Đây là tập tin main.js tôi:

if ('serviceWorker' in navigator) { 
    navigator.serviceWorker.register('/sw.js').then(function(registration) { 
    // Registration was successful 
    console.log('ServiceWorker registration successful with scope: ', registration.scope); 
    registration.pushManager.subscribe({ 
     userVisibleOnly: true 
    }).then(function(sub) { 
     console.log('endpoint:', sub.endpoint); 
    }).catch(function(e) { 

    }); 
    }).catch(function(err) { 
    // registration failed :(
    console.log('ServiceWorker registration failed: ', err); 
    }); 
} 

manifest.json:

{ 
    "name": "APPNAME", 
    "gcm_sender_id": "SENDERID" 
} 

cURL Yêu cầu:

curl --header "Authorization: key=APIKEY" -application/json" https://fcm.googleapis.com/fcm/send -d "{\"registration_ids\":[\"REGISTRATIONID\"],\"notification\":{\"title\":\"test\",\"body\":\"testing\"},\"data\":{\"title\":\"erse\"}}" 

Nhật ký bàn điều khiển của sự kiện đẩy fr om sw.js: enter image description here

Tôi không nhận được bất kỳ dữ liệu nào tôi đã gửi trong yêu cầu. Điều này có thực hiện một số cách khác với firebase không? Cảm ơn trước.

+0

Bản sao có thể có của [Đăng dữ liệu với thông báo đẩy GCM] (http://stackoverflow.com/questions/37966954/posting-data-with-gcm-push-notification) – Marco

+0

Tôi gặp vấn đề này quá – ihsansat

+0

hiện đang xâm nhập vào cùng một vấn đề. Đừng nghĩ rằng firebase hiện hỗ trợ webPush mà chúng tôi nhận được với serviceWorkers .. – pascalwhoop

Trả lời

5

Theo this, bạn có thể gửi dữ liệu với phiên bản thông báo chrome cho phiên bản chrome 50 trở đi.

Trước Chrome 50, thông báo đẩy không thể chứa bất kỳ dữ liệu tải trọng nào. Khi sự kiện 'đẩy' được kích hoạt trong nhân viên dịch vụ của bạn, tất cả những gì bạn biết là máy chủ đang cố nói cho bạn điều gì đó, nhưng không phải là điều có thể xảy ra. Sau đó, bạn phải thực hiện một yêu cầu theo dõi tới máy chủ và lấy thông tin chi tiết của thông báo để hiển thị, điều này có thể bị lỗi trong điều kiện mạng kém.

Hiện tại trong Chrome 50 (và trong phiên bản hiện tại của Firefox trên máy tính để bàn), bạn có thể gửi một số dữ liệu tùy ý cùng với thao tác đẩy để khách hàng có thể tránh thực hiện yêu cầu bổ sung. Tuy nhiên, với sức mạnh to lớn có trách nhiệm lớn, vì vậy tất cả dữ liệu tải trọng phải được mã hóa.

Đối với thực hiện hiện tại của bạn, bạn có thể làm điều gì đó như thế này:

self.addEventListener('push', function(event) { 

var apiPath = '<apiPath>'; 
event.waitUntil(registration.pushManager.getSubscription().then(function (subscription){ 

    return fetch(apiPath).then(function(response){ 
     if(response.status !== 200){ 
      throw new Error(); 
     } 

     return response.json().then(function(data){ 
      var title = data.title; 
      var message = data.body; 
      var icon = data.icon; 
      var tag = data.tag; 
      var url = data.url; 
      return self.registration.showNotification(title,{ 
       body: message, 
       icon: icon, 
       tag: tag, 
       data: url 
      }); 
     }) 
    }).catch(function(err){ 

    }) 

})); 
return; 
}); 

Đối với bất kỳ thông báo cụ thể mà có thể liên quan đến người dùng cụ thể, bạn có thể vượt qua các tham số của id đăng ký của người lao động trong url api và nhận được thông báo cho id cụ thể đó. Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn bạn rất nhiều vì đã thông báo cho tôi rằng giờ đây có thể là – TheSabby

+0

apiPath là gì? –

+0

đường dẫn api là url yêu cầu cung cấp cho bạn dữ liệu thông báo. – doubt

0

Theo this tutorial bạn hiện không thể gửi bất kỳ dữ liệu để GCM:

Một nhược điểm trong việc thực hiện hiện hành của API Đẩy trong Chrome là bạn không thể gửi bất kỳ dữ liệu với một thông điệp đẩy. Không có gì. Lý do cho điều này là trong quá trình triển khai trong tương lai, dữ liệu tải trọng sẽ phải được mã hóa trên máy chủ của bạn trước khi nó được gửi đến điểm cuối tin nhắn push. Bằng cách này, điểm cuối, bất kỳ nhà cung cấp dịch vụ đẩy nào, sẽ không thể dễ dàng xem nội dung của thông báo đẩy. Điều này cũng bảo vệ chống lại các lỗ hổng khác như xác nhận hợp lệ các chứng chỉ HTTPS và các cuộc tấn công man-in-the-middle giữa máy chủ của bạn và nhà cung cấp dịch vụ push. Tuy nhiên, mã hóa này chưa được hỗ trợ, vì vậy trong thời gian chờ đợi, bạn cần thực hiện tìm nạp để nhận thông tin cần thiết để điền thông báo.

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