我正在使用 Firebase 云消息传递来发送通知,并使用 ShortcutBadger 更新应用徽章上的未读消息计数。我已经扩展了FirebaseMessagingService
类并实现了覆盖方法onMessageReceived
,它似乎工作正常,因为我的应用程序在后台或被杀时会收到通知。但是,当我在此方法中添加ShortcutBadger
调用时,我不再收到通知,并且 ShortcutBadger 调用不起作用。
ShortcutBadger 需要一个Context
,并且由于 FirebaseMessagingService 扩展了服务,它是一个上下文,这就是为什么我只是传递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);
有人建议我在没有通知有效负载的情况下发送消息。 会尝试一下,看看会发生什么。
- 您是否确保在测试时没有调用
ShortcutBadger.removeCount(Context context)
? - 尝试使用
ShortcutBadger.applyCountOrThrow(Context context, int badgeCount)
查看是否引发任何异常。 onMessageReceived(RemoteMessage remoteMessage)
在后台线程上调用。也许您正在测试的手机/启动器正在使用无法从后台线程创建和显示的徽章。
您需要从服务器端处理这种情况。从 JSON 中删除通知并使用数据。 删除通知孔对象, "通知":{ "标题": "我的标题(如果有的话(", "正文": "位置", "声音":"默认" },
从您发送通知的位置,您需要更改该代码, 对于服务器端代码应该如下所示,那么即使应用程序在后台或被杀,您的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 onMessageReceivedn" + remoteMessage + "");
String title = remoteMessage.getData().get("title");
String body = remoteMessage.getData().get("body");
createNotification(title, body);
}
似乎工作正常,因为我的应用程序在后台或被杀死时会收到通知
否,当你的应用在前台时调用onMessageReceived
,但如果你有通知有效负载,则不调用后台。
在服务器端代码中,您添加了通知有效负载,因此以前当应用程序在后台运行时也不会调用您的onMessageReceived
,但操作系统从您的有效负载显示通知。
如果您想一直处理推送,则需要删除通知有效负载,但请记住,如果您有 iOS 应用程序,它可能会中断 iOS 上的推送。