gpt4 book ai didi

android - 使用 Firebase 处理后台推送通知,支持 Doze

转载 作者:行者123 更新时间:2023-12-03 13:40:51 24 4
gpt4 key购买 nike

我有一个配置为通过 Firebase 接收推送通知的 Android 应用程序,当手机处于打盹模式时,我遇到了让它工作的问题。

应用程序正确接收推送通知,无论它是在前台还是在后台。为此,我只使用 data无论应用程序的状态如何,推送通知中的字段都能够处理传入的任何内容。

我已经实现了接收通知的服务,如下所示:

class MyFirebaseMessagingService : FirebaseMessagingService() {

override fun onMessageReceived(p0: RemoteMessage?) {
Timber.d("Push notification received")
super.onMessageReceived(p0)
when (p0!!.data["ch"]) {
NotificationType.VoIP.channelType() -> handleVoIPNotification(p0.data)
NotificationType.Push.channelType() -> handlePushNotification(p0.data)
}
}

}
ch属性定义了通知的类型并从我的后端发送:由于我的应用程序具有视频通话功能,因此当有人调用后端时,将发送带有 ch = voip 的通知并将消息优先级设置为 high ,如记录 in the Firebase guide .
handleVoIPNotification函数包含以下内容:
private fun handleVoIPNotification(data: Map<String, String>) {
val gson = Gson()
val jsonElement = gson.toJsonTree(data)

try {
val voIPNotification = gson.fromJson(jsonElement, VoIPNotification::class.java)

Timber.i("VoIP Notification received: %s", voIPNotification.action.name)

// pass the incoming call data to the Call Manager.
CallManager.getInstance().handleNotification(voIPNotification)
} catch (exc: Exception) {
Timber.e(exc)
Timber.i("Invalid VoIP notification received: %s", data)
}
}

调用管理器然后更新一个名为 currentCall 的属性。并终止:
this.currentCall.apply {
token = notification.token
roomName = notification.room
username = notification.nickname

status.value = Call.CallStatus.Ringing
}
status属性是 BehaviorSubject另一个对象观察到的实现,该对象对调用状态的变化使用react:
currentCall.status.observable
.distinctUntilChanged()
.subscribe {
Timber.d("Call status changed: $it")

when (it) {
Call.CallStatus.Ringing -> {
this.showIncomingCallNotification()
}
Call.CallStatus.Declined, Call.CallStatus.Ended -> {
this.dismissIncomingCallNotification()
this.refreshIncomingCallActivity()
}
Call.CallStatus.Connecting -> {
this.dismissIncomingCallNotification()
this.presentOngoingCallActivity()
}
else -> { /* ignored */ }
}
}.disposedBy(this.disposeBag)
showIncomingCallNotification如下:
fun showIncomingCallNotification() {
val intent = Intent(Intent.ACTION_MAIN, null).apply {
flags = Intent.FLAG_ACTIVITY_NO_USER_ACTION or Intent.FLAG_ACTIVITY_NEW_TASK
setClass(configuration.context, configuration.incomingCallActivityType.java)
}

val pendingIntent = PendingIntent.getActivity(configuration.context, configuration.requestCode, intent, 0)

val builder = NotificationCompat.Builder(configuration.context, configuration.notificationChannel)
.setOngoing(true)
.setContentIntent(pendingIntent)
.setFullScreenIntent(pendingIntent, true)
.setSmallIcon(configuration.notificationIcon)
.setContentTitle(currentCall.username)
.setContentText(configuration.context.getString(configuration.notificationText))

val notification = builder.build()
notification.flags = notification.flags or Notification.FLAG_INSISTENT

configuration.notificationsManager.getSystemNotificationManager().notify(0, notification)
}

此代码显示一个通知,按下该通知会打开 IncomingCallActivity 并让用户接受或拒绝调用。此通知还负责使电话响铃和振动。

当应用程序在前台或后台打开时,所有这些都可以完美运行,只要屏幕打开或刚刚关闭。如果我等待一段时间(从 5 分钟到几小时,视情况而定),一切都会停止工作:当从我的后端发送推送通知时,我的 Firebase 服务不会被调用(我可以看到推送通知已正确发送)。打开屏幕,使来电通知正确显示。

我有日志清楚地显示 Firebase 服务 onMessageReceived直到我打开屏幕才调用函数。

我读了一千遍 Android Developers - Optimize for Doze and App Standby他们明确指出,具有高优先级消息的 FCM 是在手机空闲时唤醒应用程序的正确方法。

FCM is optimized to work with Doze and App Standby idle modes by means of high-priority FCM messages. FCM high-priority messages let you reliably wake your app to access the network, even if the user’s device is in Doze or the app is in App Standby mode. In Doze or App Standby mode, the system delivers the message and gives the app temporary access to network services and partial wakelocks, then returns the device or app to the idle state.



无论如何,这是行不通的。我在不同的手机上尝试过,我可以说在 Android 9 上的行为更糟​​糕,而从 Android 7 及更低版本开始就不那么常见了。

我已经看到并尝试了其他 question 中提出的解决方案,但它们似乎都不起作用,即使在其中一个答案中他们说只有当用户从多任务处理中滑出应用程序时才会发生这种情况,我可以说即使应用程序没有发生这种情况,我也可以说它发生在我身上t 被强制停止。

还有另一个问题,更类似于我的问题, here但所有建议的解决方案都不起作用。

我不知道如何解决这个问题,这是一个非常糟糕的问题,会影响我的应用程序的可用性,因为用户在不使用手机时无法接听视频通话。我还发现其他人在网上报告了这个问题,但所有这些对话似乎在没有实际解决方案的情况下都会消失……

谁能帮我?

最佳答案

事实证明,这不是 FCM 问题,但实际上是 Azure 通知中心(我们的后端用于发送通知的系统)的问题。

如果您在使用高优先级消息、Azure 通知中心和打盹模式时遇到问题,请参阅此问题的所选答案:Setting Fcm Notification Priority - Azure Notification Hub

关于android - 使用 Firebase 处理后台推送通知,支持 Doze,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56808033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com