Firebase Cloud Messaging обмен сообщениями / несоответствующие учетные данные - PullRequest
0 голосов
/ 10 мая 2018

Я пытался реализовать службу 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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...