@capacitor/push-notifications
Push Notifications API 提供对原生推送通知的访问。
安装
npm install @capacitor/push-notifications
npx cap sync
iOS
在 iOS 上,你必须启用推送通知功能。关于如何启用此功能,请参阅 设置功能。
启用推送通知功能后,将以下代码添加到你的应用 AppDelegate.swift 文件中:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: deviceToken)
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error)
}
Android
Push Notification API 使用 Firebase Cloud Messaging SDK 来处理通知。请参阅 在 Android 上设置 Firebase Cloud Messaging 客户端应用 并按照说明创建 Firebase 项目并注册你的应用。你无需向应用中添加 Firebase SDK 或编辑应用清单文件——Push Notifications 插件已为你提供这些。唯一需要的是将你的 Firebase 项目的 google-services.json 文件添加到应用的模块(应用级别)目录中。
变量
本插件将使用以下项目变量(定义在你的应用的 variables.gradle 文件中):
$firebaseMessagingVersion版本号,对应com.google.firebase:firebase-messaging(默认值:23.0.5)
推送通知图标
在 Android 上,应将具有适当名称的推送通知图标添加到 AndroidManifest.xml 文件中:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@mipmap/push_icon_name" />
如果未指定图标,Android 将使用应用图标,但推送图标应为透明背景上的白色像素。由于应用图标通常不满足此要求,这会导致显示白色方块或圆形。因此,建议为推送通知提供单独的图标。
Android Studio 有一个图标生成器,你可以用它来创建推送通知图标。
前台推送通知显示方式
你可以配置应用在前台时推送通知的显示方式。
| 属性 | 类型 | 描述 | 始于 |
|---|---|---|---|
presentationOptions | PresentationOption[] | 这是一个可以组合的字符串数组。数组中可能的值有: - badge:更新应用图标上的徽章计数(默认值) - sound:收到推送通知时设备会响铃/震动 - alert:推送通知以原生对话框形式显示 如果不希望任何选项生效,可以提供一个空数组。badge 仅适用于 iOS。 | 1.0.0 |
示例
在 capacitor.config.json 中:
{
"plugins": {
"PushNotifications": {
"presentationOptions": ["badge", "sound", "alert"]
}
}
}
在 capacitor.config.ts 中:
/// <reference types="@capacitor/push-notifications" />
import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
plugins: {
PushNotifications: {
presentationOptions: ["badge", "sound", "alert"],
},
},
};
export default config;
静默推送通知 / 纯数据通知
iOS
本插件不支持 iOS 静默推送(远程通知)。我们建议使用原生代码解决方案来处理这类通知,请参阅 向你的应用推送后台更新。
Android
本插件支持纯数据通知,但如果应用已被终止,将不会调用 pushNotificationReceived。要处理这种情况,你需要创建一个继承自 FirebaseMessagingService 的服务,请参阅 处理 FCM 消息。
常见问题
在 Android 上,有多种系统和应用状态会影响推送通知的送达:
- 如果设备已进入 Doze 模式,你的应用可能会受到功能限制。为了提高通知被接收的几率,请考虑使用 FCM 高优先级消息。
- 开发环境和生产环境之间存在行为差异。尝试在 Android Studio 启动应用之外的情况下测试你的应用。更多信息请阅读此处。
---## 示例
import { PushNotifications } from '@capacitor/push-notifications';
const addListeners = async () => {
await PushNotifications.addListener('registration', token => {
console.info('注册令牌: ', token.value);
});
await PushNotifications.addListener('registrationError', err => {
console.error('注册错误: ', err.error);
});
await PushNotifications.addListener('pushNotificationReceived', notification => {
console.log('收到推送通知: ', notification);
});
await PushNotifications.addListener('pushNotificationActionPerformed', notification => {
console.log('推送通知操作已执行', notification.actionId, notification.inputValue);
});
}
const registerNotifications = async () => {
let permStatus = await PushNotifications.checkPermissions();
if (permStatus.receive === 'prompt') {
permStatus = await PushNotifications.requestPermissions();
}
if (permStatus.receive !== 'granted') {
throw new Error('用户拒绝了权限!');
}
await PushNotifications.register();
}
const getDeliveredNotifications = async () => {
const notificationList = await PushNotifications.getDeliveredNotifications();
console.log('已送达的通知', notificationList);
}
API
register()getDeliveredNotifications()removeDeliveredNotifications(...)removeAllDeliveredNotifications()createChannel(...)deleteChannel(...)listChannels()checkPermissions()requestPermissions()addListener('registration', ...)addListener('registrationError', ...)addListener('pushNotificationReceived', ...)addListener('pushNotificationActionPerformed', ...)removeAllListeners()- 接口
- 类型别名
register()
register() => Promise<void>
注册应用以接收推送通知。
此方法将触发 'registration' 事件(附带推送令牌)或在出现问题时触发 'registrationError' 事件。它不会向用户请求通知权限,请先使用 requestPermissions()。
自: 1.0.0
getDeliveredNotifications()
getDeliveredNotifications() => Promise<DeliveredNotifications>
获取通知屏幕上可见的通知列表。
返回:
Promise<DeliveredNotifications>
自: 1.0.0
removeDeliveredNotifications(...)
removeDeliveredNotifications(delivered: DeliveredNotifications) => Promise<void>
从通知屏幕中移除指定的通知。
| 参数名 | 类型 |
|---|---|
delivered | |
自: 1.0.0
removeAllDeliveredNotifications()
removeAllDeliveredNotifications() => Promise<void>
从通知屏幕中移除所有通知。
自: 1.0.0
createChannel(...)
createChannel(channel: Channel) => Promise<void>
创建通知渠道。
仅在 Android O 或更高版本 (SDK 26+) 上可用。
| 参数名 | 类型 |
|---|---|
channel | |
自: 1.0.0
deleteChannel(...)
deleteChannel(args: { id: string; }) => Promise<void>
删除通知渠道。
仅在 Android O 或更高版本 (SDK 26+) 上可用。
| 参数名 | 类型 |
|---|---|
args | { id: string; } |
自: 1.0.0
listChannels()
listChannels() => Promise<ListChannelsResult>
列出可用的通知渠道。
仅在 Android O 或更高版本 (SDK 26+) 上可用。
返回:
Promise<ListChannelsResult>
自: 1.0.0
checkPermissions()
checkPermissions() => Promise<PermissionStatus>
检查接收推送通知的权限。
在 Android 上,状态始终为 granted(已授予),因为你始终可以接收推送通知。如果需要检查用户是否允许显示通知,请使用 local-notifications 插件。
返回:
Promise<PermissionStatus>
自: 1.0.0
requestPermissions()
requestPermissions() => Promise<PermissionStatus>
请求接收推送通知的权限。
在 Android 上,此方法不会请求权限,因为你始终可以接收推送通知。
在 iOS 上,首次调用此函数时,它会向用户请求推送通知权限,并根据用户的选择返回 granted(已授予)或 denied(已拒绝)。后续调用将获取当前权限状态,而不会再次提示用户。
返回:
Promise<PermissionStatus>
自: 1.0.0
addListener('registration', ...)
addListener(eventName: 'registration', listenerFunc: (token: Token) => void) => Promise<PluginListenerHandle> & PluginListenerHandle
当推送通知注册顺利完成时调用。
提供推送通知令牌。
| 参数名 | 类型 |
|---|---|
eventName | 'registration' |
listenerFunc | |
返回:
Promise<PluginListenerHandle> & PluginListenerHandle
自: 1.0.0
--------------------### addListener('registrationError', ...)
addListener(eventName: 'registrationError', listenerFunc: (error: RegistrationError) => void) => Promise<PluginListenerHandle> & PluginListenerHandle
当推送通知注册完成但出现问题时调用。
提供注册问题的错误信息。
| 参数 | 类型 |
|---|---|
eventName | 'registrationError' |
listenerFunc | |
返回值:
Promise<PluginListenerHandle> & PluginListenerHandle
自: 1.0.0
addListener('pushNotificationReceived', ...)
addListener(eventName: 'pushNotificationReceived', listenerFunc: (notification: PushNotificationSchema) => void) => Promise<PluginListenerHandle> & PluginListenerHandle
当设备接收到推送通知时调用。
| 参数 | 类型 |
|---|---|
eventName | 'pushNotificationReceived' |
listenerFunc | |
返回值:
Promise<PluginListenerHandle> & PluginListenerHandle
自: 1.0.0
addListener('pushNotificationActionPerformed', ...)
addListener(eventName: 'pushNotificationActionPerformed', listenerFunc: (notification: ActionPerformed) => void) => Promise<PluginListenerHandle> & PluginListenerHandle
当对推送通知执行操作时调用。
| 参数 | 类型 |
|---|---|
eventName | 'pushNotificationActionPerformed' |
listenerFunc | |
返回值:
Promise<PluginListenerHandle> & PluginListenerHandle
自: 1.0.0
removeAllListeners()
removeAllListeners() => Promise<void>
移除此插件的所有原生监听器。
自: 1.0.0
接口
DeliveredNotifications
| 属性 | 类型 | 说明 | 自 |
|---|---|---|---|
notifications | PushNotificationSchema[] | 在通知屏幕上可见的通知列表。 | 1.0.0 |
PushNotificationSchema
| 属性 | 类型 | 说明 | 自 |
|---|---|---|---|
title | string | 通知标题。 | 1.0.0 |
subtitle | string | 通知副标题。 | 1.0.0 |
body | string | 通知的主要文本内容。 | 1.0.0 |
id | string | 通知标识符。 | 1.0.0 |
tag | string | 通知标签。仅在 Android 上可用(来自推送通知)。 | 4.0.0 |
badge | number | 应用图标角标上显示的数字。 | 1.0.0 |
notification | any | 此字段不会被返回。 | 1.0.0 |
data | any | 推送通知负载中包含的任何附加数据。 | 1.0.0 |
click_action | string | 用户点击通知时要执行的操作。仅在 Android 上可用。 | 1.0.0 |
link | string | 通知中的深层链接。仅在 Android 上可用。 | 1.0.0 |
group | string | 设置通知分组的组标识符。仅在 Android 上可用。功能类似于 iOS 上的 threadIdentifier。 | 1.0.0 |
groupSummary | boolean | 将此通知指定为关联 group 的摘要。仅在 Android 上可用。 | 1.0.0 |
| 属性 | 类型 | 说明 | 默认值 | 始于 |
|---|---|---|---|---|
id | string | 渠道标识符。 | 1.0.0 | |
name | string | 该渠道的用户友好名称(展示给用户)。 | 1.0.0 | |
description | string | 该渠道的描述信息(展示给用户)。 | 1.0.0 | |
sound | string | 发布到该渠道的通知应播放的声音。重要性级别至少为 3 的通知渠道应设置声音。声音文件的文件名应相对于 Android 应用的 res/raw 目录指定。 | 1.0.0 | |
importance | | 发布到该渠道的通知的中断级别。 | | 1.0.0 |
visibility | | 发布到该渠道的通知的可见性。此设置控制发布到该渠道的通知是否显示在锁屏界面上,以及如果显示,是否以脱敏形式呈现。 | 1.0.0 | |
lights | boolean | 发布到该渠道的通知是否应显示通知指示灯(在支持的设备上)。 | 1.0.0 | |
lightColor | string | 发布到该渠道的通知的指示灯颜色。仅当该渠道启用了指示灯且设备支持时才有效。支持的颜色格式为 #RRGGBB 和 #RRGGBBAA。 | 1.0.0 | |
vibration | boolean | 发布到该渠道的通知是否应振动。 | 1.0.0 |
ListChannelsResult
| 属性 | 类型 | 说明 | 始于 |
|---|---|---|---|
channels | Channel[] | 您的应用创建的所有渠道列表。 | 1.0.0 |
PermissionStatus
| 属性 | 类型 | 说明 | 始于 |
|---|---|---|---|
receive | | 接收通知的权限状态。 | 1.0.0 |
PluginListenerHandle
| 属性 | 类型 |
|---|---|
remove | () => Promise<void> |
Token
| 属性 | 类型 | 说明 | 始于 |
|---|---|---|---|
value | string | 在 iOS 上包含 APNS 令牌;在 Android 上包含 FCM 令牌。 | 1.0.0 |
RegistrationError
| 属性 | 类型 | 说明 | 始于 |
|---|---|---|---|
error | string | 描述注册失败的错误信息。 | 4.0.0 |
ActionPerformed
| 属性 | 类型 | 说明 | 始于 |
|---|---|---|---|
actionId | string | 在通知上执行的操作标识。 | 1.0.0 |
inputValue | string | 在通知操作中输入的文本。仅 iOS 可用。 | 1.0.0 |
notification | | 触发该操作的通知对象。 | 1.0.0 |
类型别名
Importance
重要性级别。更多详情请参阅 Android 开发者文档
1 | 2 | 3 | 4 | 5
Visibility
通知可见性。更多详情请参阅 Android 开发者文档
-1 | 0 | 1
PermissionState
'prompt' | 'prompt-with-rationale' | 'granted' | 'denied'