使用Expo从冷启动(应用程序被杀死)中读取推送通知

4

我有一个独立的Expo应用程序,并从我的服务器发送推送通知。我在我的App.js componentDidMount中有一个通知监听器,如下所示。

componentDidMount = () => {
  this._notificationSubscription = Notifications.addListener(this._handleNotification);
}

处理程序在我的应用程序前台或后台运行时被调用。 但是,当我的应用程序未运行(甚至不在后台运行),并且通知被传递时,在点击通知后,应用程序会打开,但处理程序不会被调用。 看起来,监听器注册“太晚了”。 我的通知有一个有用的有效负载,我想在应用程序中使用它,但除非应用程序运行,否则在这种“冷启动”情况下就会丢失。 是否有一种方法在冷启动时保留此通知数据并调用此侦听器?

你是否使用了自定义的“main”组件?如果是这样,你是否使用了registerRootComponent? 当你从通知中打开应用时,请尝试检查根组件中是否存在props.exp.notification - brentvatne
不要使用registerRootComponent(我认为不再需要)。我确实检查了根组件上的props.exp.notification,但在应用程序通过通知打开时,根组件上未定义。 - rnk
3个回答

3
在 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);


Expo现在只有在应用程序被杀死时没有任何监听器。 在此输入图片描述

使用这个,但是无论如何都不起作用,你在使用dev-client吗?我已经尝试在managed-workflow和expo-go中了。 - plus

0

目前使用Expo无法从“冷启动”读取推送通知。


推送通知在编程中是令人惊讶地难以处理的。

您的应用程序可能处于3种不同的状态之一,除此之外,用户可以选择在这些状态中的任何一个中与接收到的推送通知进行交互或者不进行交互:

  1. 前台 - 您的应用程序正在打开并且当前在用户的屏幕上显示。
  2. 后台 - 您的应用程序正在打开但被隐藏或设备已锁定。
  3. "已杀死" - 您的应用程序完全未打开或在后台运行并且已有一段时间未被使用。

Expo 处理以下内容:

              Foreground    Background   Killed
-------------------------------------------------
   Received    ✅ Yes        ❌ No        ❌ No
 Interacted    ✅ Yes        ✅ Yes       ❌ No

关于Expo SDK 38,有一个未解决的问题,请参见此处: https://github.com/expo/expo/issues/6943

如果Expo团队找到了解决方法或修复了这个问题,我会尽力保持这个答案最新。


已在SDK 42中解决。请参考@haibert的答案。 - Slbox

-1

看起来在Expo 38升级之后,至少现在它是一致的。

  1. 如果通知在应用程序处于后台时触发,则会立即显示,但应用程序不会收到此通知。

  2. 如果通知在应用程序处于前台时触发,则应用程序不仅会立即收到有关此通知的信息,而且还可以在运行时决定是否显示弹出警报或播放声音!(有关更多信息,请参见Notification Handler文档。)


1
不幸的是,这并没有回答问题。他们在博客文章中写的例子 - 就是你引用的那些 - 都是关于应用程序处于活动状态时接收推送通知的。他们没有涉及“冷启动”通知。 - Labu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接