Firebase Cloud Messaging onMessageReceived无法与ShortcutBadger一起使用

时间:2018-07-07 14:12:45

标签: android android-service firebase-cloud-messaging

我正在使用Firebase Cloud Messaging发送通知,并使用ShortcutBadger更新应用徽章上的未读消息数。我扩展了FirebaseMessagingService类并实现了覆盖方法onMessageReceived,该方法似乎运行良好,因为当我的应用程序在后台或被杀死时,我会收到通知。但是,当我在此方法中添加ShortcutBadger调用时,我不再收到通知,并且ShortcutBadger调用不起作用。

ShortcutBadger需要一个Context,并且由于FirebaseMessagingService扩展了Service,因此它是一个上下文,这就是为什么我只传递this的原因。我的代码的其他部分也有ShortcutBadger,所以我知道它可以工作。

任何建议将不胜感激。

public class Notifications extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        ShortcutBadger.applyCount(getApplicationContext(), 1); // <-- now is working
    }

}

编辑:服务器端代码

这是发送Firebase消息的服务器端代码。

Notification notification = new Notification.Builder(null)
        .title(msg.getTitle())
        .badge(msg.getBadge())
        .body(msg.getMessage())
        .build();


Message message = new Message.Builder()
        .timeToLive(timeToLive)
        .delayWhileIdle(true)
        .notification(notification)
        .addData("text", msg.getMessage())
        .addData("title", msg.getTitle())
        .addData("line1", msg.getSubtitle())
        .addData("badge", String.valueOf(msg.getBadge()))
        .addData("qummute_notification", "true")
        .build();

Result result = send(message, deviceKey, retries);

建议我发送不带通知有效载荷的消息。会尝试一下,看看会发生什么。

3 个答案:

答案 0 :(得分:0)

  1. 您确定测试期间没有致电ShortcutBadger.removeCount(Context context)吗?
  2. 尝试使用ShortcutBadger.applyCountOrThrow(Context context, int badgeCount)来查看是否抛出任何异常。
  3. onMessageReceived(RemoteMessage remoteMessage)在后​​台线程上被调用。也许正在测试的电话/发射器使用的徽章无法通过后台线程创建和显示。

答案 1 :(得分:0)

您需要从服务器端处理这种情况。从JSON中删除通知,然后使用数据。 删除通知孔对象, “通知”:{     “ title”:“我的标题(如果有)”,     “ body”:“位置”,     “ sound”:“默认”   }

从发送通知的位置,您需要更改该代码, 对于服务器端代码,应如下所示,即使您的应用程序在后台或已终止,您的 onMessageReceived 方法调用也是如此。

{
  "registration_ids": [
    "cBbGxlj5JRI:APA91bFRLp3tDoBo_P5lGYGUZ4F6iJ55yBJq4GInL7RVV2asHR5PovqnMX-ekIdl_xOYyRyJmSe3SkxYMa3mzIvqml3MmLYZUh8JWygixIebhzhb_l4xv0Q-v3werKl_UO069G1uOyvq"
  ],
  "data": {
    "title": "alt_ctgry - Vehicle Number - extra detail(if any)",
    "body": "location"
  },
  "priority": "high"
}

如果要创建通知,请编写自己的代码以进行通知。 对于通知数据访问,请使用以下代码,

@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Log.e("FCM", "Call onMessageReceived\n" + remoteMessage + "");

        String title = remoteMessage.getData().get("title");
        String body = remoteMessage.getData().get("body");

        createNotification(title, body);
    }

答案 2 :(得分:0)

  

这似乎很好用,因为当我的应用程序在后台或被杀死时,我会收到通知

否,如果您的应用程序处于前台有效状态但没有后台通知(如果您有通知有效负载),则会调用onMessageReceived

在服务器端代码中添加了通知有效负载,因此以前,当应用程序在后台运行时,您的onMessageReceived也不会被调用,但是操作系统会从您的有效负载中显示通知。

如果您想一直处理推送,则需要删除通知有效负载,但请记住,如果您有iOS应用,则它可能会中断iOS上的推送。