Я наконец решил проблему ..
В FCM (Firebase Cloud Messaging) есть два типа сообщений:
Отображение сообщений: эти сообщения вызывают обратный вызов onMessageReceived () только тогда, когда вашприложение находится на переднем плане
Сообщения данных: эти сообщения вызывают обратный вызов onMessageReceived (), даже если ваше приложение находится на переднем плане / background / kill
Так что я должен опубликовать сообщение данных для своего приложения.Обычно это делается примерно так:
POST https://fcm.googleapis.com/fcm/send
Заголовки
Key: Content-Type, Value: application/json
Key: Authorization, Value: key=<your-server-key>
Тело, использующее темы
{
"to": "/topics/my_topic",
"data": {
"my_custom_key": "my_custom_value",
"my_custom_key2": true
}
}
НО Это больше не работает (Ошибка 401). В этом случае возникнет проблема с аутентификацией, поскольку FCM теперь использует OAUTH 2
. Поэтому я прочитал документацию по firebase и, согласно документации, новый способ отправки сообщения данных:
POST: https://fcm.googleapis.com/v1/projects/YOUR_FIREBASEDB_ID/messages:send
Заголовки
Key: Content-Type, Value: application/json
Auth
Bearer YOUR_TOKEN
Body
{
"message":{
"topic" : "xxx",
"data" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message"
}
}
}
В URL есть идентификатор базы данных, который вы можете найтина вашей консоли Firebase.(Перейти к настройкам проекта)
А теперь давайте возьмем наш токен (он будет действителен только 1 час):
Сначала в консоли Firebase откройте Настройки> Учетные записи служб .Нажмите Создать новый закрытый ключ , надежно сохраните файл JSON, содержащий ключ.Мне нужен был этот JSON-файл для авторизации запросов к серверу вручную.Я скачал его.
Затем я создаю проект node.js и использовал эту функцию для получения моего токена;
var PROJECT_ID = 'YOUR_PROJECT_ID';
var HOST = 'fcm.googleapis.com';
var PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
var MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
var SCOPES = [MESSAGING_SCOPE];
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
getAccessToken().then(function(accessToken) {
console.log("TOKEN: "+accessToken)
})
});
function getAccessToken() {
return new Promise(function(resolve, reject) {
var key = require('./YOUR_DOWNLOADED_JSON_FILE.json');
var jwtClient = new google.auth.JWT(
key.client_email,
null,
key.private_key,
SCOPES,
null
);
jwtClient.authorize(function(err, tokens) {
if (err) {
reject(err);
return;
}
resolve(tokens.access_token);
});
});
}
Теперь я использую этот токен в своем почтовом запросе.Затем я отправляю свое сообщение с данными, и оно теперь обрабатывается моими приложениями onMessageReceived .