De Frank van Puffelen, engenheiro
Neste artigo, mostraremos como enviar notificações entre dispositivos Android usando o Firebase Database, o Cloud Messaging e o Node.js.
O Firebase Database é um excelente back-end para criar aplicativos multiusuário para dispositivos móveis. Sempre que diversos usuários abrem o aplicativo, as mudanças que qualquer um deles faz são sincronizadas para todos os outros usuários conectados em milissegundos.
A experiência em aplicativos de bate-papo é um bom exemplo disso: toda mensagem que um usuário envia é sincronizada instantaneamente para os outros usuários.
E se o aplicativo não estiver aberto no Android para algum dos usuários? Isso significa que o dispositivo não está conectado aos servidores do Firebase Database e ele não receberá as mudanças automaticamente. No caso da maior parte dos aplicativos de bate-papo você quer levar o usuário de volta ao aplicativo quando alguém o mencionar (por exemplo, “ei @puf, pode dar uma força aqui?”).
Para essa situação, você normalmente envia uma notificação ao dispositivo do usuário usando o Firebase Cloud Messaging. Essa notificação, em seguida, aparecerá na área de notificações do dispositivo, criando uma ótima forma de levar o usuário de volta ao aplicativo quando acontecer algum evento interessante.
Neste artigo, usaremos o Firebase Cloud Messaging para entregar a notificação ao dispositivo. Escreveremos um script Node que interaja com o FCM para que não precisemos expor a chave da nossa API nos dispositivos Android. Mas antes: precisamos saber como ficará o código para enviar uma notificação no próprio dispositivo Android.
Enviar uma notificação por push pelo aplicativo Android
Para enviar uma notificação a um usuário, nosso aplicativo Android faz o seguinte:
sendNotificationToUser("puf", "Hi there puf!");
O método sendNotificationToUser() é um auxiliar que implementamos assim:
public static void sendNotificationToUser(String user, final String message) {
Firebase ref = new Firebase(FIREBASE_URL);
final Firebase notifications = ref.child("notificationRequests");
Map notification = new HashMap<>();
notification.put("username", user);
notification.put("message", message);
notifications.push().setValue(notification);
}
Isso provavelmente não é o que você esperava. Esse código só grava os dados da notificação no Database. Isso é equivalente a enviar uma notificação? Não. Estamos usando o banco de dados aqui como uma fila. Nosso aplicativo Android grava a solicitação para enviar uma notificação no banco de dados, onde o script Node a receberá e enviará pelo Cloud Messaging. Vamos dar uma olhada nesse script em seguida. Antes, queremos falar um pouco sobre como estruturamos os dados para esse aplicativo.
Estrutura dos dados
Assim como com qualquer aplicativo, a estrutura dos dados provavelmente é uma das partes mais importantes do seu aplicativo apoiado pelo Firebase. Já vimos a estrutura dos dados para enviar notificações:
notificationRequests
$pushid
message: "Hello there"
username: "puf"
É neste nó que nosso aplicativo Android estava gravando. Cada solicitação de notificação é composta da mensagem que estamos enviando e do nome do usuário que estamos notificando. Como mapearemos o nome do usuário para uma notificação depende um pouco do aplicativo. Porém, nesse caso, usaremos notificação baseada em tópico : um nome de usuário é mapeado para um tópico /topics/user_. Então, no meu caso, a mensagem será enviada a /topics/user_puf, simultaneamente, o aplicativo Android se inscreverá no mesmo tópico.
Chegou a hora de falarmos sobre o código do Node de que falamos.
Código do Node
Agora que sabemos como o aplicativo Android grava uma solicitação no banco de dados e como ficará a estrutura do banco de dados, é hora de escrever o código que efetivamente enviará as notificações.
Este será um processo Node, que monitora a fila de notificação que vimos anteriormente. Para cada descendente que é adicionado à fila, ele extrai as informações necessárias e chama a REST API do Cloud Messaging para enviar a notificação. Se tudo der certo, ele removerá a solicitação de notificação da fila.
var firebase = require('firebase');
var request = require('request');
var API_KEY = "..."; // Your Firebase Cloud Server API key
firebase.initializeApp({
serviceAccount: ".json",
databaseURL: "https://.firebaseio.com/"
});
ref = firebase.database().ref();
function listenForNotificationRequests() {
var requests = ref.child('notificationRequests');
ref.on('child_added', function(requestSnapshot) {
var request = requestSnapshot.val();
sendNotificationToUser(
request.username,
request.message,
function() {
request.ref().remove();
}
);
}, function(error) {
console.error(error);
});
};
function sendNotificationToUser(username, message, onSuccess) {
request({
url: 'https://fcm.googleapis.com/fcm/send',
method: 'POST',
headers: {
'Content-Type' :' application/json',
'Authorization': 'key='+API_KEY
},
body: JSON.stringify({
notification: {
title: message
},
to : '/topics/user_'+username
})
}, function(error, response, body) {
if (error) { console.error(error); }
else if (response.statusCode >= 400) {
console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage);
}
else {
onSuccess();
}
});
}
// start listening
listenForNotificationRequests();
Já que estamos detectando eventos child_added, terminaremos chamando sendNotificationToUser() para cada solicitação de notificação da fila. Se o envio der certo, removeremos a solicitação da fila. Não há nova tentativa automática neste script, assim ele só tentará enviar novamente notificações que não foram enviadas quando você reiniciar o script. Para uma abordagem mais dimensionável, considere usar nossa biblioteca firebase-queue .
Você provavelmente percebeu que temos uma constante API_KEY no script. Essa é a chave que recebemos do Firebase Cloud Messaging para podermos enviar mensagens. Ela também é o motivo de não queremos executar este código no próprio aplicativo Android, pois sabemos que a chave da API abre a possibilidade de abusos, já que pode ser usada para enviar mensagens em seu nome. No entanto, tendo essa chave no nosso script Node em um servidor, garantimos que os usuários do nosso aplicativo Android não possam obtê-la.
Receber uma notificação no aplicativo Android
O código para Android é bem pequeno, graças à forma com que o Firebase Cloud Messaging SDK lida com mensagens de notificação. Quando ele recebe uma mensagem de notificação enquanto o aplicativo está em segundo plano, exibe uma mensagem na área de notificação do sistema. Quando o usuário clica na mensagem, ele abre o aplicativo automaticamente. Esse tipo de reenvolvimento é exatamente o que queremos para esse aplicativo, então só falta incluir a biblioteca do Firebase Messaging e inscrever-se no tópico do nosso nome de usuário.
Inscrever-se no tópico
Estamos usando um tópico que corresponde ao nome de usuário para garantir que receberemos mensagens destinadas a esse usuário.
String username = "puf";
FirebaseMessaging.getInstance().subscribeToTopic("user_"+username);
Codificamos o nome do usuário neste fragmento, já que ele depende do seu aplicativo. Mas você pode perceber que, depois de determinar o nome do usuário, só precisa de uma simples linha de código para se registrar para notificações (e exibi-las quando o aplicativo está em segundo plano).
Se você ainda quiser lidar com a notificação quando o aplicativo estiver em primeiro plano ou enviar mais dados junto com a mensagem, leia a documentação sobre o Firebase Cloud Messaging e seus tipos de mensagem .
Resumo
Esta publicação mostra como enviar notificações por push a um aplicativo Android usando o Firebase e um script Node. Enviamos a notificação por código Android, mas poderíamos enviar facilmente por qualquer outro aplicativo que pudesse acessar o Firebase Database. Adicionar compatibilidade com iOS também é fácil: basta adicionar a dependência e registrar-se para notificações remotas .
7 comentários :
Beleza, mas onde esse processo node será executado? Em um servidor web próprio? Se sim, ainda continua impossível um app Android enviar uma notificação para outro aparelho sem a necessidade de um servidor.
Se eu estiver enganado, por favor me corrijam!
Olá Daniel.
Como descrito na seção "Código do Node", esse é o código que efetivamente enviará as mensagens. E o Node.js é código server side, portanto você precisa de um servidor.
Por questões de segurança e também para evitar abusos, é impossível enviar notificações de um dispositivo para o outro. O que é possível fazer é o envio de upstream messages para o FCM, mas só para o servidor.
preciso enviar a notificação push para ususario de meu app, é um webview com feed de alguns blogs, e quando esse feed(rss) for alterado ele automaticamente envia uma notificação aos usuarios.
You will be able to finally find out what is a reflective essay outline here, guys. Check it out, my friends, this article is golden!
Ao fazer deploy do codigo node está acusando varios erros, não funciona.
Estou usando Firebase Cloud Functions + Cloud Messaging (FCM)
Great read! Very informative.
english reflective essay examples
papua4d
ojktoto
rubah4d
Togel online
Postar um comentário