通过 FirebaseMessagingService 从后台上传数据到服务器 class
Upload data to server from background through FirebaseMessegingService class
在我的应用程序中,我使用 FCM 来获取通知。当我的应用程序在前台 运行 时一切正常,但当应用程序进入后台或应用程序从后台被杀死时 问题开始,在这种情况下我收到通知但数据未上传服务器。
为了将数据上传到服务器,我使用了一个单独的 class,其中编写了所有必需的代码,我只是在 FirebaseMessagingService() class.
我试了所有可能的方法,我尝试做单独的服务,但没有用。
但我想在收到通知时将数据上传到服务器。
这是我的 FirebaseMessegingService Class
class FirebaseShareDevMessagingService : FirebaseMessagingService() {
private var resultIntent: Intent? = null
override fun onNewToken(p0: String) {
super.onNewToken(p0)
}
var mNotificationManager: NotificationManager? = null
@RequiresApi(Build.VERSION_CODES.O)
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
Log.d("remoteMessage", "onMessageReceived: ${remoteMessage.data}")
// playing audio and vibration when user se request
val notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val r = RingtoneManager.getRingtone(this, notification)
r.play()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
r.isLooping = false
}
val data: MutableMap<String, String> = remoteMessage.data
val deviceId = data["username"]
val deviceName = data["address"]
val notificationType = data["notificationType"]
//codes
....
....
val pendingIntent =
PendingIntent.getActivity(this, 1, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT)
builder.setContentTitle(remoteMessage.notification!!.title)
builder.setContentText(remoteMessage.notification!!.body)
builder.setContentIntent(pendingIntent)
builder.setVibrate(longArrayOf(100, 300, 300, 300))
builder.setStyle(
NotificationCompat.BigTextStyle().bigText(
remoteMessage.notification!!.body
)
)
builder.setAutoCancel(true)
mNotificationManager =
applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = "Your_channel_id"
val channel = NotificationChannel(
channelId,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT
)
mNotificationManager!!.createNotificationChannel(channel)
builder.setChannelId(channelId)
}
mNotificationManager!!.notify(System.currentTimeMillis().toInt(), builder.build())
val cal = TimeStampConverter.getTimeStamp(remoteMessage.sentTime.toString())
Log.d("OnReceivedNotification", "onMessageReceived:$remoteMessage ")
// here i am calling helper class to upload data to
// server.....
BackendServerHelperClass(applicationContext).saveNotification(
System.currentTimeMillis().toInt(),
remoteMessage.notification!!.title!!,
remoteMessage.notification!!.body!!,
FirebaseAuth.getInstance().uid.toString(),
cal.time.toString(),
deviceId,
deviceName,
isAllowedSubLetting.toBoolean(),
notificationType!!.toInt() )
}
}
请帮助,如果有什么办法可以做到这一点。
已更新
我尝试授予屏幕覆盖权限,但仍然无法正常工作
帮助将不胜感激:)
谢谢
经过大量研究,我找到了解决方案。
如果我们想在后台接收通知,并希望在收到通知后在后台做一些其他事情,那么我们应该简单地发送 “数据” 部分而不是 “通知”部分。
如果我们同时发送 “数据” 和 “通知” 那么我们将在后台收到通知,但如果您正在做一些"onMessageReceive" 中的其他内容,例如将数据保存到 ROOM DATABASE 或将一些数据上传到 SERVER。 , 那么你应该只发送 "数据" 部分。
数据部分示例:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
这解决了我的问题。
您可以在官方 FCM 文档中阅读更多相关信息。
谢谢!!编码愉快:)
在我的应用程序中,我使用 FCM 来获取通知。当我的应用程序在前台 运行 时一切正常,但当应用程序进入后台或应用程序从后台被杀死时 问题开始,在这种情况下我收到通知但数据未上传服务器。
为了将数据上传到服务器,我使用了一个单独的 class,其中编写了所有必需的代码,我只是在 FirebaseMessagingService() class.
我试了所有可能的方法,我尝试做单独的服务,但没有用。
但我想在收到通知时将数据上传到服务器。
这是我的 FirebaseMessegingService Class
class FirebaseShareDevMessagingService : FirebaseMessagingService() {
private var resultIntent: Intent? = null
override fun onNewToken(p0: String) {
super.onNewToken(p0)
}
var mNotificationManager: NotificationManager? = null
@RequiresApi(Build.VERSION_CODES.O)
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
Log.d("remoteMessage", "onMessageReceived: ${remoteMessage.data}")
// playing audio and vibration when user se request
val notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val r = RingtoneManager.getRingtone(this, notification)
r.play()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
r.isLooping = false
}
val data: MutableMap<String, String> = remoteMessage.data
val deviceId = data["username"]
val deviceName = data["address"]
val notificationType = data["notificationType"]
//codes
....
....
val pendingIntent =
PendingIntent.getActivity(this, 1, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT)
builder.setContentTitle(remoteMessage.notification!!.title)
builder.setContentText(remoteMessage.notification!!.body)
builder.setContentIntent(pendingIntent)
builder.setVibrate(longArrayOf(100, 300, 300, 300))
builder.setStyle(
NotificationCompat.BigTextStyle().bigText(
remoteMessage.notification!!.body
)
)
builder.setAutoCancel(true)
mNotificationManager =
applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = "Your_channel_id"
val channel = NotificationChannel(
channelId,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT
)
mNotificationManager!!.createNotificationChannel(channel)
builder.setChannelId(channelId)
}
mNotificationManager!!.notify(System.currentTimeMillis().toInt(), builder.build())
val cal = TimeStampConverter.getTimeStamp(remoteMessage.sentTime.toString())
Log.d("OnReceivedNotification", "onMessageReceived:$remoteMessage ")
// here i am calling helper class to upload data to
// server.....
BackendServerHelperClass(applicationContext).saveNotification(
System.currentTimeMillis().toInt(),
remoteMessage.notification!!.title!!,
remoteMessage.notification!!.body!!,
FirebaseAuth.getInstance().uid.toString(),
cal.time.toString(),
deviceId,
deviceName,
isAllowedSubLetting.toBoolean(),
notificationType!!.toInt() )
}
}
请帮助,如果有什么办法可以做到这一点。
已更新
我尝试授予屏幕覆盖权限,但仍然无法正常工作
帮助将不胜感激:) 谢谢
经过大量研究,我找到了解决方案。
如果我们想在后台接收通知,并希望在收到通知后在后台做一些其他事情,那么我们应该简单地发送 “数据” 部分而不是 “通知”部分。
如果我们同时发送 “数据” 和 “通知” 那么我们将在后台收到通知,但如果您正在做一些"onMessageReceive" 中的其他内容,例如将数据保存到 ROOM DATABASE 或将一些数据上传到 SERVER。 , 那么你应该只发送 "数据" 部分。
数据部分示例:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
这解决了我的问题。
您可以在官方 FCM 文档中阅读更多相关信息。
谢谢!!编码愉快:)