为啥从 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 控制台)
您如何向从应用程序本身订阅主题的用户发送 Firebase 推送通知