Firebase 通知白圈问题
Firebase Notification white circle issue
我在使用 Firebase Notification
时遇到问题,如果我在应用 运行 出现在屏幕上时发送通知,通知将正确显示如下:
如果我在后台 运行 应用程序时发送通知,通知显示如下:
这是我的FirebaseMessagingService
class
public class AppFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
sendNotification(remoteMessage);
}
private void sendNotification(RemoteMessage remoteMessage) {
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.ic_video_label_white_24dp: R.drawable.ic_launcher;
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setWhen(System.currentTimeMillis());
notificationBuilder.setColor(ContextCompat.getColor(this, R.color.colorPrimary));
notificationBuilder.setSmallIcon(icon);
notificationBuilder.setContentTitle(remoteMessage.getNotification().getTitle());
notificationBuilder.setContentText(remoteMessage.getNotification().getBody());
notificationBuilder.setAutoCancel(true);
notificationBuilder.setSound(defaultSoundUri);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
Intent resultIntent = new Intent(this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setContentIntent(pendingIntent);
notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
}
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
}
为什么会这样?
这是 Firebase 中的错误,尚未解决。 Link 这里:
另一种选择是不使用 Firebase 控制台发送通知,而是使用 POST API,这样您的通知将直接发送到 onMessageReceived()
,您可以在其中创建您的自己的通知。
要发送数据负载消息,您必须发出 curl 请求:
HTTP POST 请求
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{ "data": {
"score": "5x1",
"time": "15:10"
},
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
您可以从 firebase 控制台获取服务器密钥 (AIzaSyZ-1u...0GBYzPu7Udno5aA):您的项目 -> 设置 -> 项目设置 -> 云消息传递 -> 服务器密钥
发生这种情况的原因是 Firebase 通知的工作方式,以及不同的行为,当应用程序在前台时和在后台时不同:
- 前景 - 这是兼容性,与此,过去和 GCM - 你完全控制并执行来自 AppFirebaseMessagingService 的代码
- 背景 - 在本例中 system/library 负责显示消息,并用于此应用程序的主图标。如果您在数据节点中有任何数据,那么它会作为意图传递给您应用程序的主要activity(在用户按下通知后)
因此 - 我决定在我的应用程序中不将其用作:
1.我无法控制它
2. 使用应用程序的默认图标(在我的例子中看起来也像你的 - 圆形
3.我不能用这个做额外的事情(在我的例子中,我还显示了图像+添加动作,以及 Firebase 通知 - 我
无法做到这一点,当应用程序在后台时)
我在使用 Firebase Notification
时遇到问题,如果我在应用 运行 出现在屏幕上时发送通知,通知将正确显示如下:
如果我在后台 运行 应用程序时发送通知,通知显示如下:
这是我的FirebaseMessagingService
class
public class AppFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
sendNotification(remoteMessage);
}
private void sendNotification(RemoteMessage remoteMessage) {
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.ic_video_label_white_24dp: R.drawable.ic_launcher;
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setWhen(System.currentTimeMillis());
notificationBuilder.setColor(ContextCompat.getColor(this, R.color.colorPrimary));
notificationBuilder.setSmallIcon(icon);
notificationBuilder.setContentTitle(remoteMessage.getNotification().getTitle());
notificationBuilder.setContentText(remoteMessage.getNotification().getBody());
notificationBuilder.setAutoCancel(true);
notificationBuilder.setSound(defaultSoundUri);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
Intent resultIntent = new Intent(this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setContentIntent(pendingIntent);
notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
}
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
}
为什么会这样?
这是 Firebase 中的错误,尚未解决。 Link 这里:
另一种选择是不使用 Firebase 控制台发送通知,而是使用 POST API,这样您的通知将直接发送到 onMessageReceived()
,您可以在其中创建您的自己的通知。
要发送数据负载消息,您必须发出 curl 请求:
HTTP POST 请求
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{ "data": {
"score": "5x1",
"time": "15:10"
},
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
您可以从 firebase 控制台获取服务器密钥 (AIzaSyZ-1u...0GBYzPu7Udno5aA):您的项目 -> 设置 -> 项目设置 -> 云消息传递 -> 服务器密钥
发生这种情况的原因是 Firebase 通知的工作方式,以及不同的行为,当应用程序在前台时和在后台时不同:
- 前景 - 这是兼容性,与此,过去和 GCM - 你完全控制并执行来自 AppFirebaseMessagingService 的代码
- 背景 - 在本例中 system/library 负责显示消息,并用于此应用程序的主图标。如果您在数据节点中有任何数据,那么它会作为意图传递给您应用程序的主要activity(在用户按下通知后)
因此 - 我决定在我的应用程序中不将其用作: 1.我无法控制它 2. 使用应用程序的默认图标(在我的例子中看起来也像你的 - 圆形 3.我不能用这个做额外的事情(在我的例子中,我还显示了图像+添加动作,以及 Firebase 通知 - 我 无法做到这一点,当应用程序在后台时)