PWA Push Notifications with Firebase (Cloud Messaging)-pt1
Tags: javascriptpwafirebas
Published: 2020-09-29 13:19:49

---
title: PWA Push Notifications with Firebase (Cloud Messaging)-pt1
published: true
date: 2020-02-03 15:45:07 UTC
tags: javascriptpwafirebas
canonical_url: https://www.thisdot.co/blog/pwa-push-notifications-with-firebase-cloud-messaging-pt1
---

## Push Notification In Your PWA

Have you ever wondered how to add the famous/annoying push notifications to your app? Well, in this tutorial I'm going to show you how to do it using [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/).

_Note:_ This tutorial requires some basic knowledge on PWAs and Service Workers.

You can take a look to my Intro to PWA and Service Workers [here](https://dev.to/thisdotmedia/intro-to-pwa-and-service-workers-15d4)

and About PWA and notifications [here](https://dev.to/thisdotmedia/how-to-add-notifications-to-your-pwa-2mmg).

Before we begin, I need to clarify that the Notification API, and the Push API, are not the same. People get them confused all the time.

**Push API:** The Push API gives web applications the ability to receive messages pushed to them from a server, whether or not the web app is in the foreground, or even currently loaded, on a user agent. This lets developers deliver asynchronous notifications and updates to users that opt in, resulting in better engagement with timely new content.

## Let's doooo it!!

**The final code is in the FINAL branch inside of the repo.**

1. Clone this repo: [https://github.com/devpato/pwa-FCM-notifications-tutorial](https://github.com/devpato/pwa-FCM-notifications-tutorial)

As you can see, I already have the basic structure of the app created for you, since we are only going to worry about how to send the messages via push notifications using the Firebsae Cloud Messaging service.

1. Navigate to the index.html file. Notice I imported Firebase for you:

```
<script src="https://www.gstatic.com/firebasejs/7.6.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.6.1/firebase-messaging.js"></script>
```

1. Navigate to Firebase.com, and create an account if you don't have one.
2. Once you are in the Firebase console, navigate to **project settings** (in case you don't have a project yet - just create it there)

![pwa](http://images.ctfassets.net/zojzzdop0fzx/vuXTv2wM4wO9YpbjoClOV/579fec6d590985fe0ae2757558b36069/Screenshot_2020-01-28_at_12.58.36_AM.png)

1. Inside of project setting, under the **General tab** scroll all the way down to find your **Firebase SDK snippet** (if it's not there yet - this means that you've created a new project, and need to add there an app. Either way, this can be done in the same place where you then will have your SDK snippet - under the **General tab** ). Copy paste it in a safe place. The snippet should look like this:

![pwa1](http://images.ctfassets.net/zojzzdop0fzx/VsvuQPZw8Pjk7UWd6PVra/c58e6b56636355ecca92e91d2e8af468/Screenshot_2020-01-28_at_1.08.28_AM.png)

1. Go to your **index.js** file, and copy paste the following after the global variables I declared for you. Replace it with your project's customized code - the snippet from step 4.

```
const config = {
  apiKey: "XXXXXXXXXXXXXXX",
  authDomain: "XXXXXXXXXXXXXXX",
  databaseURL: "XXXXXXXXXXXXXXX",
  projectId: "XXXXXXXXXXXXXXX",
  storageBucket: "XXXXXXXXXXXXXXX",
  messagingSenderId: "XXXXXXXXXXXXXXX",
  appId: "XXXXXXXXXXXXXXX",
  measurementId: "XXXXXXXXXXXXXXX"
};
```

1. Right after - initialize the firebase instance.

```
firebase.initializeApp(config);
```

1. Then, we are going to create a constant called `messaging`, and will set it to firebase messaging service. 

```
const messaging = firebase.messaging();
```

1. Time to request permission from firebase cloud messaging. Once we get the thumbs up, they will give us a token as a promise.

```
messaging
  .requestPermission()
  .then(() => {
    message.innerHTML = "Notifications allowed";
    return messaging.getToken();
  })
  .then(token => {
    tokenString.innerHTML = "Token Is : " + token;
  })
  .catch(err => {
    errorMessage.innerHTML = errorMessage.innerHTML + "; " + err;
    console.log("No permission to send push", err);
  });
```

1. Then, we are going to use the `messaging.onMessage()` method. This is used for receiving data, and notification payloads, by all users that are currently viewing the page (the page is in the foreground).

To do so, we add the following code:

```
messaging.onMessage(payload => {
  console.log("Message received. ", payload);
  const { title, ...options } = payload.notification;
});
```

1. Notice a **firebase-messaging-sw.js** file. This file name is going to be searched by the Firebase SDK. The file needs to be in the ROOT of your project. The Firebase SDK will do some magic in the background to register the file as a service worker.
2. Inside of your **firebase-messaging-sw.js** , initialize the Firebase app by passing in the messagingSenderId. The sender id can be found inside of your project settings as the following image shows.

![Screenshot 2020-01-28 at 1.35.19 AM](http://images.ctfassets.net/zojzzdop0fzx/534Fd3ImqVWlcTJVlx4zW1/c869b73dd8a6a92ff62a6cb6a33d99c0/Screenshot_2020-01-28_at_1.35.19_AM.png)

```
firebase.initializeApp({
  messagingSenderId: "XXXXXXX"
});
```

1. Retrieve an instance of Firebase Messaging so that it can handle background messages.

```
const messaging = firebase.messaging();
```

1. Background message handler (this one will be invoked when the page is in the backround)

```
messaging.setBackgroundMessageHandler(payload => {
  const notification = JSON.parse(payload.data.notification);
  const notificationTitle = notification.title;
  const notificationOptions = {
    body: notification.body
  };
  //Show the notification :)
  return self.registration.showNotification(
    notificationTitle,
    notificationOptions
  );
});
```

## Test The Notification

1. Run the app using any [http server](https://www.npmjs.com/package/http-server)
2. Inside of your Cloud Messaging settings (a tab in the `Firebase Console > Project Settings`), copy the server key.

![Screenshot 2020-01-28 at 1.35.19 AM](http://images.ctfassets.net/zojzzdop0fzx/534Fd3ImqVWlcTJVlx4zW1/c869b73dd8a6a92ff62a6cb6a33d99c0/Screenshot_2020-01-28_at_1.35.19_AM.png)

1. If you have a [Postman](https://www.getpostman.com/) http client, do the following:

![Screenshot 2020-01-28 at 1.40.09 AM](http://images.ctfassets.net/zojzzdop0fzx/6QhVEKMohbxopvFgx55eKa/1b1dc8128d7172fcc8bc41d0fed224ee/Screenshot_2020-01-28_at_1.40.09_AM.png)

POST URL:\* [https://fcm.googleapis.com/fcm/send](https://fcm.googleapis.com/fcm/send) \*

HEADERS:Content-Type - application/jsonAuthorization - key=server\_key

BODY:

```
{
    "notification": {
        "title": "Testing Notification!",
        "body": "Firebase is awesome",
        "click_action": "http://127.0.0.1:5501/index.html",
        "icon": "http://the-link-to-image/icon.png"
    },
    "to": "YOUR TOKEN GOES HERE"
}
```

Then, click the **Send** button. At this point, if our app is in the foreground (it is currently opened tab in your browser), then you'll see the message we've sent in the console - handled by `messaging.onMessage`.

But if it is in the background, then it will be handled by `messaging.setBackgroundMessageHandler` in the service worker, and you'll see something like this:

![Screenshot 2020-01-28 at 1.45.48 AM](http://images.ctfassets.net/zojzzdop0fzx/xiB943I5R87WGZDv29jxP/a09c5c91e8f3275031882614bc82478b/Screenshot_2020-01-28_at_1.45.48_AM.png)

Test your app on a real device by deploying to Firebase or any other hosting provider. If you want to host your app on the Firebase - take a look at [my other tutorial](https://dev.to/thisdotmedia/web-app-deployment-with-firebase-in-2-minutes-4bo8).

**In the next tutorials, I will show you how to successfully subscribe to notifications and push them using the Firebase console.**

_This Dot Labs is a modern web consultancy focused on helping companies realize their digital transformation efforts. For expert architectural guidance, training, or consulting in React, Angular, Vue, Web Components, GraphQL, Node, Bazel, or Polymer, visit [thisdotlabs.com](([https://www.thisdotlabs.com](https://www.thisdotlabs.com))._

_This Dot Media is focused on creating an inclusive and educational web for all. We keep you up to date with advancements in the modern web through events, podcasts, and free content. To learn, visit [thisdot.co](https://www.thisdot.co)._