9

我想使用服務人員與Firebase在Chrome上實現推送通知。我在我的web應用程序中有一個清單文件和一個sw.js文件。我已經在Firebase中創建了一個項目,並且已經測試了註冊和發送通知。這一切都工作正常,但收到通知時數據爲空。我不明白爲什麼,也沒有任何有用的資源(據我所知!)。 這裏是我的服務人員檔案:如何使用FCM的服務人員推送通知

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

這是我main.js文件:

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

推送事件fr的控制檯日誌om sw.js: enter image description here

我沒有收到我在請求中發送的任何數據。這是用firebase做的其他方式嗎? 在此先感謝。

+0

[使用GCM推送通知發佈數據可能重複](http://stackoverflow.com/questions/37966954/posting-data-with-gcm-push-notification) – Marco

+0

我也有這個問題 – ihsansat

+0

目前黑客入侵同樣的問題。不要認爲firebase目前支持我們通過serviceWorkers獲得的webPush。 – pascalwhoop

回答

5

根據this,您可以發送chrome版本爲50以上的chrome通知版本的數據。

在Chrome 50之前,推送消息不能包含任何有效負載數據。當你的服務人員發起「推送」事件時,你所知道的只是服務器試圖告訴你一些事情,而不是它可能是什麼。然後,您必須向服務器發出後續請求,並獲取要顯示的通知的詳細信息,這可能會在網絡條件較差的情況下失敗。

現在在Chrome 50中(以及在桌面上的Firefox的當前版本中),您可以隨推送一起發送一些任意數據,以便客戶端可以避免發出額外的請求。但是,擁有巨大的權力會帶來很大的責任,所有的有效載荷數據都必須加密。

對於您目前的實現,你可以做這樣的事情:

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

對於可以與特定用戶的任何具體的通知,您可以通過工人的註冊ID的參數在API網址並獲取該特定ID的通知。 希望這有助於!

+0

非常感謝您通知我現在可以使用 – TheSabby

+0

什麼是apiPath? –

+0

api path是向您提供通知數據的請求url。 – doubt

0

根據this tutorial您目前不能將任何數據發送到GCM:

一個缺點,以目前執行的Chrome推送API的是,你不能用推送消息發送任何數據。沒有,沒有。原因是在將來的實現中,有效載荷數據在發送到推送消息端點之前必須在服務器上進行加密。這樣,端點(無論它是否爲推送提供者)將無法輕鬆查看推送消息的內容。這還可以防止其他漏洞,如HTTPS證書驗證不良和服務器與推送提供商之間的中間人攻擊。但是,此加密功能尚未得到支持,因此在此期間,您需要執行提取以獲取填充通知所需的信息。