Notification Category:什么是通知类别、有哪些类别及在iOS中的工作原理

作者: IT Sectr 发布日期: 2026-03-20 阅读时间: 8 分钟

Notification Category(通知类别)是iOS的一种机制,用于按类型对推送通知进行分组并附加可自定义的操作。类别决定了在3D Touch或长按通知时显示哪些按钮,以及系统如何处理此类型的传入通知。根据Apple Developer DocumentationUNNotificationCategory在UNUserNotificationCenter中注册,并通过APNS负载中的category字段与通知关联。

要点

  • Notification Category——iOS用于对推送通知进行分类并添加操作的机制
  • UNNotificationCategory——使用UNNotificationAction集合注册类别的类
  • 操作——通知下方的按钮:UNTextInputAction用于文本输入,UNNotificationAction用于点击
  • 关联——通过aps字典中的category键在APNS负载中指定类别
  • 与Android的区别——iOS Category管理操作,Android Channel管理重要性和声音

什么是iOS中的Notification Category?

Notification Category是iOS(从8.0版本开始)的一项功能,允许开发者对推送通知进行分类并添加交互式操作。当用户收到通知并用力度按(3D Touch)或长按时,会出现由类别定义的按钮。

类别通过UNNotificationCategory对象注册,该对象包含标识符、操作数组和可选的显示参数。系统使用APNS负载中的类别标识符来查找已注册的类别并显示相应的操作。

与Android Notification Channel不同,iOS Category不管理重要性、声音或振动。它唯一的任务是为通知提供交互能力:回复、确认、取消或文本输入按钮。

类别的必要性

类别对于在iOS上显示推送通知不是必需的。通知无论如何都会显示——如果类别已注册则显示按钮,否则不显示。类别仅用于为通知添加交互性。

通知类别如何工作?

类别机制由四个阶段组成:在客户端注册类别、发送包含类别的APNS负载、系统识别类别以及处理用户操作。

  • 注册——应用程序创建带有操作数组的UNNotificationCategory并在UNUserNotificationCenter中注册
  • 发送——服务器在APNS负载中包含category键,其值与类别标识符匹配
  • 显示——iOS显示通知,在force touch时显示与类别关联的按钮
  • 处理——用户按下按钮,触发UNUserNotificationCenterDelegate.didReceive response

类别中的操作可以有两种类型:foreground(打开应用程序)和background(在后台执行)。对于后台操作,应用程序在UNNotificationActionHandler中有有限的时间(约30秒)进行处理。

注册类别时的选项

UNNotificationCategory通过options参数支持多个选项:customDismissAction——在滑动通知时接收事件,allowInCarPlay——在CarPlay中显示操作,hiddenPreviewsBodyPlaceholder——隐藏预览的自定义文本。正确配置选项可改善不同Apple设备上的用户体验。

UNNotificationAction:操作类型

iOS为通知类别提供两种类型的操作。每种类型都有其自身的用途和与用户的交互方式。

类型描述示例
简单操作UNNotificationAction带有标题和选项的按钮(destructive、foreground、authenticationRequired)“删除”、“查看”
文本输入UNTextInputAction打开带有提示的文本输入字段的按钮“回复”、“评论”

UNTextInputAction——iOS的独特功能。按下“回复”按钮时,系统会显示一个文本字段供用户输入回复。输入的文本与操作标识符一起传递给委托。这允许在不打开应用程序的情况下快速回复。

操作选项:options.authenticationRequired——需要解锁设备,options.destructive——将按钮标红(用于危险操作),options.foreground——按下后打开应用程序。

在iOS代码中配置类别

类别在应用程序启动时注册,通常在didFinishLaunchingWithOptions方法中。注册通过UNUserNotificationCenter进行,在请求通知权限之后。类别可以在每次启动时更新——旧版本会被新版本替换。

swift
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频道的区别

熟悉Android Notification Channels的开发者经常将它们与iOS Notification Categories混淆。尽管名称相似,但这些机制解决不同的任务并以不同的方式工作。

  • 目的——Android Channels管理通知的重要性和可见性;iOS Categories管理交互式操作
  • 必要性——Android Channel是显示通知所必需的;iOS Category是可选的
  • 用户控制——Android用户在系统设置中配置频道;iOS类别对用户不直接可见
  • 分组——Android Channels可以合并成组(ChannelGroup);iOS Categories不能分组

在两个平台上都可以结合两种机制:在Android中,通知可以属于带有NotificationCompat操作的频道;在iOS中,类别补充了在iOS中称为thread-id的频道,用于在通知中心对通知进行分组。

带类别的APNS负载

为了让通知显示类别按钮,服务器必须在APNS负载中包含category键。没有这个键,系统将不知道对通知应用哪个类别。

json
{
    "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中可以注册多少个类别?

没有限制——iOS不对UNNotificationCategory的数量设置限制。但实践中建议不超过10–15个类别,以免使委托中的处理复杂化。每个类别最多可以包含4个操作(按钮)。超过4个操作将被系统忽略。

如何处理类别按钮的点击?

实现UNUserNotificationCenterDelegate委托和didReceive response方法。检查response.actionIdentifier:UNNotificationDismissActionIdentifier——滑动删除,UNNotificationDefaultActionIdentifier——点击正文,或您自定义的按钮标识符。对于文本按钮,文本可通过response.userText获取。

category和thread-id有什么区别?

Category——确定通知的交互式操作(按钮)。Thread-id——在通知中心按主题对通知进行分组。两个键都在APNS负载中指定。Category和thread-id不相关:通知可以有类别而没有thread-id,反之亦然。

类别在macOS上有效吗?

是的,UNNotificationCategory在macOS 10.14+(Mojave)上使用UserNotifications框架的应用程序中得到支持。类别在macOS上的行为与iOS类似:点击通知时显示按钮,通过UNUserNotificationCenterDelegate进行处理。

是否需要在每次启动时更新类别?

建议在每次应用程序启动时通过setNotificationCategories注册类别。系统在每次调用时用新的类别集替换旧的。如果不更新,类别会在启动之间保留,但代码更改后,旧类别可能不匹配新类别。

总结

  • Notification Category——iOS用于向推送通知添加交互式操作的机制
  • UNNotificationCategory——结合标识符、UNNotificationAction数组和选项的类
  • UNTextInputAction——带有文本输入字段的操作,用于无需打开应用即可快速回复
  • APNS负载——aps字典中的category键将通知与已注册的类别关联
  • 最多4个操作——每个类别最大按钮数,其余被系统忽略
  • 操作选项——foreground(打开应用)、destructive(红色按钮)、authenticationRequired
  • 与Android的区别——iOS Category负责操作,Android Channel负责重要性和声音

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读