当应用程序处于活动状态时通过FCM发送通知

问题描述

即使应用程序是前台,如何保持未读的推送消息?

我正在使用离子创建应用程序。我使用通过Firebase云消息传递(cordova-plugin-fcm-with-dependecy-updated)的推送通知订阅消息,并在后端进行发送。 后端请求示例:

{
   "headers": {
      "Authorization": "key = blahblah","Content-Type": "application / json","project_id": "111111111111"
   },"json": {
      "registration_ids": [
         "token"
      ],"time_to_live": 1200,"data": {
         "title": "title","body": "body","sound": "default","badge": 1,"click_action": "FCM_PLUGIN_ACTIVITY"
      }
   }
}

我还尝试发送通知密钥而不是日期密钥。试图添加到根

{
    ...
    "android": {
        "ttl": "1200s","priority": "high","notification": {
            "click_action": "FCM_PLUGIN_ACTIVITY"
        }
    },...
    "apns":{
        "headers":{
            "apns-priority":10,"apns-expiration": date('U') + 1200
        },"payload":{
            "aps":{
                "badge":1,"category":"FCM_PLUGIN_ACTIVITY"
            }
        }
    }
}

结果是相同的-当应用程序在后台运行时,推送不显示在托盘中。

如果应用程序处于前台状态,我如何不让推送保持未读状态,而仅在用户点击时调用this.fcm.onNotification().subscribe(...)上的操作?

p.s。我尝试使用cordova-plugin-local-notification,但是使用此方法会引起一些冲突-subscribe操作不会在ios中触发

解决方法

我在应用程序中使用了离子和科尔多瓦。

我正在使用插件[cordova-plugin-firebasex](https://github.com/dpa99c/cordova-plugin-firebasex)接收推送。

要发送推送,请使用以下json:

{
  "registration_ids": [
      "token"
  ],"notification":{
    "title":"Ionic 4 Notification","body":"Notification sent from POSTMAN","sound":"default","click_action":"FCM_PLUGIN_ACTIVITY","icon":"notification_icon"
  },"data":{
    "email":"[email protected]"
  },"priority":"high"
}

对于android,“通知”字段在应用程序处于后台时显示通知。

如果您处于前台,则必须使用[cordova-plugin-local-notifications](https://github.com/katzer/cordova-plugin-local-notifications)插件自己显示通知

我的代码:

constructor(private firebaseCordova: FirebaseX) {}

private initializePushApp() {
    this.checkNotificationPermission(false);
    this.onMessageApp();
}

checkNotificationPermission(requested) {
    try {
        this.firebaseCordova.hasPermission().then(hasPermission => {
            if (hasPermission) {
                this.getTokenApp();
            } else if (!requested) {
                this.firebaseCordova.grantPermission().then(value => {
                    this.checkNotificationPermission(true);
                });
            } else {
                // Denied
                console.log("Notifications won't be shown as permission is denied");
            }
        });
    } catch (e) {
        console.error(e);
    }
}

onMessageApp() {
    try {
        this.firebaseCordova.onMessageReceived().subscribe(data => {
            this.showNotificationCordova(data);
        });
    } catch (e) {
        console.error(e);
    }
}

showNotificationCordova(notification) {
    if ('background' === notification.tap) {
        // click on notification in background
        alert(notification.title);
    } else {
        this.clickNotificationSub = this.localNotifications.on('click').subscribe(data => {
            // click on notification in foreground
            alert(notification.title);
        });

        this.localNotifications.hasPermission().then(permission => {
            if (permission) {
                this.localNotifications.schedule({
                    id: 1,title: notification.title,text: notification.body,icon: notification.image ? notification.image : 'notification_icon',});
            } else {
                this.localNotifications.requestPermission().then(value => {
                    if (value) {
                        this.localNotifications.schedule({
                            id: 1,});
                    } else {
                        console.log("Notifications won't be shown as permission is denied");
                    }
                });
            }
        });
    }
}

当您输入此条件'background'=== notification.tap`时,在后台单击了通知