Я реализовал 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
}
}
})
}