一个库,提供 API 来获取推送通知令牌并渲染、安排、接收和响应通知。
expo-notifications
提供了一个 API 来获取推送通知令牌并渲染、安排、接收和响应通知。
¥expo-notifications
provides an API to fetch push notification tokens and to present, schedule, receive and respond to notifications.
不要遗漏我们关于如何设置、发送和处理推送通知的指南。
从 SDK 53 开始,expo-notifications
提供的推送通知(远程通知)功能将在 Expo Go 中不可用。需要 开发构建 才能使用推送通知。本地通知(应用内通知)将在 Expo Go 中保持可用。
¥Features
安排在特定日期或从现在起的某个时间发出一次性通知
¥Schedule a one-off notification for a specific date or some time from now
安排通知在某个时间间隔内重复(或 iOS 上的日历日期匹配)
¥Schedule a notification repeating in some time interval (or a calendar date match on iOS)
获取和设置应用徽章图标编号
¥Get and set the application badge icon number
获取原生设备推送令牌,以便你可以使用 FCM(适用于 Android)和 APNs(适用于 iOS)发送推送通知
¥Obtain a native device push token, so you can send push notifications with FCM (for Android) and APNs (for iOS)
获取 Expo 推送令牌,以便你可以使用 Expo 推送服务 发送推送通知
¥Obtain an Expo push token, so you can send push notifications with Expo Push Service
在前台和后台收听传入的通知
¥Listen to incoming notifications in the foreground and background
聆听与通知的交互
¥Listen to interactions with notifications
当应用位于前台时处理通知
¥Handle notifications when the app is in the foreground
强制关闭通知中心/托盘中的通知
¥Imperatively dismiss notifications from Notification Center/tray
创建、更新和删除 Android 通知渠道
¥Create, update, and delete Android notification channels
在 Android 上设置通知的自定义图标和颜色
¥Set custom icon and color for notifications on Android
¥Installation
-
npx expo install expo-notifications
If you are installing this in an existing React Native app, start by installing expo
in your project. Then, follow the additional instructions as mentioned by the library's README under "Installation in bare React Native projects" section.
¥Usage
查看下面的示例 Snack 以了解通知的实际效果,请确保使用物理设备进行测试。推送通知不适用于模拟器/模拟器。
¥Check out the example Snack below to see Notifications in action, make sure to use a physical device to test it. Push notifications don't work on emulators/simulators.
import { useState, useEffect, useRef } from 'react';
import { Text, View, Button, Platform } from 'react-native';
import * as Device from 'expo-device';
import * as Notifications from 'expo-notifications';
import Constants from 'expo-constants';
Notifications.setNotificationHandler({
handleNotification: async () => ({
shouldShowAlert: true,
shouldPlaySound: false,
shouldSetBadge: false,
}),
});
export default function App() {
const [expoPushToken, setExpoPushToken] = useState('');
const [channels, setChannels] = useState<Notifications.NotificationChannel[]>([]);
const [notification, setNotification] = useState<Notifications.Notification | undefined>(
undefined
);
const notificationListener = useRef<Notifications.EventSubscription>();
const responseListener = useRef<Notifications.EventSubscription>();
useEffect(() => {
registerForPushNotificationsAsync().then(token => token && setExpoPushToken(token));
if (Platform.OS === 'android') {
Notifications.getNotificationChannelsAsync().then(value => setChannels(value ?? []));
}
notificationListener.current = Notifications.addNotificationReceivedListener(notification => {
setNotification(notification);
});
responseListener.current = Notifications.addNotificationResponseReceivedListener(response => {
console.log(response);
});
return () => {
notificationListener.current &&
Notifications.removeNotificationSubscription(notificationListener.current);
responseListener.current &&
Notifications.removeNotificationSubscription(responseListener.current);
};
}, []);
return (
<View
style={{
flex: 1,
alignItems: 'center',
justifyContent: 'space-around',
}}>
<Text>Your expo push token: {expoPushToken}</Text>
<Text>{`Channels: ${JSON.stringify(
channels.map(c => c.id),
null,
2
)}`}</Text>
<View style={{ alignItems: 'center', justifyContent: 'center' }}>
<Text>Title: {notification && notification.request.content.title} </Text>
<Text>Body: {notification && notification.request.content.body}</Text>
<Text>Data: {notification && JSON.stringify(notification.request.content.data)}</Text>
</View>
<Button
title="Press to schedule a notification"
onPress={async () => {
await schedulePushNotification();
}}
/>
</View>
);
}
async function schedulePushNotification() {
await Notifications.scheduleNotificationAsync({
content: {
title: "You've got mail! 📬",
body: 'Here is the notification body',
data: { data: 'goes here', test: { test1: 'more data' } },
},
trigger: {
type: SchedulableTriggerInputTypes.TIME_INTERVAL,
seconds: 2,
},
});
}
async function registerForPushNotificationsAsync() {
let token;
if (Platform.OS === 'android') {
await Notifications.setNotificationChannelAsync('myNotificationChannel', {
name: 'A channel is needed for the permissions prompt to appear',
importance: Notifications.AndroidImportance.MAX,
vibrationPattern: [0, 250, 250, 250],
lightColor: '#FF231F7C',
});
}
if (Device.isDevice) {
const { status: existingStatus } = await Notifications.getPermissionsAsync();
let finalStatus = existingStatus;
if (existingStatus !== 'granted') {
const { status } = await Notifications.requestPermissionsAsync();
finalStatus = status;
}
if (finalStatus !== 'granted') {
alert('Failed to get push token for push notification!');
return;
}
// Learn more about projectId:
// https://expo.nodejs.cn/push-notifications/push-notifications-setup/#configure-projectid
// EAS projectId is used here.
try {
const projectId =
Constants?.expoConfig?.extra?.eas?.projectId ?? Constants?.easConfig?.projectId;
if (!projectId) {
throw new Error('Project ID not found');
}
token = (
await Notifications.getExpoPushTokenAsync({
projectId,
})
).data;
console.log(token);
} catch (e) {
token = `${e}`;
}
} else {
alert('Must use physical device for Push Notifications');
}
return token;
}
¥Present a local (in-app) notification to the user
import * as Notifications from 'expo-notifications';
// First, set the handler that will cause the notification
// to show the alert
Notifications.setNotificationHandler({
handleNotification: async () => ({
shouldShowAlert: true,
shouldPlaySound: false,
shouldSetBadge: false,
}),
});
// Second, call scheduleNotificationAsync()
Notifications.scheduleNotificationAsync({
content: {
title: 'Look at that notification',
body: "I'm so proud of myself!",
},
trigger: null,
});
¥Handle push notifications with navigation
如果你想在收到推送通知时深层链接到应用中的特定屏幕,你可以配置 Expo 的任一导航系统来执行此操作。
¥If you'd like to deep link to a specific screen in your app when you receive a push notification, you can configure either of Expo's navigation systems to do that.
你可以使用 Expo Router 的 内置深度链接 来处理来自推送通知的传入 URL。只需配置根布局即可监听传入和初始通知事件。
¥You can use Expo Router's built-in deep linking to handle incoming URLs from push notifications. Simply configure the root layout to listen for incoming and initial notification events.
import { useEffect } from 'react';
import * as Notifications from 'expo-notifications';
import { router } from 'expo-router';
function useNotificationObserver() {
useEffect(() => {
let isMounted = true;
function redirect(notification: Notifications.Notification) {
const url = notification.request.content.data?.url;
if (url) {
router.push(url);
}
}
Notifications.getLastNotificationResponseAsync()
.then(response => {
if (!isMounted || !response?.notification) {
return;
}
redirect(response?.notification);
});
const subscription = Notifications.addNotificationResponseReceivedListener(response => {
redirect(response.notification);
});
return () => {
isMounted = false;
subscription.remove();
};
}, []);
}
export default function Layout() {
useNotificationObserver();
return <Slot />;
}
React Navigation 的手册 链接配置 可以配置为处理来自推送通知的传入重定向:
¥React Navigation's manual linking configuration can be configured to handle incoming redirects from push notifications:
import React from 'react';
import { Linking } from 'react-native';
import * as Notifications from 'expo-notifications';
import { NavigationContainer } from '@react-navigation/native';
export default function App() {
return (
<NavigationContainer
linking={{
config: {
// Configuration for linking
},
async getInitialURL() {
// First, you may want to do the default deep link handling
// Check if app was opened from a deep link
const url = await Linking.getInitialURL();
if (url != null) {
return url;
}
// Handle URL from expo push notifications
const response = await Notifications.getLastNotificationResponseAsync();
return response?.notification.request.content.data.url;
},
subscribe(listener) {
const onReceiveURL = ({ url }: { url: string }) => listener(url);
// Listen to incoming links from deep linking
const eventListenerSubscription = Linking.addEventListener('url', onReceiveURL);
// Listen to expo push notifications
const subscription = Notifications.addNotificationResponseReceivedListener(response => {
const url = response.notification.request.content.data.url;
// Any custom logic to see whether the URL needs to be handled
//...
// Let React Navigation handle the URL
listener(url);
});
return () => {
// Clean up the event listeners
eventListenerSubscription.remove();
subscription.remove();
};
},
}}>
{/* Your app content */}
</NavigationContainer>
);
}
请参阅 React 导航文档 的更多详细信息。
¥See more details on React Navigation documentation.
¥Configuration
¥Credentials
¥Android
所有 Android 应用都需要 Firebase Cloud Messaging 凭据才能在应用中接收推送通知(在 Expo Go 中进行测试时除外)。有关更多信息,请参阅如何为你的应用获取 FCM 资质。
¥Firebase Cloud Messaging credentials are required for all Android apps to receive push notifications in your app (except when testing in Expo Go). For more information, see how to get FCM credentials for your app.
¥iOS
要注册你的 iOS 设备并自动为你的 EAS 版本启用推送通知,请参阅 推送通知设置。
¥To register your iOS device and automatically enable push notifications for your EAS Build, see push notification setup.
¥App config
要配置 expo-notifications
,请在 EAS 构建 或 npx expo run:[android|ios]
的应用配置(app.json 或 app.config.js)中使用内置 配置插件。该插件允许你配置以下无法在运行时设置并需要构建新的应用二进制文件才能生效的属性:
¥To configure expo-notifications
, use the built-in config plugin in the app config (app.json or app.config.js) for EAS Build or with npx expo run:[android|ios]
. The plugin allows you to configure the following properties that cannot be set at runtime and require building a new app binary to take effect:
Name | Default | Description |
---|---|---|
icon | - | Only for: Android Local path to an image to use as the icon for push notifications. 96x96 all-white png with transparency. |
color | #ffffff | Only for: Android Tint color for the push notification image when it appears in the notification tray. |
defaultChannel | - | Only for: Android Default channel for FCMv1 notifications. |
sounds | - | Array of local paths to sound files (.wav recommended) that can be used as custom notification sounds. Sound will not be played when focus mode does not permit it or silent mode is on. |
enableBackgroundRemoteNotifications | false | Only for: iOS Whether to enable background remote notifications, as described in Apple documentation. This updates the |
以下是在应用配置文件中使用配置插件的示例:
¥Here is an example of using the config plugin in the app config file:
{
"expo": {
"plugins": [
[
"expo-notifications",
{
"icon": "./local/assets/notification_icon.png",
"color": "#ffffff",
"defaultChannel": "default",
"sounds": [
"./local/assets/notification_sound.wav",
"./local/assets/notification_sound_other.wav"
],
"enableBackgroundRemoteNotifications": false
}
]
]
}
}
iOS APNs 权利始终设置为 'development'。Xcode 在存档期间自动将其更改为 'production'。了解更多。
¥The iOS APNs entitlement is always set to 'development'. Xcode automatically changes this to 'production' during the archive. Learn more.
了解如何在 expo-notifications
存储库中的安装说明 文件中配置原生项目。
¥Learn how to configure the native projects in the installation instructions in the expo-notifications
repository.
¥Permissions
¥Android
在 Android 上,此模块需要订阅设备启动的权限。它用于在设备(重新)启动时设置预定的通知。RECEIVE_BOOT_COMPLETED
权限通过库的 AndroidManifest.xml 自动添加。
¥On Android, this module requires permission to subscribe to the device boot. It's used to set up scheduled notifications when the device (re)starts.
The RECEIVE_BOOT_COMPLETED
permission is added automatically through the library's AndroidManifest.xml.
从 Android 12(API 级别 31)开始,要安排在准确时间触发的通知,你需要将 <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
添加到 AndroidManifest.xml。阅读有关 准确的报警权限 的更多信息。
¥Starting from Android 12 (API level 31), to schedule a notification that triggers at an exact time, you need to add
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
to AndroidManifest.xml.
Read more about the exact alarm permission.
在 Android 13 上,应用用户必须选择通过操作系统自动触发的权限提示来接收通知。至少创建一个通知通道后,才会出现此提示。必须在 getDevicePushTokenAsync
或 getExpoPushTokenAsync
之前调用 setNotificationChannelAsync
才能获取推送令牌。你可以在 官方文档 中详细了解 Android 13 的新通知权限行为。
¥On Android 13, app users must opt-in to receive notifications via a permissions prompt automatically triggered by the operating system.
This prompt will not appear until at least one notification channel is created. The setNotificationChannelAsync
must be called before
getDevicePushTokenAsync
or getExpoPushTokenAsync
to obtain a push token. You can read more about the new notification permission behavior for Android 13
in the official documentation.
Android Permission | Description |
---|---|
Allows an application to receive the Intent.ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting.
| |
Allows applications to use exact alarm APIs. |
¥iOS
无需使用说明,参见 通知相关权限。
¥No usage description is required, see notification-related permissions.
¥Interpret the iOS permissions response
在 iOS 上,发送通知的权限比 Android 上的更细化。这就是你应该依赖 NotificationPermissionsStatus
的 ios.status
字段而不是根 status
字段的原因。
¥On iOS, permissions for sending notifications are a little more granular than they are on Android. This is why you should rely on the NotificationPermissionsStatus
's ios.status
field, instead of the root status
field.
该值将是以下值之一,可在 Notifications.IosAuthorizationStatus
下访问:
¥This value will be one of the following, accessible under Notifications.IosAuthorizationStatus
:
NOT_DETERMINED
:用户尚未选择是否允许应用安排通知
¥NOT_DETERMINED
: The user hasn't yet made a choice about whether the app is allowed to schedule notifications
DENIED
:该应用无权安排或接收通知
¥DENIED
: The app isn't authorized to schedule or receive notifications
AUTHORIZED
:该应用被授权安排或接收通知
¥AUTHORIZED
: The app is authorized to schedule or receive notifications
PROVISIONAL
:该应用被临时授权发布非中断性用户通知
¥PROVISIONAL
: The app is provisionally authorized to post noninterruptive user notifications
EPHEMERAL
:该应用被授权在有限的时间内安排或接收通知
¥EPHEMERAL
: The app is authorized to schedule or receive notifications for a limited amount of time
¥Notification events listeners
通知事件包括传入通知、用户与通知执行的交互(这可以是点击通知,或通过 通知类别 与其交互),以及通知可能被删除的极少数情况。
¥Notification events include incoming notifications, interactions your users perform with notifications (this can be tapping on a notification, or interacting with it via notification categories), and rare occasions when your notifications may be dropped.
推送通知行为 部分公开并记录了几个监听器。
¥Several listeners are exposed and documented in the Push notification behaviors section.
¥Headless (Background) notifications
请参阅 你需要了解的内容 指南中的无头背景通知的 definition。
¥See the definition of Headless Background Notifications in the What you need to know guide.
要在应用处于后台或未运行时处理通知,你需要执行以下操作:
¥To handle notifications while the app is in the background or not running, you need to do the following:
将 expo-task-manager
包添加到你的项目。
¥Add expo-task-manager
package to your project.
在你的应用代码中,设置一个 后台任务 在收到通知时运行。
¥In your application code, set up a background task to run when the notification is received.
你必须使用 开发构建 来使用后台通知,因为 Expo Go 不支持它们。
¥You must use a development build to use background notifications since they are not supported in Expo Go.
然后发送推送通知:
¥Then send a push notification which:
仅包含 data
键(无 title
、body
)
¥Contains only the data
key (no title
, body
)
已为 iOS 设置 _contentAvailable: true
— 请参阅 Expo 推送通知服务有效负载格式
¥Has _contentAvailable: true
set for iOS — see the Expo push notification service payload format
¥Background notification configuration
为了能够在 iOS 上使用后台推送通知,remote-notification
值需要存在于应用的 Info.plist 文件中的 UIBackgroundModes
数组中。
¥To be able to use background push notifications on iOS, the remote-notification
value needs to be present in the UIBackgroundModes
array in your app's Info.plist file.
如果你使用 CNG,请将配置插件的 enableBackgroundRemoteNotifications
属性 设置为 true,正确的配置将由预构建自动应用。
¥If you're using CNG, set the enableBackgroundRemoteNotifications
property of the config plugin to true, and the correct configuration will be applied automatically by prebuild.
如果你没有使用持续原生生成 (CNG) 或你正在使用原生 iOS 项目,那么你需要将以下内容添加到你的 Expo.plist 文件中:
¥If you're not using Continuous Native Generation (CNG) or you're using a native iOS project, then you'll need to add the following to your Expo.plist file:
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
</key>
¥Additional information
¥Set custom notification sounds
要将自定义推送通知声音添加到你的应用,请将 expo-notifications
插件添加到你的 app.json 文件,然后在 sounds
键下,提供可用作自定义通知声音的声音文件的本地路径数组。这些本地路径是你项目的本地路径。
¥To add custom push notification sounds to your app, add the expo-notifications
plugin to your app.json file and then under the sounds
key, provide an array of local paths to sound files that can be used as custom notification sounds. These local paths are local to your project.
{
"expo": {
"plugins": [
[
"expo-notifications",
{
"sounds": ["local/path/to/mySoundFile.wav"]
}
]
]
}
}
构建应用后,文件数组将可在 NotificationContentInput
和 NotificationChannelInput
中使用。你只需提供基本文件名。这是使用上面配置的示例:
¥After building your app, the array of files will be available for use in both NotificationContentInput
and NotificationChannelInput
.
You only need to provide the base filename. Here's an example using the config above:
await Notifications.setNotificationChannelAsync('new_emails', {
name: 'E-mail notifications',
importance: Notifications.AndroidImportance.HIGH,
sound: 'mySoundFile.wav', // Provide ONLY the base filename
});
await Notifications.scheduleNotificationAsync({
content: {
title: "You've got mail! 📬",
sound: 'mySoundFile.wav', // Provide ONLY the base filename
},
trigger: {
seconds: 2,
channelId: 'new_emails',
},
});
如果你愿意,还可以手动将通知文件添加到 Android 和 iOS 项目中:
¥You can also manually add notification files to your Android and iOS projects if you prefer:
在 Android 8.0+ 上,播放通知的自定义声音需要的不仅仅是在 NotificationContentInput
上设置 sound
属性。你还需要使用适当的 sound
配置 NotificationChannel
,并在发送/安排通知时使用它。
¥On Androids 8.0+, playing a custom sound for a notification requires more than setting the sound
property on the NotificationContentInput
.
You will also need to configure the NotificationChannel
with the appropriate sound
, and use it when sending/scheduling the notification.
要使下面的示例正常工作,你需要将 email_sound.wav 文件放在 android/app/src/main/res/raw/ 中。
¥For the example below to work, you would place your email_sound.wav file in android/app/src/main/res/raw/.
// Prepare the notification channel
await Notifications.setNotificationChannelAsync('new_emails', {
name: 'E-mail notifications',
importance: Notifications.AndroidImportance.HIGH,
sound: 'email_sound.wav', // <- for Android 8.0+, see channelId property below
});
// Eg. schedule the notification
await Notifications.scheduleNotificationAsync({
content: {
title: "You've got mail! 📬",
body: 'Open the notification to read them all',
sound: 'email_sound.wav', // <- for Android below 8.0
},
trigger: {
seconds: 2,
channelId: 'new_emails', // <- for Android 8.0+, see definition above
},
});
在 iOS 上,所需要做的就是将声音文件放入 Xcode 项目中(请参见下面的屏幕截图),然后在 NotificationContentInput
中指定声音文件,如下所示:
¥On iOS, all that's needed is to place your sound file in your Xcode project (see the screenshot below),
and then specify the sound file in your NotificationContentInput
, like this:
await Notifications.scheduleNotificationAsync({
content: {
title: "You've got mail! 📬",
body: 'Open the notification to read them all',
sound: 'notification.wav',
},
trigger: {
// ...
},
});
¥Push notification payload specification
参见 消息请求格式。
¥See Message request format.
¥Manage notification categories for interactive notifications
通知类别允许你创建交互式推送通知,以便用户可以通过按钮或文本响应直接响应传入的通知。类别定义用户可以执行的一组操作,然后通过在 NotificationContent
中指定 categoryIdentifier
将这些操作应用于通知。
¥Notification categories allow you to create interactive push notifications, so that a user can respond directly to the incoming notification
either via buttons or a text response. A category defines the set of actions a user can take, and then those actions are applied to a notification
by specifying the categoryIdentifier
in the NotificationContent
.
在 iOS 上,通知类别还允许你进一步自定义通知。对于每个类别,你不仅可以设置用户可以执行的交互操作,还可以配置诸如当用户禁用应用的通知预览时显示的占位符文本之类的内容。
¥On iOS, notification categories also allow you to customize your notifications further. With each category, not only can you set interactive actions a user can take, but you can also configure things like the placeholder text to display when the user disables notification previews for your app.
¥Platform-specific guides
¥Handling notification channels
从 Android 8.0(API 级别 26)开始,所有通知都必须分配给一个通道。对于每个通道,你可以设置应用于该通道中所有通知的视觉和听觉行为。然后,用户可以更改这些设置并决定应用中的哪些通知渠道应该是侵入性的或完全可见的,如 Android 开发者文档 所述。
¥Starting in Android 8.0 (API level 26), all notifications must be assigned to a channel. For each channel, you can set the visual and auditory behavior that is applied to all notifications in that channel. Then, users can change these settings and decide which notification channels from your app should be intrusive or visible at all, as Android developer docs states.
如果你不指定通知渠道,expo-notifications
将为你创建一个后备渠道,名为 Miscellaneous。我们鼓励你始终确保为应用设置具有信息名称的适当渠道,并始终向这些渠道发送通知。
¥If you do not specify a notification channel, expo-notifications
will create a fallback channel for you, named Miscellaneous.
We encourage you to always ensure appropriate channels with informative names are set up for the application and to always send notifications to these channels.
对于不支持此功能的平台(Android 版本 8.0 (26) 以下和 iOS),调用这些方法是无操作的。
¥Calling these methods is a no-op for platforms that do not support this feature (Android below version 8.0 (26) and iOS).
¥Custom notification icon and colors
如果你使用 Expo 预建 或使用 直接 expo-notifications
配置插件,则可以在项目的 app.json 中配置 notification.icon
和 notification.color
键。这些是构建时设置,因此你需要使用 eas build -p android
或 npx expo run:android
重新编译原生 Android 应用才能看到更改。
¥You can configure the notification.icon
and notification.color
keys in the project's app.json if you are using Expo Prebuild or by using the expo-notifications
config plugin directly. These are build-time settings, so you'll need to recompile your native Android app with eas build -p android
or npx expo run:android
to see the changes.
对于你的通知图标,请确保遵循 Google 的设计指南(图标必须是全白透明背景),否则可能无法按预期显示。
¥For your notification icon, make sure you follow Google's design guidelines (the icon must be all white with a transparent background) or else it may not be displayed as intended.
你还可以直接在 NotificationContentInput
中的 color
属性下设置每个通知的自定义通知颜色。
¥You can also set a custom notification color per-notification directly in your NotificationContentInput
under the color
attribute.
import * as Notifications from 'expo-notifications';
Parameter | Type | Description |
---|---|---|
listener | PushTokenListener | A function accepting a push token as an argument, it will be called whenever the push token changes. |
In rare situations, a push token may be changed by the push notification service while the app is running. When a token is rolled, the old one becomes invalid and sending notifications to it will fail. A push token listener will let you handle this situation gracefully by registering the new token with your backend right away.
EventSubscription
An EventSubscription
object represents the subscription of the provided listener.
Example
import React from 'react';
import * as Notifications from 'expo-notifications';
import { registerDevicePushTokenAsync } from '../api';
export default function App() {
React.useEffect(() => {
const subscription = Notifications.addPushTokenListener(registerDevicePushTokenAsync);
return () => subscription.remove();
}, []);
return (
// Your app content
);
}
Returns a native FCM, APNs token or a PushSubscription
data
that can be used with another push notification service.
Promise<DevicePushToken>
Parameter | Type | Description |
---|---|---|
options(optional) | ExpoPushTokenOptions | Object allowing you to pass in push notification configuration. Default: {} |
Returns an Expo token that can be used to send a push notification to the device using Expo's push notifications service.
This method makes requests to the Expo's servers. It can get rejected in cases where the request itself fails
(for example, due to the device being offline, experiencing a network timeout, or other HTTPS request failures).
To provide offline support to your users, you should try/catch
this method and implement retry logic to attempt
to get the push token later, once the device is back online.
For Expo's backend to be able to send notifications to your app, you will need to provide it with push notification keys. For more information, see credentials in the push notifications setup.
Promise<ExpoPushToken>
Returns a Promise
that resolves to an object representing acquired push token.
Example
import * as Notifications from 'expo-notifications';
export async function registerForPushNotificationsAsync(userId: string) {
const expoPushToken = await Notifications.getExpoPushTokenAsync({
projectId: 'your-project-id',
});
await fetch('https://example.com/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
userId,
expoPushToken,
}),
});
}
Parameter | Type | Description |
---|---|---|
subscription | EventSubscription | A subscription returned by |
Removes a push token subscription returned by an addPushTokenListener
call.
void
Parameter | Type | Description |
---|---|---|
listener | (event: Notification) => void | A function accepting a notification ( |
Listeners registered by this method will be called whenever a notification is received while the app is running.
EventSubscription
An EventSubscription
object represents the subscription of the provided listener.
Example
import React from 'react';
import * as Notifications from 'expo-notifications';
export default function App() {
React.useEffect(() => {
const subscription = Notifications.addNotificationReceivedListener(notification => {
console.log(notification);
});
return () => subscription.remove();
}, []);
return (
// Your app content
);
}
Parameter | Type | Description |
---|---|---|
listener | (event: NotificationResponse) => void | A function accepting notification response ( |
Listeners registered by this method will be called whenever a user interacts with a notification (for example, taps on it).
EventSubscription
An EventSubscription
object represents the subscription of the provided listener.
Example
import React from 'react';
import { Linking } from 'react-native';
import * as Notifications from 'expo-notifications';
export default function Container() {
React.useEffect(() => {
const subscription = Notifications.addNotificationResponseReceivedListener(response => {
const url = response.notification.request.content.data.url;
Linking.openURL(url);
});
return () => subscription.remove();
}, []);
return (
// Your app content
);
}
Parameter | Type | Description |
---|---|---|
listener | () => void | A callback function. |
Listeners registered by this method will be called whenever some notifications have been dropped by the server.
Applicable only to Firebase Cloud Messaging which we use as a notifications service on Android. It corresponds to onDeletedMessages()
callback.
More information can be found in Firebase docs.
EventSubscription
An EventSubscription
object represents the subscription of the provided listener.
Parameter | Type | Description |
---|---|---|
subscription | EventSubscription | A subscription returned by |
Removes a notification subscription returned by an addNotificationListener
call.
void
A React hook which returns the notification response that was received most recently (a notification response designates an interaction with a notification, such as tapping on it).
To clear the last notification response, use clearLastNotificationResponseAsync()
.
If you don't want to use a hook, you can use
Notifications.getLastNotificationResponseAsync()
instead.
MaybeNotificationResponse
The hook may return one of these three types/values:
undefined
- until we're sure of what to return,null
- if no notification response has been received yet,NotificationResponse
object - if a notification response was received.Example
Responding to a notification tap by opening a URL that could be put into the notification's data
(opening the URL is your responsibility and is not a part of the expo-notifications
API):
import * as Notifications from 'expo-notifications';
import { Linking } from 'react-native';
export default function App() {
const lastNotificationResponse = Notifications.useLastNotificationResponse();
React.useEffect(() => {
if (
lastNotificationResponse &&
lastNotificationResponse.notification.request.content.data.url &&
lastNotificationResponse.actionIdentifier === Notifications.DEFAULT_ACTION_IDENTIFIER
) {
Linking.openURL(lastNotificationResponse.notification.request.content.data.url);
}
}, [lastNotificationResponse]);
return (
// Your app content
);
}
Parameter | Type | Description |
---|---|---|
handler | null | NotificationHandler | A single parameter which should be either |
When a notification is received while the app is running, using this function you can set a callback that will decide whether the notification should be shown to the user or not.
When a notification is received, handleNotification
is called with the incoming notification as an argument.
The function should respond with a behavior object within 3 seconds, otherwise, the notification will be discarded.
If the notification is handled successfully, handleSuccess
is called with the identifier of the notification,
otherwise (or on timeout) handleError
will be called.
The default behavior when the handler is not set or does not respond in time is not to show the notification.
void
Example
import * as Notifications from 'expo-notifications';
Notifications.setNotificationHandler({
handleNotification: async () => ({
shouldShowAlert: true,
shouldPlaySound: false,
shouldSetBadge: false,
}),
});
Parameter | Type | Description |
---|---|---|
taskName | string | The string you passed to |
Call registerTaskAsync
to set a callback (task) that will run in response to when a notification is received while the app is in foreground, background, or terminated.
When app is terminated, only a data message (Android) / background notification (iOS) triggers the task execution.
However, the OS may decide not to deliver the notification to your app in some cases (e.g. when the device is in Doze mode on Android, or when you send too many notifications - Apple recommends to not "send more than two or three per hour").
Under the hood, this function is run using expo-task-manager
. You must define the task first, with TaskManager.defineTask
and register it with registerTaskAsync
.
Make sure you define and register the task in the module scope of a JS module which is required early by your app (e.g. in the index.js
file).
expo-task-manager
loads your app's JS bundle in the background and executes the task, as well as any side effects which may happen as a consequence of requiring any JS modules.
The callback function you define with TaskManager.defineTask
receives an object with the following fields:
data
: The remote payload delivered by either FCM (Android) or APNs (iOS). See PushNotificationTrigger
for details.error
: The error (if any) that occurred during execution of the task.executionInfo
: JSON object of additional info related to the task, including the taskName
.Promise<null>
Example
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);
Parameter | Type | Description |
---|---|---|
taskName | string | The string you passed to |
Used to unregister tasks registered with registerTaskAsync
method.
Promise<null>
Calling this function checks current permissions settings related to notifications. It lets you verify whether the app is currently allowed to display alerts, play sounds, etc. There is no user-facing effect of calling this.
Promise<NotificationPermissionsStatus>
It returns a Promise
resolving to an object represents permission settings (NotificationPermissionsStatus
).
On iOS, make sure you properly interpret the permissions response.
Example
import * as Notifications from 'expo-notifications';
export async function allowsNotificationsAsync() {
const settings = await Notifications.getPermissionsAsync();
return (
settings.granted || settings.ios?.status === Notifications.IosAuthorizationStatus.PROVISIONAL
);
}
Parameter | Type | Description |
---|---|---|
permissions(optional) | NotificationPermissionsRequest | An object representing configuration for the request scope. |
Prompts the user for notification permissions according to request. Request defaults to asking the user to allow displaying alerts, setting badge count and playing sounds.
Promise<NotificationPermissionsStatus>
It returns a Promise resolving to an object represents permission settings (NotificationPermissionsStatus
).
On iOS, make sure you properly interpret the permissions response.
Example
import * as Notifications from 'expo-notifications';
export function requestPermissionsAsync() {
return await Notifications.requestPermissionsAsync({
ios: {
allowAlert: true,
allowBadge: true,
allowSound: true,
},
});
}
Fetches the number currently set as the badge of the app icon on device's home screen. A 0
value means that the badge is not displayed.
Note: Not all Android launchers support application badges. If the launcher does not support icon badges, the method will always resolve to
0
.
Promise<number>
Returns a Promise resolving to a number that represents the current badge of the app icon.
Parameter | Type | Description |
---|---|---|
badgeCount | number | The count which should appear on the badge. A value of |
options(optional) | SetBadgeCountOptions | An object of options configuring behavior applied. |
Sets the badge of the app's icon to the specified number. Setting it to 0
clears the badge. On iOS, this method requires that you have requested
the user's permission for allowBadge
via requestPermissionsAsync
,
otherwise it will automatically return false
.
Note: Not all Android launchers support application badges. If the launcher does not support icon badges, the method will resolve to
false
.
Promise<boolean>
It returns a Promise resolving to a boolean representing whether the setting of the badge succeeded.
Cancels all scheduled notifications.
Promise<void>
A Promise that resolves once all the scheduled notifications are successfully canceled, or if there are no scheduled notifications.
Parameter | Type | Description |
---|---|---|
identifier | string | The notification identifier with which |
Cancels a single scheduled notification. The scheduled notification of given ID will not trigger.
Promise<void>
A Promise resolves once the scheduled notification is successfully canceled or if there is no scheduled notification for a given identifier.
Example
import * as Notifications from 'expo-notifications';
async function scheduleAndCancel() {
const identifier = await Notifications.scheduleNotificationAsync({
content: {
title: 'Hey!',
},
trigger: { seconds: 60, repeats: true },
});
await Notifications.cancelScheduledNotificationAsync(identifier);
}
Fetches information about all scheduled notifications.
Promise<NotificationRequest[]>
Returns a Promise resolving to an array of objects conforming to the Notification
interface.
Parameter | Type | Description |
---|---|---|
trigger | SchedulableNotificationTriggerInput | The schedulable notification trigger you would like to check next trigger date for (of type |
Allows you to check what will be the next trigger date for given notification trigger input.
Promise<number | null>
If the return value is null
, the notification won't be triggered. Otherwise, the return value is the Unix timestamp in milliseconds
at which the notification will be triggered.
Example
import * as Notifications from 'expo-notifications';
async function logNextTriggerDate() {
try {
const nextTriggerDate = await Notifications.getNextTriggerDateAsync({
hour: 9,
minute: 0,
});
console.log(nextTriggerDate === null ? 'No next trigger date' : new Date(nextTriggerDate));
} catch (e) {
console.warn(`Couldn't have calculated next trigger date: ${e}`);
}
}
Deprecated This method has been deprecated in favor of using an explicit
NotificationHandler
and thescheduleNotificationAsync
method. More information can be found in our FYI document.
Parameter | Type | Description |
---|---|---|
content | NotificationContentInput | An object representing the notification content. |
identifier(optional) | string | - |
Schedules a notification for immediate trigger.
Promise<string>
It returns a Promise resolving with the notification's identifier once the notification is successfully scheduled for immediate display.
Parameter | Type | Description |
---|---|---|
request | NotificationRequestInput | An object describing the notification to be triggered. |
Schedules a notification to be triggered in the future.
Note: Please note that this does not mean that the notification will be presented when it is triggered. For the notification to be presented you have to set a notification handler with
setNotificationHandler
that will return an appropriate notification behavior. For more information see the example below.
Promise<string>
Returns a Promise resolving to a string which is a notification identifier you can later use to cancel the notification or to identify an incoming notification.
Example
import * as Notifications from 'expo-notifications';
Notifications.scheduleNotificationAsync({
content: {
title: "Time's up!",
body: 'Change sides!',
},
trigger: {
type: SchedulableTriggerInputTypes.TIME_INTERVAL,
seconds: 60,
},
});
import * as Notifications from 'expo-notifications';
Notifications.scheduleNotificationAsync({
content: {
title: 'Remember to drink water!',
},
trigger: {
type: SchedulableTriggerInputTypes.TIME_INTERVAL,
seconds: 60 * 20,
repeats: true,
},
});
import * as Notifications from 'expo-notifications';
const trigger = new Date(Date.now() + 60 * 60 * 1000);
trigger.setMinutes(0);
trigger.setSeconds(0);
Notifications.scheduleNotificationAsync({
content: {
title: 'Happy new hour!',
},
trigger,
});
Removes all application's notifications displayed in the notification tray (Notification Center).
Promise<void>
A Promise which resolves once the request to dismiss the notifications is successfully dispatched to the notifications manager.
Parameter | Type | Description |
---|---|---|
notificationIdentifier | string | The notification identifier, obtained either via |
Removes notification displayed in the notification tray (Notification Center).
Promise<void>
A Promise which resolves once the request to dismiss the notification is successfully dispatched to the notifications manager.
Fetches information about all notifications present in the notification tray (Notification Center).
This method is not supported on Android below 6.0 (API level 23) – on these devices it will resolve to an empty array.
Promise<Notification[]>
A Promise which resolves with a list of notifications (Notification
) currently present in the notification tray (Notification Center).
Parameter | Type | Description |
---|---|---|
channelId | string | The channel identifier. |
Removes the notification channel.
Promise<void>
A Promise which resolving once the channel is removed (or if there was no channel for given identifier).
Parameter | Type | Description |
---|---|---|
groupId | string | The channel group identifier. |
Removes the notification channel group and all notification channels that belong to it.
Promise<void>
A Promise which resolves once the channel group is removed (or if there was no channel group for given identifier).
Parameter | Type | Description |
---|---|---|
channelId | string | The channel's identifier. |
Fetches information about a single notification channel.
Promise<NotificationChannel | null>
A Promise which resolves to the channel object (of type NotificationChannel
) or to null
if there was no channel found for this identifier. On platforms that do not support notification channels, it will always resolve to null
.
Parameter | Type | Description |
---|---|---|
groupId | string | The channel group's identifier. |
Fetches information about a single notification channel group.
Promise<NotificationChannelGroup | null>
A Promise which resolves to the channel group object (of type NotificationChannelGroup
)
or to null
if there was no channel group found for this identifier. On platforms that do not support notification channels,
it will always resolve to null
.
Fetches information about all known notification channel groups.
Promise<NotificationChannelGroup[]>
A Promise which resoles to an array of channel groups. On platforms that do not support notification channel groups, it will always resolve to an empty array.
Fetches information about all known notification channels.
Promise<NotificationChannel[]>
A Promise which resolves to an array of channels. On platforms that do not support notification channels, it will always resolve to an empty array.
Parameter | Type | Description |
---|---|---|
channelId | string | The channel identifier. |
channel | NotificationChannelInput | Object representing the channel's configuration. |
Assigns the channel configuration to a channel of a specified name (creating it if need be). This method lets you assign given notification channel to a notification channel group.
Note: After a channel has been created, you can modify only its name and description. This limitation is imposed by the Android OS.
Note: For some settings to be applied on all Android versions, it may be necessary to duplicate the configuration across both a single notification and its respective notification channel.
For example, for a notification to play a custom sound on Android versions below 8.0,
the custom notification sound has to be set on the notification (through the NotificationContentInput
),
and for the custom sound to play on Android versions above 8.0, the relevant notification channel must have the custom sound configured
(through the NotificationChannelInput
). For more information,
see Set custom notification sounds on Android.
Promise<NotificationChannel | null>
A Promise which resolving to the object (of type NotificationChannel
) describing the modified channel
or to null
if the platform does not support notification channels.
Parameter | Type | Description |
---|---|---|
groupId | string | The channel group's identifier. |
group | NotificationChannelGroupInput | Object representing the channel group configuration. |
Assigns the channel group configuration to a channel group of a specified name (creating it if need be).
Promise<NotificationChannelGroup | null>
A Promise
resolving to the object (of type NotificationChannelGroup
)
describing the modified channel group or to null
if the platform does not support notification channels.
Parameter | Type | Description |
---|---|---|
identifier | string | Identifier initially provided to |
Deletes the category associated with the provided identifier.
Promise<boolean>
A Promise which resolves to true
if the category was successfully deleted, or false
if it was not.
An example of when this method would return false
is if you try to delete a category that doesn't exist.
Fetches information about all known notification categories.
Promise<NotificationCategory[]>
A Promise which resolves to an array of NotificationCategory
s. On platforms that do not support notification channels,
it will always resolve to an empty array.
Parameter | Type | Description |
---|---|---|
identifier | string | A string to associate as the ID of this category. You will pass this string in as the
|
actions | NotificationAction[] | An array of |
options(optional) | NotificationCategoryOptions | An optional object of additional configuration options for your category. |
Sets the new notification category.
Promise<NotificationCategory>
A Promise which resolves to the category you just have created.
Clears the notification response that was received most recently. May be used when an app selects a route based on the notification response, and it is undesirable to continue selecting the route after the response has already been handled.
If a component is using the useLastNotificationResponse
hook,
this call will also clear the value returned by the hook.
Promise<void>
A promise that resolves if the native call was successful.
Gets the notification response that was received most recently (a notification response designates an interaction with a notification, such as tapping on it).
null
- if no notification response has been received yetNotificationResponse
object - if a notification response was receivedPromise<NotificationResponse | null>
Promise<void>
Property | Type | Description |
---|---|---|
contentType | AndroidAudioContentType | - |
flags | {
enforceAudibility: boolean,
requestHardwareAudioVideoSynchronization: boolean
} | - |
usage | AndroidAudioUsage | - |
Extends: Region
A region used to detect the presence of iBeacon devices. Based on Core Location CLBeaconRegion
class.
Property | Type | Description |
---|---|---|
beaconIdentityConstraint(optional) | {
major: null | number,
minor: null | number,
uuid: string
} | The beacon identity constraint that defines the beacon region. |
major | null | number | The major value from the beacon identity constraint that defines the beacon region. |
minor | null | number | The minor value from the beacon identity constraint that defines the beacon region. |
notifyEntryStateOnDisplay | boolean | A Boolean value that indicates whether Core Location sends beacon notifications when the device’s display is on. |
type | 'beacon' | - |
uuid(optional) | string | The UUID value from the beacon identity constraint that defines the beacon region. |
A trigger related to a UNCalendarNotificationTrigger
.
Property | Type | Description |
---|---|---|
dateComponents | {
calendar: string,
day: number,
era: number,
hour: number,
isLeapMonth: boolean,
minute: number,
month: number,
nanosecond: number,
quarter: number,
second: number,
timeZone: string,
weekday: number,
weekdayOrdinal: number,
weekOfMonth: number,
weekOfYear: number,
year: number,
yearForWeekOfYear: number
} | - |
repeats | boolean | - |
type | 'calendar' | - |
Extends: Region
A circular geographic region, specified as a center point and radius. Based on Core Location CLCircularRegion
class.
Property | Type | Description |
---|---|---|
center | {
latitude: number,
longitude: number
} | The center point of the geographic area. |
radius | number | The radius (measured in meters) that defines the geographic area’s outer boundary. |
type | 'circular' | - |
A trigger related to a daily notification.
The same functionality will be achieved on iOS with a
CalendarNotificationTrigger
.
Property | Type | Description |
---|---|---|
hour | number | - |
minute | number | - |
type | 'daily' | - |
Object which contains the Expo push token in the data
field. Use the value from data
to send notifications via Expo Notifications service.
Property | Type | Description |
---|---|---|
data | string | The acquired push token. |
type | 'expo' | Always set to |
Property | Type | Description |
---|---|---|
applicationId(optional) | string | The ID of the application to which the token should be attributed.
Defaults to |
baseUrl(optional) | string | Endpoint URL override. |
development(optional) | boolean | Only for: iOS On iOS, there are two push notification services: "sandbox" and "production".
This defines whether the push token is supposed to be used with the sandbox platform notification service.
Defaults to |
deviceId(optional) | string | - |
devicePushToken(optional) | DevicePushToken | The device push token with which to register at the backend.
Defaults to a token fetched with |
projectId(optional) | string | The ID of the project to which the token should be attributed.
Defaults to When using EAS Build, this value is automatically set. However, it is
recommended to set it manually. Once you have EAS Build configured, you can find
the value in app.json under |
type(optional) | string | Request body override. |
url(optional) | string | Request URL override. |
A Firebase RemoteMessage
that caused the notification to be delivered to the app.
Property | Type | Description |
---|---|---|
collapseKey | null | string | - |
data | Record<string, string> | - |
from | null | string | - |
messageId | null | string | - |
messageType | null | string | - |
notification | null | FirebaseRemoteMessageNotification | - |
originalPriority | number | - |
priority | number | - |
sentTime | number | - |
to | null | string | - |
ttl | number | - |
Property | Type | Description |
---|---|---|
body | null | string | - |
bodyLocalizationArgs | null | string[] | - |
bodyLocalizationKey | null | string | - |
channelId | null | string | - |
clickAction | null | string | - |
color | null | string | - |
eventTime | null | number | - |
icon | null | string | - |
imageUrl | null | string | - |
lightSettings | null | number[] | - |
link | null | string | - |
localOnly | boolean | - |
notificationCount | null | number | - |
notificationPriority | null | number | - |
sound | null | string | - |
sticky | boolean | - |
tag | null | string | - |
ticker | null | string | - |
title | null | string | - |
titleLocalizationArgs | null | string[] | - |
titleLocalizationKey | null | string | - |
usesDefaultLightSettings | boolean | - |
usesDefaultSound | boolean | - |
usesDefaultVibrateSettings | boolean | - |
vibrateTimings | null | number[] | - |
visibility | null | number | - |
Available configuration for permission request on iOS platform.
See Apple documentation for UNAuthorizationOptions
to learn more.
Property | Type | Description |
---|---|---|
allowAlert(optional) | boolean | The ability to display alerts. |
allowBadge(optional) | boolean | The ability to update the app’s badge. |
allowCriticalAlerts(optional) | boolean | The ability to play sounds for critical alerts. |
allowDisplayInCarPlay(optional) | boolean | The ability to display notifications in a CarPlay environment. |
allowProvisional(optional) | boolean | The ability to post noninterrupting notifications provisionally to the Notification Center. |
allowSound(optional) | boolean | The ability to play sounds. |
provideAppNotificationSettings(optional) | boolean | An option indicating the system should display a button for in-app notification settings. |
A trigger related to a UNLocationNotificationTrigger
.
Property | Type | Description |
---|---|---|
region | CircularRegion | BeaconRegion | - |
repeats | boolean | - |
type | 'location' | - |
A trigger related to a monthly notification.
The same functionality will be achieved on iOS with a
CalendarNotificationTrigger
.
Property | Type | Description |
---|---|---|
day | number | - |
hour | number | - |
minute | number | - |
type | 'monthly' | - |
An object which represents a single notification that has been triggered by some request (NotificationRequest
) at some point in time.
Property | Type | Description |
---|---|---|
date | number | - |
request | NotificationRequest | - |
Property | Type | Description |
---|---|---|
buttonTitle | string | The title of the button triggering this action. |
identifier | string | A unique string that identifies this action. If a user takes this action (for example, selects this button in the system's Notification UI),
your app will receive this |
options(optional) | {
isAuthenticationRequired: boolean,
isDestructive: boolean,
opensAppToForeground: boolean
} | Object representing the additional configuration options. |
textInput(optional) | {
placeholder: string,
submitButtonTitle: string
} | Object which, if provided, will result in a button that prompts the user for a text response. |
An object which represents behavior that should be applied to the incoming notification.
On Android, setting
shouldPlaySound: false
will result in the drop-down notification alert not showing, no matter what the priority is. This setting will also override any channel-specific sounds you may have configured.
Property | Type | Description |
---|---|---|
priority(optional) | AndroidNotificationPriority | - |
shouldPlaySound | boolean | - |
shouldSetBadge | boolean | - |
shouldShowAlert | boolean | - |
Property | Type | Description |
---|---|---|
actions | NotificationAction[] | - |
identifier | string | - |
options(optional) | NotificationCategoryOptions | - |
An object which represents a notification channel.
Property | Type | Description |
---|---|---|
audioAttributes | AudioAttributes | - |
bypassDnd | boolean | - |
description | null | string | - |
enableLights | boolean | - |
enableVibrate | boolean | - |
groupId(optional) | null | string | - |
id | string | - |
importance | AndroidImportance | - |
lightColor | string | - |
lockscreenVisibility | AndroidNotificationVisibility | - |
name | null | string | - |
showBadge | boolean | - |
sound | null | 'default' | 'custom' | - |
vibrationPattern | null | number[] | - |
An object which represents a notification channel group.
Property | Type | Description |
---|---|---|
channels | NotificationChannel[] | - |
description(optional) | null | string | - |
id | string | - |
isBlocked(optional) | boolean | - |
name | null | string | - |
An object which represents a notification channel group to be set.
Property | Type | Description |
---|---|---|
description(optional) | null | string | - |
name | null | string | - |
Extends: ProxyNativeModule
Property | Type | Description |
---|---|---|
deleteNotificationChannelGroupAsync(optional) | (groupId: string) => Promise<void> | - |
getNotificationChannelGroupAsync(optional) | (groupId: string) => Promise<null | NotificationChannelGroup> | - |
getNotificationChannelGroupsAsync(optional) | () => Promise<NotificationChannelGroup[]> | - |
setNotificationChannelGroupAsync(optional) | (groupId: string, group: NotificationChannelGroupInput) => Promise<null | NotificationChannelGroup> | - |
Extends: ProxyNativeModule
Property | Type | Description |
---|---|---|
deleteNotificationChannelAsync(optional) | (channelId: string) => Promise<void> | - |
getNotificationChannelAsync(optional) | (channelId: string) => Promise<null | NotificationChannel> | - |
getNotificationChannelsAsync(optional) | () => Promise<null | NotificationChannel[]> | - |
setNotificationChannelAsync(optional) | (channelId: string, channelConfiguration: NotificationChannelInput) => Promise<null | NotificationChannel> | - |
Property | Type | Description |
---|---|---|
handleError(optional) | (notificationId: string, error: NotificationHandlingError) => void | A function called whenever calling |
handleNotification | (notification: Notification) => Promise<NotificationBehavior> | A function accepting an incoming notification returning a |
handleSuccess(optional) | (notificationId: string) => void | A function called whenever an incoming notification is handled successfully. |
An interface representing the permissions request scope configuration. Each option corresponds to a different native platform authorization option.
Property | Type | Description |
---|---|---|
android(optional) | object | On Android, all available permissions are granted by default, and if a user declines any permission, an app cannot prompt the user to change. |
ios(optional) | IosNotificationPermissionsRequest | Available configuration for permission request on iOS platform. |
Extends: PermissionResponse
Property | Type | Description |
---|---|---|
android(optional) | {
importance: number,
interruptionFilter: number
} | - |
ios(optional) | {
alertStyle: IosAlertStyle,
allowsAlert: null | boolean,
allowsAnnouncements: null | boolean,
allowsBadge: null | boolean,
allowsCriticalAlerts: null | boolean,
allowsDisplayInCarPlay: null | boolean,
allowsDisplayInNotificationCenter: null | boolean,
allowsDisplayOnLockScreen: null | boolean,
allowsPreviews: IosAllowsPreviews,
allowsSound: null | boolean,
providesAppNotificationSettings: boolean,
status: IosAuthorizationStatus
} | - |
An object represents a request to present a notification. It has content — how it's being represented, and a trigger — what triggers the notification.
Many notifications (Notification
) may be triggered with the same request (for example, a repeating notification).
Property | Type | Description |
---|---|---|
content | NotificationContent | - |
identifier | string | - |
trigger | NotificationTrigger | - |
An object which represents a notification request you can pass into scheduleNotificationAsync
.
Property | Type | Description |
---|---|---|
content | NotificationContentInput | - |
identifier(optional) | string | - |
trigger | NotificationTriggerInput | - |
An object which represents user's interaction with the notification.
Note: If the user taps on a notification
actionIdentifier
will be equal toNotifications.DEFAULT_ACTION_IDENTIFIER
.
Property | Type | Description |
---|---|---|
actionIdentifier | string | - |
notification | Notification | - |
userText(optional) | string | - |
An object obtained by permissions get and request functions.
Property | Type | Description |
---|---|---|
canAskAgain | boolean | Indicates if user can be asked again for specific permission. If not, one should be directed to the Settings app in order to enable/disable the permission. |
expires | PermissionExpiration | Determines time when the permission expires. |
granted | boolean | A convenience boolean that indicates if the permission is granted. |
status | PermissionStatus | Determines the status of the permission. |
The region used to determine when the system sends the notification.
Property | Type | Description |
---|---|---|
identifier | string | The identifier for the region object. |
notifyOnEntry | boolean | Indicates whether notifications are generated upon entry into the region. |
notifyOnExit | boolean | Indicates whether notifications are generated upon exit from the region. |
type | string | - |
A trigger related to an elapsed time interval. May be repeating (see repeats
field).
Property | Type | Description |
---|---|---|
repeats | boolean | - |
seconds | number | - |
type | 'timeInterval' | - |
Represents a notification trigger that is unknown to expo-notifications
and that it didn't know how to serialize for JS.
Property | Type | Description |
---|---|---|
type | 'unknown' | - |
A trigger related to a weekly notification.
The same functionality will be achieved on iOS with a
CalendarNotificationTrigger
.
Property | Type | Description |
---|---|---|
hour | number | - |
minute | number | - |
type | 'weekly' | - |
weekday | number | - |
A trigger related to a yearly notification.
The same functionality will be achieved on iOS with a
CalendarNotificationTrigger
.
Property | Type | Description |
---|---|---|
day | number | - |
hour | number | - |
minute | number | - |
month | number | - |
type | 'yearly' | - |
Type: Partial<AudioAttributes>
We're making inner flags required to set intentionally.
Not providing true
for a flag makes it false, it doesn't make sense
to let it be left undefined.
This trigger input will cause the notification to be delivered once or many times
(controlled by the value of repeats
)
when the date components match the specified values.
Corresponds to native
UNCalendarNotificationTrigger
.
Property | Type | Description |
---|---|---|
channelId(optional) | string | - |
day(optional) | number | - |
hour(optional) | number | - |
minute(optional) | number | - |
month(optional) | number | - |
repeats(optional) | boolean | - |
second(optional) | number | - |
seconds(optional) | number | - |
timezone(optional) | string | - |
type | SchedulableTriggerInputTypes.CALENDAR | - |
weekday(optional) | number | - |
weekdayOrdinal(optional) | number | - |
weekOfMonth(optional) | number | - |
weekOfYear(optional) | number | - |
year(optional) | number | - |
A trigger that will cause the notification to be delivered immediately.
Property | Type | Description |
---|---|---|
channelId | string | - |
This trigger input will cause the notification to be delivered once per day
when the hour
and minute
date components match the specified values.
Property | Type | Description |
---|---|---|
channelId(optional) | string | - |
hour | number | - |
minute | number | - |
type | SchedulableTriggerInputTypes.DAILY | - |
This trigger input will cause the notification to be delivered once
on the specified value of the date
property. The value of repeats
will be ignored
for this trigger type.
Type: Date
or number
or object
shaped as below:
Property | Type | Description |
---|---|---|
channelId(optional) | string | - |
date | Date | number | - |
type | SchedulableTriggerInputTypes.DATE | - |
Literal Type: multiple types
In simple terms, an object of type: Platform.OS
and data: any
. The data
type depends on the environment - on a native device it will be a string,
which you can then use to send notifications via Firebase Cloud Messaging (Android) or APNs (iOS).
Acceptable values are: ExplicitlySupportedDevicePushToken
| ImplicitlySupportedDevicePushToken
A subscription object that allows to conveniently remove an event listener from the emitter.
Property | Type | Description |
---|---|---|
remove | () => void | Removes an event listener for which the subscription has been created. After calling this function, the listener will no longer receive any events from the emitter. |
Type: NativeDevicePushToken
Property | Type | Description |
---|---|---|
data | any | The push token as a string for a native platform. |
type | Exclude<Platform.OS, ExplicitlySupportedDevicePushToken[type]> | Either |
Literal Type: multiple types
Acceptable values are: NotificationResponse
| null
| undefined
This trigger input will cause the notification to be delivered once per month
when the day
, hour
, and minute
date components match the specified values.
Note: All properties are specified in JavaScript
Date
object's ranges (i.e. January is represented as 0).
Property | Type | Description |
---|---|---|
channelId(optional) | string | - |
day | number | - |
hour | number | - |
minute | number | - |
type | SchedulableTriggerInputTypes.MONTHLY | - |
Literal Type: multiple types
Acceptable values are: IosNotificationPermissionsRequest
| object
Property | Type | Description |
---|---|---|
allowAnnouncement(optional) | boolean | Indicates whether to allow notifications to be automatically read by Siri when the user is using AirPods. Default: false |
allowInCarPlay(optional) | boolean | Indicates whether to allow CarPlay to display notifications of this type. Apps must be approved for CarPlay to make use of this feature. Default: false |
categorySummaryFormat(optional) | string | A format string for the summary description used when the system groups the category’s notifications. |
customDismissAction(optional) | boolean | Indicates whether to send actions for handling when the notification is dismissed (the user must explicitly dismiss the notification interface - ignoring a notification or flicking away a notification banner does not trigger this action). Default: false |
intentIdentifiers(optional) | string[] | Array of Intent Class Identifiers. When a notification is delivered, the presence of an intent identifier lets the system know that the notification is potentially related to the handling of a request made through Siri. Default: [] |
previewPlaceholder(optional) | string | Customizable placeholder for the notification preview text. This is shown if the user has disabled notification previews for the app.
Defaults to the localized iOS system default placeholder ( |
showSubtitle(optional) | boolean | Indicates whether to show the notification's subtitle, even if the user has disabled notification previews for the app. Default: false |
showTitle(optional) | boolean | Indicates whether to show the notification's title, even if the user has disabled notification previews for the app. Default: false |
Type: RequiredBy<Omit<NotificationChannel, 'id' | 'audioAttributes' | 'sound'> & {
audioAttributes: AudioAttributesInput,
sound: string | null
}, 'name' | 'importance'>
An object which represents a notification channel to be set.
An object represents notification's content.
Type: NotificationContentIos | NotificationContentAndroid
extended by:
Property | Type | Description |
---|---|---|
body | string | null | Notification body - the main content of the notification. |
data | Record<string, any> | Data associated with the notification, not displayed |
sound | 'default' | 'defaultCritical' | 'custom' | null | - |
subtitle | string | null | On Android: On iOS: |
title | string | null | Notification title - the bold text displayed above the rest of the content. |
See Android developer documentation for more information on specific fields.
Property | Type | Description |
---|---|---|
badge(optional) | number | Application badge number associated with the notification. |
color(optional) | string | Accent color (in |
priority(optional) | AndroidNotificationPriority | Relative priority for this notification. Priority is an indication of how much of the user's valuable attention should be consumed by this notification. Low-priority notifications may be hidden from the user in certain situations, while the user might be interrupted for a higher-priority notification. The system will make a determination about how to interpret this priority when presenting the notification. |
vibrationPattern(optional) | number[] | The pattern with which to vibrate. |
Property | Type | Description |
---|---|---|
hideThumbnail(optional) | boolean | - |
identifier | string | null | - |
thumbnailClipArea(optional) | {
height: number,
width: number,
x: number,
y: number
} | - |
thumbnailTime(optional) | number | - |
type | string | null | - |
typeHint(optional) | string | - |
url | string | null | - |
An object which represents notification content that you pass in to presentNotificationAsync
or as a part of NotificationRequestInput
.
Property | Type | Description |
---|---|---|
attachments(optional) | NotificationContentAttachmentIos[] | Only for: iOS The visual and audio attachments to display alongside the notification’s main content. |
autoDismiss(optional) | boolean | Only for: Android If set to See Android developer documentation for more details. |
badge(optional) | number | Application badge number associated with the notification. |
body(optional) | string | null | The main content of the notification. |
categoryIdentifier(optional) | string | Only for: iOS The identifier of the notification’s category. |
color(optional) | string | Only for: Android Accent color (in |
data(optional) | Record<string, any> | Data associated with the notification, not displayed. |
interruptionLevel(optional) | 'passive' | 'active' | 'timeSensitive' | 'critical' | Only for: iOS The notification’s importance and required delivery timing. Posible values:
|
launchImageName(optional) | string | The name of the image or storyboard to use when your app launches because of the notification. |
priority(optional) | string | Only for: Android Relative priority for this notification. Priority is an indication of how much of the user's valuable attention should be consumed by this notification. Low-priority notifications may be hidden from the user in certain situations, while the user might be interrupted for a higher-priority notification. The system will make a determination about how to interpret this priority when presenting the notification. |
sound(optional) | boolean | string | - |
sticky(optional) | boolean | Only for: Android If set to See Android developer documentation and Firebase documentation for more details. |
subtitle(optional) | string | null | On Android: On iOS: |
title(optional) | string | null | Notification title - the bold text displayed above the rest of the content. |
vibrate(optional) | number[] | Only for: Android The pattern with which to vibrate. |
See Apple documentation for more information on specific fields.
Property | Type | Description |
---|---|---|
attachments | NotificationContentAttachmentIos[] | The visual and audio attachments to display alongside the notification’s main content. |
badge | number | null | The number that your app’s icon displays. |
categoryIdentifier | string | null | The identifier of the notification’s category. |
interruptionLevel(optional) | 'passive' | 'active' | 'timeSensitive' | 'critical' | Only for: iOS The notification’s importance and required delivery timing. Possible values:
|
launchImageName | string | null | The name of the image or storyboard to use when your app launches because of the notification. |
summaryArgument(optional) | string | null | The text the system adds to the notification summary to provide additional context. |
summaryArgumentCount(optional) | number | The number the system adds to the notification summary when the notification represents multiple items. |
targetContentIdentifier(optional) | string | The value your app uses to determine which scene to display to handle the notification. |
threadIdentifier | string | null | The identifier that groups related notifications. |
Literal Type: multiple types
Acceptable values are: NotificationTimeoutError
| Error
Literal Type: multiple types
A union type containing different triggers which may cause the notification to be delivered to the application.
Acceptable values are: PushNotificationTrigger
| LocationNotificationTrigger
| NotificationTriggerInput
| UnknownNotificationTrigger
Literal Type: multiple types
A type which represents possible triggers with which you can schedule notifications.
A null
trigger means that the notification should be scheduled for delivery immediately.
Acceptable values are: null
| ChannelAwareTriggerInput
| SchedulableNotificationTriggerInput
Literal Type: multiple types
Permission expiration time. Currently, all permissions are granted permanently.
Acceptable values are: 'never'
| number
Property | Type | Description |
---|---|---|
payload(optional) | Record<string, unknown> | - |
remoteMessage(optional) | FirebaseRemoteMessage | - |
type | 'push' | - |
A function accepting a device push token (DevicePushToken
) as an argument.
Note: You should not call
getDevicePushTokenAsync
inside this function, as it triggers the listener and may lead to an infinite loop.
Parameter | Type |
---|---|
token | DevicePushToken |
void
Literal Type: multiple types
Input for time-based, schedulable triggers.
For these triggers you can check the next trigger date with getNextTriggerDateAsync
.
If you pass in a number
(Unix timestamp) or Date
, it will be processed as a
trigger input of type SchedulableTriggerInputTypes.DATE
. Otherwise, the input must be
an object, with a type
value set to one of the allowed values in SchedulableTriggerInputTypes
.
If the input is an object, date components passed in will be validated, and
an error is thrown if they are outside their allowed range (for example, the minute
and
second
components must be between 0 and 59 inclusive).
Acceptable values are: CalendarTriggerInput
| TimeIntervalTriggerInput
| DailyTriggerInput
| WeeklyTriggerInput
| MonthlyTriggerInput
| YearlyTriggerInput
| DateTriggerInput
This trigger input will cause the notification to be delivered once or many times
(depends on the repeats
field) after seconds
time elapse.
On iOS, when
repeats
istrue
, the time interval must be 60 seconds or greater. Otherwise, the notification won't be triggered.
Property | Type | Description |
---|---|---|
channelId(optional) | string | - |
repeats(optional) | boolean | - |
seconds | number | - |
type | SchedulableTriggerInputTypes.TIME_INTERVAL | - |
This trigger input will cause the notification to be delivered once every week
when the weekday
, hour
, and minute
date components match the specified values.
Note: Weekdays are specified with a number from
1
through7
, with1
indicating Sunday.
Property | Type | Description |
---|---|---|
channelId(optional) | string | - |
hour | number | - |
minute | number | - |
type | SchedulableTriggerInputTypes.WEEKLY | - |
weekday | number | - |
This trigger input will cause the notification to be delivered once every year
when the day
, month
, hour
, and minute
date components match the specified values.
Note: All properties are specified in JavaScript
Date
object's ranges (i.e. January is represented as 0).
Property | Type | Description |
---|---|---|
channelId(optional) | string | - |
day | number | - |
hour | number | - |
minute | number | - |
month | number | - |
type | SchedulableTriggerInputTypes.YEARLY | - |
An enum corresponding to values appropriate for Android's Notification#priority
field.
Schedulable trigger inputs (that are not a plain date value or time value) must have the "type" property set to one of these values.