Notification Category(通知类别)是iOS的一种机制,用于按类型对推送通知进行分组并附加可自定义的操作。类别决定了在3D Touch或长按通知时显示哪些按钮,以及系统如何处理此类型的传入通知。根据Apple Developer Documentation,UNNotificationCategory在UNUserNotificationCenter中注册,并通过APNS负载中的category字段与通知关联。
要点
Notification Category是iOS(从8.0版本开始)的一项功能,允许开发者对推送通知进行分类并添加交互式操作。当用户收到通知并用力度按(3D Touch)或长按时,会出现由类别定义的按钮。
类别通过UNNotificationCategory对象注册,该对象包含标识符、操作数组和可选的显示参数。系统使用APNS负载中的类别标识符来查找已注册的类别并显示相应的操作。
与Android Notification Channel不同,iOS Category不管理重要性、声音或振动。它唯一的任务是为通知提供交互能力:回复、确认、取消或文本输入按钮。
类别对于在iOS上显示推送通知不是必需的。通知无论如何都会显示——如果类别已注册则显示按钮,否则不显示。类别仅用于为通知添加交互性。
类别机制由四个阶段组成:在客户端注册类别、发送包含类别的APNS负载、系统识别类别以及处理用户操作。
类别中的操作可以有两种类型:foreground(打开应用程序)和background(在后台执行)。对于后台操作,应用程序在UNNotificationActionHandler中有有限的时间(约30秒)进行处理。
UNNotificationCategory通过options参数支持多个选项:customDismissAction——在滑动通知时接收事件,allowInCarPlay——在CarPlay中显示操作,hiddenPreviewsBodyPlaceholder——隐藏预览的自定义文本。正确配置选项可改善不同Apple设备上的用户体验。
iOS为通知类别提供两种类型的操作。每种类型都有其自身的用途和与用户的交互方式。
| 类型 | 类 | 描述 | 示例 |
|---|---|---|---|
| 简单操作 | UNNotificationAction | 带有标题和选项的按钮(destructive、foreground、authenticationRequired) | “删除”、“查看” |
| 文本输入 | UNTextInputAction | 打开带有提示的文本输入字段的按钮 | “回复”、“评论” |
UNTextInputAction——iOS的独特功能。按下“回复”按钮时,系统会显示一个文本字段供用户输入回复。输入的文本与操作标识符一起传递给委托。这允许在不打开应用程序的情况下快速回复。
操作选项:options.authenticationRequired——需要解锁设备,options.destructive——将按钮标红(用于危险操作),options.foreground——按下后打开应用程序。
类别在应用程序启动时注册,通常在didFinishLaunchingWithOptions方法中。注册通过UNUserNotificationCenter进行,在请求通知权限之后。类别可以在每次启动时更新——旧版本会被新版本替换。
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "回复",
options: [.foreground],
textInputButtonTitle: "发送",
textInputPlaceholder: "输入消息..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "删除",
options: [.destructive]
)
let messageCategory = UNNotificationCategory(
identifier: "message",
actions: [replyAction, deleteAction],
intentIdentifiers: [],
options: [.customDismissAction]
)
UNUserNotificationCenter.current()
.setNotificationCategories([messageCategory])
}
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
UNUserNotificationCenter.current().delegate = self
registerNotificationCategories()
return true
}
}
注册类别后,APNS负载中category = “message”的每个通知将显示“回复”和“删除”按钮。点击处理在userNotificationCenter:didReceive response中进行,其中actionIdentifier确定按下了哪个按钮。
当用户按下类别按钮时,iOS使用UNNotificationResponse对象调用UNUserNotificationCenterDelegate委托。response.actionIdentifier包含按下按钮的标识符,response.notification.request.content.userInfo包含来自APNS负载的自定义数据。对于UNTextInputAction,还提供response.userText,其中包含用户输入的文本。
熟悉Android Notification Channels的开发者经常将它们与iOS Notification Categories混淆。尽管名称相似,但这些机制解决不同的任务并以不同的方式工作。
在两个平台上都可以结合两种机制:在Android中,通知可以属于带有NotificationCompat操作的频道;在iOS中,类别补充了在iOS中称为thread-id的频道,用于在通知中心对通知进行分组。
为了让通知显示类别按钮,服务器必须在APNS负载中包含category键。没有这个键,系统将不知道对通知应用哪个类别。
{
"aps": {
"alert": {
"title": "新消息",
"body": "安娜:你好!你好吗?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
category键必须与通过setNotificationCategories在客户端注册的标识符完全匹配。大小写很重要——“message”和“Message”被视为不同的类别。如果未找到类别,通知将在没有按钮的情况下显示,日志中不会有错误。
如果服务器发送的category在客户端未注册,iOS会忽略该类别并不显示按钮。错误不会被记录,应用程序不会知道不匹配。建议通过配置文件同步服务器和客户端之间的类别列表,并在每次应用程序更新时检查它们。
在设计iOS通知类别时,请遵循一个类别——一个场景的原则。每个类别应对应一种特定的交互类型:回复消息、确认操作、拒绝请求。不要在一个类别中混合不同的场景——这会混淆用户并使委托中的处理复杂化。
对于用户需要在不打开应用程序的情况下输入文本的场景,使用UNTextInputAction:在即时通讯工具中回复、评论、快速笔记。文本操作可提高参与度——用户通过2次点击完成有意义的操作,而不是在打开的应用程序中需要5次以上的点击。
对于危险操作(删除、屏蔽),使用destructive选项。iOS会将这些按钮标红,警告用户操作的不可逆性。对于需要解锁设备的操作(查看个人数据),设置authenticationRequired——系统会在执行前要求Face ID或密码。
在不同设备上测试类别:在带有3D Touch的iPhone上、在不带3D Touch的iPhone上(长按)、在iPad上和Mac上。类别在不同Apple平台上的行为可能略有不同。特别注意——CarPlay:类别按钮显示在汽车屏幕上,但文本输入不可用,因此UNTextInputAction在CarPlay中会自动隐藏。在watchOS上,类别不受支持——所有通知都不显示操作按钮。
常见问题
没有限制——iOS不对UNNotificationCategory的数量设置限制。但实践中建议不超过10–15个类别,以免使委托中的处理复杂化。每个类别最多可以包含4个操作(按钮)。超过4个操作将被系统忽略。
实现UNUserNotificationCenterDelegate委托和didReceive response方法。检查response.actionIdentifier:UNNotificationDismissActionIdentifier——滑动删除,UNNotificationDefaultActionIdentifier——点击正文,或您自定义的按钮标识符。对于文本按钮,文本可通过response.userText获取。
Category——确定通知的交互式操作(按钮)。Thread-id——在通知中心按主题对通知进行分组。两个键都在APNS负载中指定。Category和thread-id不相关:通知可以有类别而没有thread-id,反之亦然。
是的,UNNotificationCategory在macOS 10.14+(Mojave)上使用UserNotifications框架的应用程序中得到支持。类别在macOS上的行为与iOS类似:点击通知时显示按钮,通过UNUserNotificationCenterDelegate进行处理。
建议在每次应用程序启动时通过setNotificationCategories注册类别。系统在每次调用时用新的类别集替换旧的。如果不更新,类别会在启动之间保留,但代码更改后,旧类别可能不匹配新类别。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。