Notification Channels

编辑页面


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

本页已存档。请参阅 Push Notifications guide 获取最新信息。

Notification channels 是 Android Oreo 中的一项新功能,它让用户对接收到的通知拥有更多控制权。从 Android Oreo 开始,每个本地通知和推送通知都必须分配到单个通道。用户可以在操作系统设置中看到所有通知通道,并且可以按通道自定义提醒行为。

Notification channels 对所有 iOS 设备都没有影响,并且会被忽略。

Designing channels

通道让用户可以更好地控制希望从你的应用接收的各类提醒。你应该为可能发送的每种通知类型创建一个通道,例如闹钟、聊天消息、更新通知等。

根据 Android 开发者文档:

你应该为你需要发送的每一种不同类型的通知创建一个通道。你也可以创建通知通道来反映应用用户所做的选择。例如,你可以为消息应用中用户创建的每个会话组设置单独的通知通道。

创建通道时,你可以为其通知指定各种设置,例如优先级、声音和振动。创建通道后,控制权完全交给用户,用户可以针对每个通道按自己的喜好自定义这些设置。你的应用将不能再更改任何设置。虽然你的应用可以通过程序删除通道,但 Android 不建议这样做,并且会在用户设备上保留一个遗留项。

你可以在 Android developer website 上了解更多关于通知通道的信息。认真思考如何设计出对用户有意义且有用的通道自定义方式是个好主意。

Creating and using channels

创建通道很简单——在创建本地通知(或接收推送通知)之前,只需调用以下方法:

if (Platform.OS === 'android') { Notifications.createChannelAndroidAsync('chat-messages', { name: 'Chat messages', sound: true, }); }

创建一个已存在的通道基本上是一个空操作,因此你可以安全地在应用每次启动时调用它。例如,你的应用根组件中的 componentDidMount 可能就是一个不错的地方。不过请注意,一旦通知通道创建后,你将无法更改其任何设置——只有用户才能这么做。因此,请务必仔细规划你的通道。

然后,当你想为聊天消息发送通知时,可以在你的 push notification message 中添加 channelId: 'chat-messages' 字段,或者像这样创建一个本地通知:

Notifications.presentLocalNotificationAsync({ title: 'New Message', body: 'Message!!!!', android: { channelId: 'chat-messages', }, });

然后,Expo 会通过 chat-messages 通道向用户展示你的通知,并尊重该通道的所有用户设置。

如果你创建通知时没有指定 channelId,Expo 将自动为你创建一个名为 Default 的通道,并通过该通道展示通知。但是,如果你指定了一个尚未在设备上创建的 channelId该通知将不会在 Android 8+ 设备上显示。 因此,提前规划并确保在发送通知之前创建所有你可能需要的通道非常重要。

在 Android 7 及以下不支持通知通道的设备上,Expo 会记住你创建通道时所使用的相关设置(在这种情况下是 sound: true),并在向用户展示单个通知之前将这些设置直接应用到该通知上。

Updating an existing app to use channels

如果你已有的 Android 应用依赖通知的 soundvibratepriority 设置,那么你需要更新应用以利用通道,因为这些设置将不再对单个通知产生任何影响。如果你并不依赖这些设置,也可以考虑进行更新,以便让用户更好地控制你的应用展示的不同类型通知。(注意,这里涉及的客户端 priority 设置只影响通知的 UI 行为,它不同于 推送通知的 priority,后者不受通知通道影响。)

要这样做,首先确保你正在使用与你的 SDK 版本对应的最新 expo 次要更新。通知通道从 SDK 22 及以上开始支持,因此例如,如果你使用的是 SDK 27,那么你应该 npm install/yarn add expo@^27.1.0

接下来,规划你的应用所需要的通知通道。这些通道可能对应于你在单个通知中使用过的 soundvibratepriority 设置的不同组合。

一旦你决定好一组通道,就需要在应用中添加创建这些通道的逻辑。我们建议直接在应用根组件的 componentDidMount 中创建所有通道;这样所有用户都能确保获取到全部通道,不会错过任何通知。

例如,如果你的代码之前是这样:

_createNotificationAsync = () => { Notifications.presentLocalNotificationAsync({ title: 'Reminder', body: 'This is an important reminder!!!!', android: { priority: 'max', vibrate: [0, 250, 250, 250], color: '#FF0000', }, }); };

你可以将其修改为类似这样:

componentDidMount() { // ... if (Platform.OS === 'android') { Notifications.createChannelAndroidAsync('reminders', { name: 'Reminders', priority: 'max', vibrate: [0, 250, 250, 250], }); } } // ... _createNotificationAsync = () => { Notifications.presentLocalNotificationAsync({ title: 'Reminder', body: 'This is an important reminder!!!!', android: { channelId: 'reminders', color: '#FF0000', }, }); }

这将创建一个名为“Reminders”的通道,其默认设置为 max 优先级和振动模式 [0, 250, 250, 250]。Android 8 用户可以随时更改这些设置,甚至可以完全关闭“Reminders”通道的通知。当调用 presentLocalNotificationAsync 时,操作系统会读取该通道的设置并相应地展示通知。

Send channel notification with Expo API service

[ { to: 'ExponentPushToken[xxxxxx]', title: 'test', priority: 'high', body: 'test', sound: 'default', // android 7.0 , 6, 5 , 4 channelId: 'chat-messages', // android 8.0 later }, ];