我正在使用一个应用程序,其中我必须使用Firebase保存来自服务器的所有通知。我可以保存哪些通知即将出现在前景中,如果通知在后台出现,但如果我单击通知,我可以保存,我可以保存它。但是我主要关心的是,用户是否刷新通知或清除通知,这意味着用户不会单击通知,那么我该如何保存。有什么方法吗?请帮助我找到解决方案。
您可能有一个延伸FirebaseMessagingService
的类,因此您可以在onMessageReceived
函数上进行操作。您可以使用semotemessage函数getData()
请参阅ge消息有效载荷的文档。您可以从那里访问标题和其他信息。当然,您需要了解收到的通知的结构。因此,要回答您的问题,您可以通过简单地将其保存在FirebaseMessagingService
的onMessageReceived
方法中,可以保存通知信息。
FCM停止接收通知,当该应用被杀死时,请参见。因此,您最好的方法是按照建议的 @D10进行操作,并在云功能中实现保存和发送。这是如何发送通知的示例。您需要使您的应用程序将通知令牌保存到实时数据库中,以便云功能可以读取并将通知发送给正确的用户。
要将令牌保存到实时数据库中,您需要在FirebaseInstanceIdService
中添加一些代码,特别是在onTokenRefresh
方法中。您可以在数据库中具有称为令牌的位置,并且可以使用用户ID创建对象。因此,您可以将令牌添加到服务器中:
DatabaseReference ref = database.getReference("tokens");
Map<String, String> users = new HashMap<>();
users.put(userUID, token);
ref.setValueAsync(users);
将在onMessageReceived(RemoteMessage remoteMessage)
,remoteMessage
对象中收到来自服务器的通知,您将获得title
和body
,您可以将其存储在SQLITE或共享Preference中。 例如: -
class FBMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.i("PVL", "MESSAGE RECEIVED!!");
if (remoteMessage.getNotification().getBody() != null) {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
} else {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
}
}
}
onMessageReceived
将在每个状态下获得事件:-kill,背景,前景。
如果用户未在应用中打开通知,则无法保存通知,因此,如果他刷了通知,则无法将其保存在应用程序中。
一个选项是将云功能用于firebase:https://firebase.google.com/docs/functions/
因此,您可以创建一个向用户发送通知的函数,然后添加代码以添加您要寻找的行为:发送通知时,保存它。
@suppress('debecation&quot;(类myfirebasemessagingservice:firebasemessagingservice(({
val TAG = "FirebaseMessagingService"
@SuppressLint("LongLogTag")
override fun onMessageReceived(remoteMessage: RemoteMessage) {
Log.d(TAG, "sent phone: ${remoteMessage.from}")
if (remoteMessage.notification != null) {
showNotification(remoteMessage.notification?.title, remoteMessage.notification?.body)
}
}
private fun showNotification(title: String?, body: String?) {
val databaseHelper = DatabaseHelper(this)
// sharedPreferences=this.getSharedPreferences("SHARED_PREF" , Context.MODE_PRIVATE)
val intent = Intent(this, MenuscreenActivity::class.java)
databaseHelper.insertData(title, body, databaseHelper.FIRST_TABLE_NAME)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
startActivity(intent)
val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val notificationBuilder = NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setSound(soundUri)
.setContentIntent(pendingIntent)
val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(0, notificationBuilder.build())
}
}
@suppress('dobecation&quot;(类myfirebasemessagingservice:firebasemessagingservice(({
val TAG = "FirebaseMessagingService"
@SuppressLint("LongLogTag")
override fun onMessageReceived(remoteMessage: RemoteMessage) {
Log.d(TAG, "sent phone: ${remoteMessage.from}")
if (remoteMessage.notification != null) {
showNotification(remoteMessage.notification?.title, remoteMessage.notification?.body)
}
}
private fun showNotification(title: String?, body: String?) {
val databaseHelper = DatabaseHelper(this)
// sharedPreferences=this.getSharedPreferences("SHARED_PREF" , Context.MODE_PRIVATE)
val intent = Intent(this, MenuscreenActivity::class.java)
databaseHelper.insertData(title, body, databaseHelper.FIRST_TABLE_NAME)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
startActivity(intent)
val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val notificationBuilder = NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setSound(soundUri)
.setContentIntent(pendingIntent)
val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(0, notificationBuilder.build())
}
}