我正在开发一个应用程序,我必须使用firebase保存来自服务器的所有通知。我可以保存前景中的通知,如果通知在后台发出,我也可以保存,但如果我点击通知我可以保存它。但我主要担心的是,如果用户刷通知或清除通知,这意味着用户不会点击通知,那么我该如何保存通知。有什么方法吗?请帮我找到解决方案。
答案 0 :(得分:1)
您可能有一个扩展FirebaseMessagingService
的类,以便您可以在onMessageReceived
函数上执行操作。您可以使用RemoteMessage函数getData()
查看docs以获取消息有效内容。从那里您可以访问标题和其他信息。当然,您需要了解收到的通知的结构。因此,要回答您的问题,您只需将通知信息保存在onMessageReceived
的{{1}}方法中即可保存通知信息。
当应用被杀时,FCM停止接收通知see。因此,您最好的方法是按照@ D10S建议并实施保存和发送云功能。 here's如何发送通知的示例。您需要让您的应用将通知令牌保存到实时数据库,以便云功能可以读取它并将通知发送给正确的用户。
要将令牌保存到实时数据库,您需要在FirebaseMessagingService
中添加一些代码,特别是FirebaseInstanceIdService
方法。您可以在数据库中有一个名为令牌的位置,您可以使用用户ID创建一个对象。所以你可以像这样添加令牌到服务器:
onTokenRefresh
答案 1 :(得分:0)
来自服务器的通知将在onMessageReceived(RemoteMessage remoteMessage)
,remoteMessage
对象中收到,您将获得title
和body
,您可以将其存储在sqlite或SharedPreference中。
例如: -
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
将在每个州获得事件: - 杀戮,背景,前景。
答案 2 :(得分:0)
如果用户未在应用中打开通知,则无法保存通知,因此如果他滑动通知,则无法将其保存在应用内。
选项是使用Cloud Functions for Firebase: https://firebase.google.com/docs/functions/
因此,您可以创建一个向用户发送通知的函数,然后添加代码以添加您要查找的行为:发送通知时,保存它。
答案 3 :(得分:0)
@Suppress("弃用") class 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("弃用") class 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())
}
}