为啥从 firebase 控制台发送的通知能够绕过 android 后台任务限制? - 反应原生火力基地 -

Posted

技术标签:

【中文标题】为啥从 firebase 控制台发送的通知能够绕过 android 后台任务限制? - 反应原生火力基地 -【英文标题】:Why notifications sent from firebase console are able to bypass android background task limitation? - react-native-firebase -为什么从 firebase 控制台发送的通知能够绕过 android 后台任务限制? - 反应原生火力基地 - 【发布时间】:2020-12-02 00:06:56 【问题描述】:

我试图找到一种方法来向限制后台应用活动的 android 设备发送通知,主要是华为和 Oppo 等中国品牌。

奇怪的想法是我只有从 firebase 控制台发送通知才能收到通知。

这是我在应用程序中编写通知的方式:

const notification = new firebase.notifications.Notification()
            .setNotificationId(notificationId)
            .setTitle('some title')
            .setBody('body')
            .setData(
              screen: 'AroundMe',
            )
            .setSound('default')
            .android.setChannelId('fcm_default_channel')
            .android.setSmallIcon('ic_launcher')
            .android.setPriority(firebase.notifications.Android.Priority.Max)
            .android.setVisibility(
              firebase.notifications.Android.Visibility.Public,
            )
            .android.setAutoCancel(true)
          firebase.notifications().scheduleNotification(notification, 
            fireDate: d.getTime(),
          );

我知道该应用可以在手机设置中获得授权,因此它可以在后台接收通知,但是为什么从 firebase 控制台发送的那些可以在没有那个的情况下显示??

谢谢!

【问题讨论】:

【参考方案1】:

我想的答案

为什么从 firebase 控制台发送的通知能够绕过 android 后台任务限制?

与android中的推送通知机制有关, 看到这个:

How does push notification technology work on Android?

在这个线程中,进行了描述和总结,这是因为保持一个与 GCM 的 Socket 连接并获取通知。 当然您可以使用其他推送通知服务,例如onesignal 和 flurry 等等,但是机制是一样的。

您是否检查了它们并且无法显示通知?

在我的情况下,这种机制在这些服务上也能很好地发挥作用,即使是在中国品牌上也是如此。

【讨论】:

不,我没有在 OneSignal 和 Flurry 上进行测试。事情是使用两种方式从firebase发送通知:1-从控制台;即使在后台 2- 从应用程序中,它也可以到达手机,如果在后台,它也不会到达手机。 您的意思是您从服务器端(Node.js、Laravel 等)发送的通知永远不会在客户端捕获吗?如果是这样,您似乎在后端有问题,并且与背景或前景无关。当您想在后端发送通知时,您检查过您的密钥吗? 不,我的意思是在客户端应用程序(react-native)中,我使用react-native-firebase 安排通知,但在中国手机中,如果应用程序在后台,则永远不会收到通知。换其他手机没问题。 啊哈!我开发原生android,我不知道react-native,但是在中国品牌上,除非用户让应用程序通过自动启动,否则后台服务受到强烈限制,似乎react-native没有实现正确的方法获取通知,顺便说一句,当我在我的应用程序中使用 FCMService 时,它​​运行良好,但是当我在后台使用调度程序或其他服务时,它们在应用程序关闭且未收到通知时被杀死。【参考方案2】:

根据https://developer.android.com/topic/performance/power/power-details,Frequent 和 Rare 存储桶中的应用程序每天只能接收 10 条和 5 条 FCM 消息。您可以使用 ADB 命令更改应用待机模式。

Set app stand by bucket(将任何一个从活跃设置为稀有):

$ adb shell am set-standby-bucket [packagename] active|working_set|frequent|rare

获取当前存储桶:

$ adb shell am get-standby-bucket [packagename]

(注意 Active 是 10,Working set 是 20,Frequent 是 30,Rare 是 40)

将应用存储桶设置为稀有/频繁后,尝试发送超出相应存储桶限制的 FCM 通知。

提示:发送通知后不要拉通知抽屉 - 它会改变应用程序的待机状态。并确保在整个测试过程中保持(相同)所需的应用备用存储桶状态。

【讨论】:

感谢您的回答,但没有回答为什么从 Firebase 控制台发送的通知会到达手机(在华为上测试),而应用程序编程却没有。 当您说由应用程序编程时,您的意思是由应用程序内部的代码触发(可能是某些服务或工作?)?【参考方案3】:

我对一个问题的当前答案:

为什么不显示从 firebase 控制台发送的那些??

是从应用程序安排的通知是本地通知,来自 Firebase 控制台的通知是远程推送通知,以后的通知不需要应用程序处于活动状态才能显示。

【讨论】:

以上是关于为啥从 firebase 控制台发送的通知能够绕过 android 后台任务限制? - 反应原生火力基地 -的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从 firebase 控制台发送 firebase 网络推送通知

Flutter Cloud Messaging:如何从应用程序发送通知(而不是从 Firebase 控制台)

如何从 C# 发送 FireBase 自定义推送通知?

您如何向从应用程序本身订阅主题的用户发送 Firebase 推送通知

从 REST API 发送时,Firebase 推送通知在后台不起作用

如何向 ios 应用程序发送 Firebase 推送通知