Send push notifications to Android using an Azure function running NodeJS

Introduction

Introduction

Pusher Beams allows you to customize push notifications you send to your devices via a server. However it can be expensive to run a server 24 hours a day 7 days a week and we may only need to send notifications every so often. This is where Microsoft Azure Functions can help. Azure Functions are serverless and work on a pay as you go model (with a generous free tier). This means that you only pay for when you use the function. We’re going to explore how we can setup Pusher Beams on an Android client using an Azure Function running NodeJS to trigger the notifications.

Prerequisites

Create your Android application

We will need to have a user that has registered for notifications and signed up for an interest we will call “hello”, so we can test out our implementation. We’re going to create a very basic Android app that doesn’t actually show anything to the user except for the notification on the lock screen.

Create a new Empty Activity project using Android Studio and name it something like AzurePusher. Provide a Package name and remember this as you will need it for completing the Firebase set up. We will be using Kotlin as the language choice for this tutorial and supporting Android 16+ (Jelly Bean).

Firebase set up

Log in to your Firebase account and go to your console. If you do not already have a project created you will need to create one and name it anything you like. If you have a project select it. Within the Project Overview page select Add App and follow the instruction for creating a new Android application.

Once you have completed the setup for your Android app you will be returned to the dashboard. You will need to go to the project settings (found within the “settings cog” in the top left). Once in the project settings select the Cloud Messaging tab. Copy the Server Key you will need it for setting up your Pusher Beams instance.

android-azure-beams-nodeJS-img1

Creating a Pusher Beams instance

Log in or create your Pusher account to access the dashboard. Create a new beams instance using the dashboard.

android-azure-beams-nodeJS-img2

Complete step one of the Android setup guide, by providing your FCM server key you copied earlier and Continue. We will pick up the remainder later on in this tutorial. Press the X to exit the setup guide and you will be returned to your dashboard for that instance. Scroll to the bottom of the page and you will find your Pusher Beams instance ID and secret key, make note of these you will need them later.

Adding the SDKs

Open your app level build.gradle file and add the following into your dependencies:

1// app/build.gradle
2    ...
3    dependencies {
4     ...
5     implementation 'com.google.firebase:firebase-messaging:17.1.0'
6     implementation 'com.pusher:push-notifications-android:1.4.0'
7     ...
8    }
9    ...

Here we are adding the Firebase messaging SDK and the Pusher Beams SDK. You should already have the Google Service SDK and google-services.json added to your project when setting up the Firebase app.

Synchronize Gradle by pressing the Sync Now button.

Initialize Beams

Open your main activity and add the following import:

1// App/java/{your.package.name}/Main.activity
2    import com.pusher.pushnotifications.PushNotifications

Add the following to your onCreate function:

1// App/java/{your.package.name}/Main.activity
2    PushNotifications.start(applicationContext, "YOUR_INSTANCE_ID")
3    PushNotifications.addDeviceInterest("hello")

Remember to replace YOUR_INSTANCE_ID with the instance id from your Pusher Beams console and run your application.

Create your Azure function

Creating our function

Log in to your Microsoft Azure portal. Using the search facility (found at the top of the page) search for “Function App”.

Note: When searching make sure to sure for “Function App” and not “Function Apps”

Once you are on the function app page click Add to begin the process of adding a new Azure Function. You will need to give your app a name, this must be unique and you cannot use full stops. Try reverse domain naming like this: com-example-appname. I have used PusherBeams-NodeJS-Android. As long as the radio buttons are set to Create new, entering a name should also auto complete the resource group and storage. If it hasn’t you should complete these fields as well.

Select your Subscription and Hosting Plan. If you’re unsure what these should be leave them as the default values. We will also be using Windows OS for this tutorial and our location will be set to Central US. However feel free to alter the location if the JavaScript run time is available there as well. Make sure your Runtime Stack is set to JavaScript and click Create.

android-azure-beams-nodeJS-img3

Note: Whilst we are using the Windows OS for this tutorial you may also be able to follow using the Linux OS. If you are doing this please select the Publish option as Code and be aware that there may be some unforeseen differences in the remainder of this tutorial.

Once your resource has been created you should receive a notification on the navigation bar. If you don’t see this, wait a couple of minutes and refresh the page. Your resource should appear in a list of Function Apps. Select your resource.

Now you have created a Function App you need to create a Function. On the overview page select the button New Function or from the side bar click on the + next to the Functions drop down. You will be given a selection of ways to build your function, select the In-portal option and click Continue.

Azure functions make it easy to invoke your code by hitting an HTTP endpoint. This is great for push notifications, as you can hit this endpoint using our HTTP rest client and passing in our message. You will see more of this later when you test your integration. For now select the Webhook + API option and click Create.

Note: There are lots of other templates available for invoking your function and you may wish to explore these as well. You can always invoke your function from the portal if you wish to.

Writing our function code

The first thing we need to do in our function is install our dependencies. Azure makes this really simple for us by providing us a console. At the bottom of your screen you should see an option Console, click it to expand the console and enter the following:

    $ npm install @pusher/push-notifications-server

Your index.js file should be open in the main text editor. If it isn’t you can select it by expanding the Files section on the right and clicking it, add the following code to index.js:

1// index.js
2    module.exports = async function (context, req) {
3      const PushNotifications = require('@pusher/push-notifications-server');
4      let beamsClient = new PushNotifications({
5        instanceId: 'YOUR_INSTANCE_ID',
6        secretKey: 'YOUR_SECRET_KEY'
7      });
8      beamsClient.publishToInterests(['hello'], {
9        fcm: {
10                notification: {
11                  "title": req.body.title,
12                  "body": req.body.message
13                }
14              }
15      }).then((publishResponse) => {
16         context(done);
17      }).catch((error) => {
18        console.log(error);
19        context(done);
20      });
21    };

Note: Make sure not to leave any whitespace at the top of your function. This can cause unknown errors to occur.

This code will be used by our Azure function later on to publish notifications to devices that our registered for the hello interest. We use the event.title and event.message to form part of the message. We’ll look at this in more detail when we come to test our integration. Remember to replace YOUR_INSTANCE_ID and YOUR_SECRET_KEY with the credentials from your Pusher Beams console.

At the top of your text editor you should see a Get function URL button, click this and copy the URL for the default (Function key) and keep it somewhere safe. You will need it for testing your integration.

android-azure-beams-nodeJS-img4

Testing our implementation

Open your Postman HTTP rest client and create a new POST request. Add the function URL, that you got from your Azure function earlier, to the URL field. This URL contains a secret key for invoking your function, anybody with this key could potentially invoke your function so you should not share it within the public domain. Within the body of the post request add the following:

1{
2        "title": "hello",
3        "message": "Just a friendly hello"
4    }
android-azure-beams-nodeJS-img5

Once you are done press the Send button at the bottom. If everything has worked as expected you should receive a push to your device.

android-azure-beams-nodeJS-img6

Conclusion

We’ve learnt how to create an Azure function using NodeJS that can publish a push notification using Pusher Beams to an Android device. Here's the source code for this tutorial.