Я пытался реализовать службу push-сообщений с помощью Angular Service-Worker и Firebase.
Регистрация Service Worker для облачных сообщений Firebase с сертификатом WebPush, кажется, работает, так как я получаю PushSubscription. Я храню данные подписки в базе данных реального времени Firebase.
Я использую firebase-функции в качестве бэкенда, я инициализирую firebase-admin с помощью конфигурации firebase-functions.
Моя функция уведомлений извлекает fcmToken из базы данных и использует admin.messaging (fireadmin) .sendToDevice (myToken, payload) для вызова службы push.
Однако в моем журнале функций я получаю сообщение об ошибке / несоответствие-учетные данные
Учетные данные, используемые для проверки подлинности этого SDK, не имеют разрешения на отправку сообщений на устройство, соответствующее предоставленному регистрационному токену. Убедитесь, что учетные данные и регистрационный токен принадлежат одному и тому же проекту Firebase.
-У меня есть только один проект Firebase
-У меня есть учетная запись службы администратора firebase и ее ключ
-В моем манифесте у меня есть gcm_sender_id: "103953800507"
-Я пытался включить API-интерфейс Firebase Cloud Messaging через облачную платформу Google, как советовалось в аналогичном вопросе, но не увидел никаких изменений.
функции index.ts
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
const fireadmin = admin.initializeApp(functions.config().firebase);
interface Message {
body: string;
title: string;
}
exports.msgNotif = functions.database.ref('/messages/{userId}/{messageId}').onCreate( event => {
console.log(functions.config().firebase);
const mymessage = <Message>event.val();
const payload = {
notification: {
title: mymessage.title,
body: mymessage.body
}
};
admin.database().ref('/fcmTokens/tEqlfyFohYV4221ACmbWxZZAGTi2').once('value').then((snapshot) => {
const data = snapshot.val();
const fcmTokenUrl = <string>data['endpoint'];
const fcmTokenUrlSplit = fcmTokenUrl.split('/');
const myToken = fcmTokenUrlSplit[fcmTokenUrlSplit.length - 1];
console.log(myToken);
admin.messaging(fireadmin).sendToDevice(myToken, payload)
.then( res => console.log(res.results.length, res.results[0].error, res.results[0].messageId, res.results[0].canonicalRegistrationToken)).catch(err => console.log(err));
}).catch( err => console.log(err));
return true;
});
messaging.service.ts
import { Injectable, OnInit } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';
import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase';
import 'rxjs/add/operator/take';
import { BehaviorSubject, Subscription } from 'rxjs';
import { SwPush } from '@angular/service-worker';
@Injectable()
export class MessagingService implements OnInit {
currentMessage = new BehaviorSubject(null);
constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth, private swPush: SwPush) { }
ngOnInit(): void {
}
subscribeToPush() {
// Requesting messaging service to subscribe current client (browser)
console.log('i want to subscribe');
this.swPush.requestSubscription({
serverPublicKey: 'key',
})
.then(pushSubscription => {
// Passing subscription object to our backend
console.log(pushSubscription);
this.updateToken(pushSubscription);
return;
});
}
unsubscribeToPush() {
this.swPush.subscription.take(1).subscribe(sub => {
sub.unsubscribe()
.then((result) => console.log('your service worker has been unsubscribed from the push service', result))
.catch(error => console.log(error));
});
}
updateToken(token) {
return this.afAuth.authState.take(1).subscribe(user => {
if (!user) { return; }
const data = { [user.uid]: token };
this.db.object('fcmTokens/').update(data)
.then(() => console.log('it worked'))
.catch(reason => console.log('it failed' + reason));
});
}
showMessages() {
this.swPush.messages
.subscribe(message => {
console.log('[App] Push message received', message);
});
}
sendMessage() {
const mynumber = Math.floor(Math.random() * 100);
const customMsg = 'msg' + mynumber.toString();
const myobject = {
[customMsg] : {
title: 'a title',
body: 'a body'
}
};
console.log(myobject);
return this.db.object('messages/tEqlfyFohYV4221ACmbWxZZAGTi2/').update(myobject);
}
}