我有一个Expo独立应用程序,我正在从服务器发送推送通知。像这样,我的App.js componentDidMount中有一个通知侦听器。
componentDidMount = () => {
this._notificationSubscription = Notifications.addListener(this._handleNotification);
}
当我的应用程序在前台或后台运行时,将调用处理程序。
但是,当我的应用程序未运行(甚至不在后台)并且传递了通知时,在点击通知时,应用程序会打开,但不会调用处理程序。
在我看来,听众注册“太迟了”。
我的通知有一个有用的有效负载,我想在应用程序中使用它,但是除非应用程序正在运行,否则在这种“冷启动”情况下它将丢失。
是否可以在冷启动时保留此通知数据并调用此侦听器?
答案 0 :(得分:0)
推送通知非常难以使用。
您的应用可以处于3种不同的状态,最重要的是,用户可以选择-或不 –在以下任何状态下与收到的推送通知进行交互:>
Expo处理以下内容:
Foreground Background Killed
-------------------------------------------------
Received ✅ Yes ❌ No ❌ No
Interacted ✅ Yes ✅ Yes ❌ No
Expo SDK 38的一个公开问题在这里:https://github.com/expo/expo/issues/6943
如果世博团队发现了解决方法或解决了此问题,我会尽力使此答案保持最新。
答案 1 :(得分:0)
在 expo SDK 42 中,这是我们在应用程序处于后台时收到通知时运行任务的方式。
import * as TaskManager from 'expo-task-manager';
import * as Notifications from 'expo-notifications';
const BACKGROUND_NOTIFICATION_TASK = 'BACKGROUND-NOTIFICATION-TASK';
TaskManager.defineTask(BACKGROUND_NOTIFICATION_TASK, ({ data, error, executionInfo }) => {
console.log('Received a notification in the background!');
// Do something with the notification data
});
Notifications.registerTaskAsync(BACKGROUND_NOTIFICATION_TASK);
答案 2 :(得分:-1)
似乎Expo 38 upgrade之后至少现在是一致的。
如果在后台运行时触发了通知, 立即呈现 该应用程序未获悉
如果在应用程序处于前台状态时触发了通知, 该应用程序不仅会立即收到有关此信息,而且… 它也可以在运行时决定是显示警告提示还是播放声音! (有关更多信息,请参见通知处理程序文档。)