我如何发送通知谁登录到我的网站一个用户。如何可以生成fcmtoken系统或设备使用angular2,为打字原稿。请帮我解决this.if任何人有任何想法,所以告诉我。
import { Injectable } 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 } from 'rxjs/BehaviorSubject'
import { Observable } from 'rxjs/Observable';
import { Http, Response } from '@angular/http';
import { Headers, RequestOptions } from '@angular/http';
@Injectable()
export class MessagingService {
messaging = firebase.messaging()
currentMessage = new BehaviorSubject(null)
constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth) { }
updateToken(token) {
this.afAuth.authState.take(1).subscribe(user => {
if (!user) return;
const data = { [user.uid]: token }
this.db.object('fcmTokens/').update(data)
})
}
getPermission() {
this.messaging.requestPermission()
.then(() => {
console.log('Notification permission granted.');
return this.messaging.getToken()
})
.then(token => {
console.log(token)
// this.updateToken(token)
})
.catch((err) => {
console.log('Unable to get permission to notify.', err);
});
}
receiveMessage() {
this.messaging.onMessage((payload) => {
console.log("Message received. ", payload);
this.currentMessage.next(payload)
});
}
}
我是创建服务MessagingService.ts这个网站的帮助
https://angularfirebase.com/lessons/send-push-notifications-in-angular-with-firebase-cloud-messaging
但其给定的错误没有提供商ConnectionBackend
我解决了这个。
调用云的NodeJS功能创建消息API服务
import { Injectable } 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 } from 'rxjs/BehaviorSubject'
@Injectable()
export class MessagingService {
messaging = firebase.messaging()
currentMessage = new BehaviorSubject(null)
constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth) { }
updateToken(token) {
this.afAuth.authState.take(1).subscribe(user => {
if (!user) return;
const data = { [user.uid]: token }
this.db.object('fcmTokens/').update(data)
})
}
getPermission() {
this.messaging.requestPermission()
.then(() => {
console.log('Notification permission granted.');
return this.messaging.getToken()
})
.then(token => {
console.log(token)
this.updateToken(token)
})
.catch((err) => {
console.log('Unable to get permission to notify.', err);
});
}
receiveMessage() {
this.messaging.onMessage((payload) => {
console.log("Message received. ", payload);
this.currentMessage.next(payload)
});
}
}
从以上的component.ts文件服务电话
ngOnInit() {
this.msgService.getPermission()
this.msgService.receiveMessage()
this.message = this.msgService.currentMessage
}
index.js后端的NodeJS从消息服务获取输入
const functions = require('firebase-functions');
const admin = require("firebase-admin");
admin.initializeApp();
exports.fcmSend = functions.database.ref('/messages/{userId}/{messageId}').onCreate(event => {
const message = event.after.val()
const userId = event.params.userId
const payload = {
notification: {
title: message.title,
body: message.body,
icon: "https://placeimg.com/250/250/people"
}
};
admin.database()
.ref(`/fcmTokens/${userId}`)
.once('value')
.then(token => token.val() )
.then(userFcmToken => {
return admin.messaging().sendToDevice(userFcmToken, payload)
})
.then(res => {
console.log("Sent Successfully", res);
})
.catch(err => {
console.log(err);
});
});
每当在使用的onCreate()触发数据库中创建一个新的消息功能。云功能会先拉我们保存在数据库中的FCM令牌,然后使用该消息的数据来创建将被发送到最终用户的有效载荷。
现在部署功能的NodeJS
firebase deploy --only functions