Vue pwa with firebase cloud messaging not working properly

后端 未结 1 1433
夕颜
夕颜 2020-12-14 21:44

im trying the following code:

    navigator.serviceWorker.register(\'service-worker.js\')
      .then((registration) => {
        const messaging = fireba         


        
相关标签:
1条回答
  • 2020-12-14 22:47

    Configure to server to receive notifications

    Inside public folder, add the following line to manifest.json:

    {
        //...manifest properties
        "gcm_sender_id": "103953800507" <--- add this line to the file
    }
    

    Note: if the project wasn't created using Vue Cli, manually create the manifest.json file. (Thanks @natghi)

    firebase-messaging-sw.js

    importScripts('https://www.gstatic.com/firebasejs/3.9.0/firebase-app.js');
    importScripts('https://www.gstatic.com/firebasejs/3.9.0/firebase-messaging.js');
    
    var config = {
      messagingSenderId: <Sender ID>
    };
    firebase.initializeApp(config);
    
    let messaging = firebase.messaging();
    

    In your main.js file add the following code

    var config = {
      apiKey: <API_KEY>,
      authDomain: <DOMAIN>,
      databaseURL: <DATABASE_URL>,
      projectId: <PROJECT_ID>,
      storageBucket: <STORAGE_BUCKET>,
      messagingSenderId: <SENDER_ID>
    };
    firebase.initializeApp(config);
    
    Vue.prototype.$messaging = firebase.messaging()
    
    navigator.serviceWorker.register('/firebase-messaging-sw.js')
      .then((registration) => {
        Vue.prototype.$messaging.useServiceWorker(registration)
      }).catch(err => {
        console.log(err)
      })
    

    Receive notifications

    Then in your App.vue, add this code to the created() function

    created() {
        var config = {
            apiKey: <API_KEY>,
            authDomain: <DOMAIN>,
            databaseURL: <DATABASE_URL>,
            projectId: <PROJECT_ID>,
            storageBucket: <STORAGE_BUCKET>,
            messagingSenderId: <SENDER_ID>
        };
        firebase.initializeApp(config);
        const messaging = firebase.messaging();
    
        messaging
        .requestPermission()
        .then(() => firebase.messaging().getToken())
        .then((token) => {
            console.log(token) // Receiver Token to use in the notification
        })
        .catch(function(err) {
            console.log("Unable to get permission to notify.", err);
        });
    
        messaging.onMessage(function(payload) {
        console.log("Message received. ", payload);
        // ...
        });
    }
    

    Send notification

    UPDATE

    const admin = require("firebase-admin")
    
    var serviceAccount = require("./certificate.json");
    
    admin.initializeApp({
        credential: admin.credential.cert(serviceAccount),
    });
    const Messaging = admin.messaging()
    
    var payload = {
        webpush: {
            notification: {
                title: "Notification title",
                body: "Notification info",
                icon: 'http://i.imgur.com/image.png',
                click_action: "http://yoursite.com/redirectPage" 
            },
        },
        topic: "Doente_" + patient.Username
    };
    
    return Messaging.send(payload)
    

    Older version

    Then, in postman you do the following request

    POST /v1/projects/interact-f1032/messages:send HTTP/1.1
    Host: fcm.googleapis.com
    Authorization: Bearer <SENDER_TOKEN>
    Content-Type: application/json
    
    {
      "message":{
        "token" : The token that was in the console log,
        "notification" : {
          "body" : "This is an FCM notification message!",
          "title" : "FCM Message"
          }
       }
    }
    

    Sender Token

    In your backend, use the following code, where the file "certificate.json" was got in the firebase dashboard (https://firebase.google.com/docs/cloud-messaging/js/client - Generate pair of keys)

    const {google} = require('googleapis');
    
    function getAccessToken() {
      return new Promise(function(resolve, reject) {
        var key = require('./certificate.json');
        var jwtClient = new google.auth.JWT(
          key.client_email,
          null,
          key.private_key,
          ["https://www.googleapis.com/auth/firebase", 
          "https://www.googleapis.com/auth/cloud-platform"],
          null
        );
        jwtClient.authorize(function(err, tokens) {
          if (err) {
            reject(err);
            return;
          }
          resolve(tokens.access_token);
        });
      });
    }
    
    getAccessToken().then(senderToken => console.log(senderToken))
    

    The senderToken is used on the Authorization header to send a notification

    0 讨论(0)
提交回复
热议问题