Notification Category (danh mục thông báo) là cơ chế iOS để nhóm các thông báo push theo loại và đính kèm các hành động tùy chỉnh vào chúng. Danh mục xác định những nút nào được hiển thị khi sử dụng 3D Touch hoặc nhấn giữ lâu trên thông báo, cũng như cách hệ thống xử lý các thông báo đến thuộc loại này. Theo Tài liệu dành cho nhà phát triển Apple, UNNotificationCategory được đăng ký trong UNUserNotificationCenter và liên kết với thông báo qua trường category trong tải trọng APNS.
Những điểm chính
Notification Category là một tính năng iOS (từ phiên bản 8.0) cho phép nhà phát triển phân loại thông báo push và thêm các hành động tương tác vào chúng. Khi người dùng nhận được thông báo và nhấn mạnh (3D Touch) hoặc nhấn giữ lâu, các nút được xác định bởi danh mục sẽ xuất hiện. Điều này làm cho thông báo trở nên tương tác và cho phép người dùng thực hiện hành động mà không cần mở ứng dụng.
Một danh mục được đăng ký thông qua đối tượng UNNotificationCategory, chứa một định danh, một mảng các hành động và các tham số hiển thị tùy chọn. Hệ thống sử dụng định danh danh mục từ tải trọng APNS để tìm danh mục đã đăng ký và hiển thị các nút tương ứng.
Không giống như Android Notification Channel, iOS Category không quản lý mức độ quan trọng, âm thanh hay rung. Mục đích duy nhất của nó là cung cấp khả năng tương tác cho thông báo: các nút trả lời, xác nhận, hủy bỏ hoặc nhập văn bản.
Các danh mục không bắt buộc để hiển thị thông báo push trên iOS. Thông báo sẽ xuất hiện dù thế nào đi nữa — có nút nếu danh mục được đăng ký, hoặc không có nút. Danh mục chỉ cần thiết để thêm tính tương tác cho thông báo.
Cơ chế danh mục bao gồm bốn giai đoạn: đăng ký danh mục trên máy khách, gửi tải trọng APNS với danh mục, hệ thống nhận dạng danh mục và xử lý hành động của người dùng.
Các hành động trong danh mục có thể thuộc hai loại: foreground (mở ứng dụng) và background (thực thi trong nền). Đối với hành động nền, ứng dụng có thời gian giới hạn (khoảng 30 giây) để xử lý trong UNNotificationActionHandler.
UNNotificationCategory hỗ trợ một số tùy chọn qua tham số options: customDismissAction — nhận sự kiện khi vuốt để loại bỏ thông báo, allowInCarPlay — hiển thị hành động trong CarPlay, hiddenPreviewsBodyPlaceholder — văn bản giữ chỗ tùy chỉnh cho bản xem trước ẩn.
iOS cung cấp hai loại hành động cho danh mục thông báo. Mỗi loại có mục đích riêng và cách tương tác với người dùng riêng.
| Loại | Lớp | Mô tả | Ví dụ |
|---|---|---|---|
| Hành động đơn giản | UNNotificationAction | Một nút có tiêu đề và các tùy chọn (destructive, foreground, authenticationRequired) | “Xóa”, “Xem” |
| Nhập văn bản | UNTextInputAction | Một nút mở trường nhập văn bản với văn bản giữ chỗ | “Trả lời”, “Bình luận” |
UNTextInputAction là một tính năng độc đáo của iOS. Khi người dùng chạm vào nút “Trả lời”, hệ thống hiển thị một trường văn bản nơi người dùng nhập câu trả lời của họ. Văn bản đã nhập được chuyển đến đại biểu cùng với định danh hành động. Điều này cho phép triển khai trả lời nhanh mà không cần mở ứng dụng.
Tùy chọn hành động: options.authenticationRequired — yêu cầu mở khóa thiết bị, options.destructive — làm nổi bật nút màu đỏ (cho hành động nguy hiểm), options.foreground — mở ứng dụng sau khi chạm.
Các danh mục được đăng ký khi khởi động ứng dụng, thường trong phương thức didFinishLaunchingWithOptions. Việc đăng ký được thực hiện thông qua UNUserNotificationCenter, sau khi yêu cầu quyền thông báo. Các danh mục có thể được cập nhật mỗi lần khởi động — các phiên bản cũ được thay thế bằng phiên bản mới.
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "Trả lời",
options: [.foreground],
textInputButtonTitle: "Gửi",
textInputPlaceholder: "Nhập tin nhắn..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "Xóa",
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
}
}
Sau khi đăng ký danh mục, bất kỳ thông báo nào có category = “message” trong tải trọng APNS sẽ hiển thị các nút “Trả lời” và “Xóa”. Việc xử lý chạm diễn ra trong userNotificationCenter:didReceive response, nơi actionIdentifier xác định nút nào đã được nhấn.
Khi người dùng chạm vào nút danh mục, iOS gọi UNUserNotificationCenterDelegate với một đối tượng UNNotificationResponse. response.actionIdentifier chứa định danh của nút đã chạm, và response.notification.request.content.userInfo chứa dữ liệu tùy chỉnh từ tải trọng.
Các nhà phát triển quen thuộc với Kênh thông báo Android thường nhầm lẫn chúng với Danh mục thông báo iOS. Mặc dù tên gọi tương tự, các cơ chế này giải quyết các nhiệm vụ khác nhau và hoạt động khác nhau.
Cả hai nền tảng đều có thể kết hợp cả hai cơ chế: trên Android, thông báo có thể thuộc về một kênh với các hành động từ NotificationCompat, trong khi trên iOS, danh mục bổ sung cho các kênh, mà trong iOS được gọi là thread-id và dùng để nhóm thông báo trong trung tâm thông báo.
Để thông báo hiển thị với các nút danh mục, máy chủ phải bao gồm khóa category trong tải trọng APNS. Nếu không có khóa này, hệ thống sẽ không biết danh mục nào để áp dụng cho thông báo.
{
"aps": {
"alert": {
"title": "Tin nhắn mới",
"body": "Anna: Xin chào! Bạn khỏe không?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
Khóa category phải khớp chính xác với định danh đã đăng ký thông qua setNotificationCategories trên máy khách. Phân biệt chữ hoa chữ thường — “message” và “Message” được coi là các danh mục khác nhau. Nếu không tìm thấy danh mục, thông báo xuất hiện mà không có nút, không có lỗi trong nhật ký.
Nếu máy chủ gửi thông báo với danh mục chưa được đăng ký trên máy khách, iOS bỏ qua danh mục và hiển thị thông báo không có nút. Lỗi không được ghi lại và ứng dụng không biết về sự không khớp. Khuyến nghị đồng bộ hóa danh sách danh mục giữa máy chủ và máy khách.
Khi thiết kế danh mục thông báo trong iOS, hãy tuân theo nguyên tắc một danh mục — một kịch bản. Mỗi danh mục nên tương ứng với một loại tương tác cụ thể: trả lời tin nhắn, xác nhận hành động, từ chối yêu cầu. Đừng trộn lẫn các kịch bản khác nhau trong cùng một danh mục.
Sử dụng UNTextInputAction cho các kịch bản mà người dùng cần nhập văn bản mà không cần mở ứng dụng: trả lời tin nhắn, bình luận, ghi chú nhanh. Các hành động văn bản tăng mức độ tương tác — người dùng thực hiện một hành động có ý nghĩa trong 2 lần chạm thay vì 5+ lần trong ứng dụng.
Đối với các hành động nguy hiểm (xóa, chặn), hãy sử dụng tùy chọn destructive. iOS sẽ làm nổi bật các nút này bằng màu đỏ, cảnh báo người dùng về tính không thể đảo ngược của hành động. Đối với các hành động yêu cầu mở khóa thiết bị (xem dữ liệu cá nhân), hãy chỉ định authenticationRequired.
Kiểm tra danh mục trên các thiết bị khác nhau: trên iPhone có 3D Touch, trên iPhone không có 3D Touch (nhấn giữ), trên iPad và trên Mac. Hành vi của danh mục có thể khác nhau đôi chút giữa các nền tảng Apple. Đặc biệt chú ý đến CarPlay: các nút danh mục xuất hiện trên màn hình xe hơi và nên được thiết kế với văn bản tối thiểu để đảm bảo an toàn cho người lái.
Câu hỏi thường gặp
Không có giới hạn — iOS không đặt giới hạn về số lượng UNNotificationCategory. Tuy nhiên, trong thực tế, khuyến nghị không sử dụng quá 10–15 danh mục để tránh làm phức tạp việc xử lý trong đại biểu. Mỗi danh mục có thể chứa tối đa 4 hành động (nút). Hơn 4 hành động sẽ bị hệ thống bỏ qua.
Triển khai giao thức UNUserNotificationCenterDelegate và phương thức didReceive. Kiểm tra response.actionIdentifier: UNNotificationDismissActionIdentifier — vuốt để loại bỏ, UNNotificationDefaultActionIdentifier — chạm vào thân, hoặc định danh nút tùy chỉnh của bạn. Đối với nút nhập văn bản, văn bản có sẵn qua response.userText.
Category — xác định các hành động tương tác (nút) cho thông báo. Thread-id — nhóm các thông báo trong Trung tâm thông báo theo chủ đề. Cả hai khóa đều được chỉ định trong tải trọng APNS. Category và thread-id không liên quan: một thông báo có thể có danh mục nhưng không có thread-id, và ngược lại.
Có, UNNotificationCategory được hỗ trợ trên macOS 10.14+ (Mojave) trong các ứng dụng sử dụng framework UserNotifications. Hành vi của danh mục trên macOS tương tự iOS: khi nhấp vào thông báo, các nút được hiển thị và việc xử lý diễn ra thông qua UNUserNotificationCenterDelegate.
Khuyến nghị đăng ký danh mục mỗi lần khởi động ứng dụng qua setNotificationCategories. Hệ thống thay thế bộ danh mục cũ bằng bộ mới mỗi lần gọi. Nếu bạn không cập nhật, danh mục vẫn tồn tại giữa các lần khởi động, nhưng khi mã thay đổi, danh mục cũ có thể gây ra hành vi không mong muốn.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm