Firebase 推送通知更新数据库
Firebase push notifications update DB
我正在尝试通过新的 Firebase 推送通知服务向我的用户发送一些数据。
我正在添加一些带有 'Message text' - "dbupdate" 的 "key-value" 自定义数据项,以检测它是我想向用户显示的更新消息还是普通推送通知。
在我的接收器中,我检查是否有自定义数据和 运行 更新(如果为真)。
如果不是这种情况,我会显示带有短信的正常通知。
它只在我的应用程序打开时起作用。如果应用程序关闭,通知仍然显示,我的 if 检查甚至没有 运行ning,
一些代码:
public class PushMessageService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Map<String,String> data = remoteMessage.getData();
String link = data.get("link");
String name = data.get("name");
if (link!=null) {
Log.d("link",link);
Log.d("name",name);
UpdateHelper.Go(this, link, name);
}
else {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_shop_white_24dp)
.setAutoCancel(true)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setContentText(remoteMessage.getNotification().getBody());
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(5, mBuilder.build());
}
}
}
示例通知
here
为什么会这样? 运行 我的代码在应用程序关闭后如何处理?
当您的应用程序在前台时,通知将传递给 FirebaseMessagingService.onMessageReceived()
。当应用程序不在前台时,通知将由默认通知中心处理。
另见:
How to push firebase notification only when CheckBoxPreference is checked?
根据我使用 Firebase 推送的经验:
问题:通过"Firebase console"发送推送通知时,只有当应用程序在前台时才会收到通知。如果应用程序被终止或在后台,通知仅在版本 >= lollipop 中显示,通知图标不正确 and/or 打开应用程序中的默认启动器 activity 即使您定义了不同的 Activity 在 PendingIntent.
根据 Firebase 文档,推送消息分为 2 个部分,他们称之为: Docs Link here
- 通知
- 数据负载
解决方案:
有两种方法可以发送 "Push" 消息。
1. Firebase 控制台
2。消息传递 API - 图像显示使用高级 REST 客户端的请求
推送消息在onMessageReceived(...)
方法中被接收。 Firebase onMessageReceived(...)
方法将 不会 被调用 如果 应用程序处于 后台或仅被杀死 当消息通过 Firebase 控制台发送时。
如果您通过 API 发送消息,它可以正常工作。无论应用程序处于后台、前台还是被杀死,消息都以 onMessageReceived(...)
方法传递。 (注意:这在 >=Lollipop
中工作正常 - Android 4.4 或更低版本的行为仍然不可预测。
更新:
您可以从 API 发送推送消息(firebase 将其称为下游消息),如下所示:https://firebase.google.com/docs/cloud-messaging/downstream
正在从服务器发送下游消息
为了寻址或 "target" 下游消息,应用服务器使用接收客户端应用的注册令牌进行设置。您可以发送带有预定义字段的通知消息,或自定义数据消息;有关有效负载支持的详细信息,请参阅消息有效负载中的通知和数据。此页面中的示例展示了如何在 HTTP 和 XMPP 协议中发送数据消息。
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..."
}
在Android中,如果你想更新应用程序中的某些内容,无论应用程序是否处于forground/background/terminated状态,那么最好的方法是删除通知负载并仅发送数据负载
{
"to" : "ee8....DYarin",
"data" : {
"key" : "value"
}
}
在这种情况下 onMessageReceived()
将被执行。
(在某些 android 设备中,如 xiomi,您需要为您的应用程序启用自动启动以处理终止状态下的推送)
在这种情况下,您将如何向用户显示通知?您可以在数据负载中将标题和 body 作为自定义标签传递,并以编程方式生成通知。
所以在 Android 中一切顺利,没有通知负载。
如果您在 Android 中有通知负载,那么问题是:
- 如果应用程序在前台,一切顺利,就会显示通知
并执行 onMessageReceived()
- 如果应用程序处于 background/terminated 状态,则通知将显示在您的设备上,但
onMessageReceived() 只有在您点击通知时才会起作用。
用户倾向于经常清除它们,而我们的代码在
onMessageReceived() 不会被执行。
此外,要在通知上启用此点击功能,通知负载应包含名为 click_action
:
的密钥
"notification":{
"title":"Prime",
"body" : "test",
"click_action": "my_click_action_name"
}
并且您需要在 activity
中将操作注册为 intent_filter
<intent-filter>
<action android:name="my_click_action_name" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
当用户点击通知时,相应 activity 的 onNewIntent()
方法被调用,并且数据负载在当前 intent.getExtras()
中可用
我正在尝试通过新的 Firebase 推送通知服务向我的用户发送一些数据。
我正在添加一些带有 'Message text' - "dbupdate" 的 "key-value" 自定义数据项,以检测它是我想向用户显示的更新消息还是普通推送通知。
在我的接收器中,我检查是否有自定义数据和 运行 更新(如果为真)。 如果不是这种情况,我会显示带有短信的正常通知。
它只在我的应用程序打开时起作用。如果应用程序关闭,通知仍然显示,我的 if 检查甚至没有 运行ning,
一些代码:
public class PushMessageService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Map<String,String> data = remoteMessage.getData();
String link = data.get("link");
String name = data.get("name");
if (link!=null) {
Log.d("link",link);
Log.d("name",name);
UpdateHelper.Go(this, link, name);
}
else {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_shop_white_24dp)
.setAutoCancel(true)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setContentText(remoteMessage.getNotification().getBody());
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(5, mBuilder.build());
}
}
}
示例通知 here
为什么会这样? 运行 我的代码在应用程序关闭后如何处理?
当您的应用程序在前台时,通知将传递给 FirebaseMessagingService.onMessageReceived()
。当应用程序不在前台时,通知将由默认通知中心处理。
另见:
How to push firebase notification only when CheckBoxPreference is checked?
根据我使用 Firebase 推送的经验:
问题:通过"Firebase console"发送推送通知时,只有当应用程序在前台时才会收到通知。如果应用程序被终止或在后台,通知仅在版本 >= lollipop 中显示,通知图标不正确 and/or 打开应用程序中的默认启动器 activity 即使您定义了不同的 Activity 在 PendingIntent.
根据 Firebase 文档,推送消息分为 2 个部分,他们称之为: Docs Link here
- 通知
- 数据负载
解决方案:
有两种方法可以发送 "Push" 消息。
1. Firebase 控制台
2。消息传递 API - 图像显示使用高级 REST 客户端的请求
推送消息在onMessageReceived(...)
方法中被接收。 Firebase onMessageReceived(...)
方法将 不会 被调用 如果 应用程序处于 后台或仅被杀死 当消息通过 Firebase 控制台发送时。
如果您通过 API 发送消息,它可以正常工作。无论应用程序处于后台、前台还是被杀死,消息都以 onMessageReceived(...)
方法传递。 (注意:这在 >=Lollipop
中工作正常 - Android 4.4 或更低版本的行为仍然不可预测。
更新:
您可以从 API 发送推送消息(firebase 将其称为下游消息),如下所示:https://firebase.google.com/docs/cloud-messaging/downstream
正在从服务器发送下游消息
为了寻址或 "target" 下游消息,应用服务器使用接收客户端应用的注册令牌进行设置。您可以发送带有预定义字段的通知消息,或自定义数据消息;有关有效负载支持的详细信息,请参阅消息有效负载中的通知和数据。此页面中的示例展示了如何在 HTTP 和 XMPP 协议中发送数据消息。
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..."
}
在Android中,如果你想更新应用程序中的某些内容,无论应用程序是否处于forground/background/terminated状态,那么最好的方法是删除通知负载并仅发送数据负载
{
"to" : "ee8....DYarin",
"data" : {
"key" : "value"
}
}
在这种情况下 onMessageReceived()
将被执行。
(在某些 android 设备中,如 xiomi,您需要为您的应用程序启用自动启动以处理终止状态下的推送)
在这种情况下,您将如何向用户显示通知?您可以在数据负载中将标题和 body 作为自定义标签传递,并以编程方式生成通知。 所以在 Android 中一切顺利,没有通知负载。
如果您在 Android 中有通知负载,那么问题是:
- 如果应用程序在前台,一切顺利,就会显示通知 并执行 onMessageReceived()
- 如果应用程序处于 background/terminated 状态,则通知将显示在您的设备上,但 onMessageReceived() 只有在您点击通知时才会起作用。 用户倾向于经常清除它们,而我们的代码在 onMessageReceived() 不会被执行。
此外,要在通知上启用此点击功能,通知负载应包含名为 click_action
:
"notification":{
"title":"Prime",
"body" : "test",
"click_action": "my_click_action_name"
}
并且您需要在 activity
中将操作注册为 intent_filter <intent-filter>
<action android:name="my_click_action_name" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
当用户点击通知时,相应 activity 的 onNewIntent()
方法被调用,并且数据负载在当前 intent.getExtras()