如何使用 FCM 将通知从一台使用 Angular2 的计算机发送到另一台计算机

Posted

技术标签:

【中文标题】如何使用 FCM 将通知从一台使用 Angular2 的计算机发送到另一台计算机【英文标题】:How to send Notification using FCM from one computer to another using Angular2 【发布时间】:2018-06-07 18:34:56 【问题描述】:

如何向登录我网站的一位用户发送通知。 如何使用 angular2、typescript 为系统或设备生成 fcmtoken。 请帮我解决这个问题。如果有人有任何想法,请告诉我。

 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 没有提供程序

【问题讨论】:

【参考方案1】:

我解决了这个问题。

创建调用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

【讨论】:

以上是关于如何使用 FCM 将通知从一台使用 Angular2 的计算机发送到另一台计算机的主要内容,如果未能解决你的问题,请参考以下文章

如何将推送通知从一台 iPhone 设备发送到另一台设备? [关闭]

如何使用 FCM 和 Flutter(一个到另一个设备)发送推送通知?

带有 FCM 推送通知的 Angular 服务工作者

如何使用 Postman/curl 和 Angular 8 测试 FCM

如何在 nodejs 中使用 FCM 发送 AWS SNS 推送通知?

Angular 6 Web 应用程序中推送通知的 FCM 设置