Ioni c Firebase сообщений также, когда приложение на переднем плане - PullRequest
0 голосов
/ 17 апреля 2020

Я реализовал ioni c облачную передачу сообщений с помощью cordova-plugin-firebase. Все работает более или менее хорошо. Единственная проблема заключается в том, что, хотя у меня приложение открыто на переднем плане, я все равно получаю сообщение, и оно перекрывает открытое приложение, что очень отвлекает (так как я пишу систему чата). Я не могу понять, что не так.

Сначала я покажу код angular, а затем код NodeJS (основанный на express). Кроме того, тег также не работает, что очень отвлекает, поскольку согласно документации старое сообщение следует заменить, если используется тот же тег, или я что-то здесь неправильно понял?

Мой angular сервис для FCM выглядит так это:

import { Injectable } from '@angular/core';
import { Firebase } from '@ionic-native/firebase/ngx';
import { Platform } from '@ionic/angular';
import { UserService } from './user.service';

@Injectable()
export class FcmService {

  constructor(
    private firebaseNative: Firebase,
    private platform: Platform,
    private user: UserService
  ) {

  }

  async getToken() {
    await this.platform.ready();
    let token;
    let os;

    if (this.platform.is('android')) {
      os = 'android';
      token = await this.firebaseNative.getToken();
    }

    if (this.platform.is('ios')) {
      os = 'ios';
      token = await this.firebaseNative.getToken();
      await this.firebaseNative.grantPermission();
    }

    if (!this.platform.is('cordova')) {
      // ignore for now
    }
    return token; 
  }

  async refreshDeviceToken()
  {
    this.getToken().then((token) => {
      console.log("USING TOKEN " + token);
      this.user.addDeviceToken(token, '', '');
    });
  }

  async registerToken()
  {
    const token = await this.getToken();
    if (token) {
      await this.user.addDeviceToken(token);
    }
  }

  async deregisterToken()
  {
    const token = await this.getToken();
    return await this.user.removeDeviceToken(token);
  }

  listenToNotifications() {
    return this.firebaseNative.onNotificationOpen();
  }
}

И я называю это так в моем компоненте приложения:

export class AppComponent {
  constructor(
    private platform: Platform,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar,
    private fcm :FcmService,
    private nav :NavController
  ) {
    this.initializeApp();

  }

  async initializeApp() {
    this.platform.ready().then(async () => {
      this.statusBar.styleDefault();
      this.splashScreen.hide();
      await this.fcm.refreshDeviceToken();
      this.fcm.listenToNotifications().subscribe((data :any)=> {
        console.log(data);
        if(data.wasTapped)
        {
          this.nav.navigateForward(['/chat', data.chatId]);
        }
      });
    });
  }
}

NodeJS backend

private static async sendMessageToToken(deviceToken: DeviceToken, chat: Chat, senderId: string) {
        const senderMessage: Message = chat.messages.find((msg: Message) => msg.userId === senderId);
        const message = senderMessage.message;
        const user: User = await getRepository(User).findOneOrFail(senderMessage.userId);
        const image = user.image;
        const title = user.username;
        console.log("TAG: " + chat.id);
        await admin.messaging().send({
            token: deviceToken.deviceToken,
            data: {
                chatId: chat.id,
                senderId: senderId
            },
            notification: {
                title: title,
                body: message
            },
            android: {
                notification:
                {
                    title: '[' + title + ']',
                    body: message,
                    icon: image,
                    tag: chat.id
                }
            }
        })
    }
...