Notification Content Extension — là một loại tiện ích mở rộng iOS thay thế mẫu thông báo đẩy tiêu chuẩn bằng giao diện người dùng tùy chỉnh hoàn toàn. Nhà phát triển có khả năng hiển thị hình ảnh, trình phát âm thanh, nút hành động, thanh tiến trình và hoạt ảnh tùy chỉnh bên trong thông báo, mở rộng biểu ngữ tiêu chuẩn thành một ứng dụng nhỏ hoàn chỉnh. Theo dữ liệu WWDC 2025, tiện ích mở rộng sử dụng UNNotificationContentExtension và hỗ trợ tối đa 4 tệp đính kèm đa phương tiện trong một thông báo, cũng như xử lý các hành động tương tác qua UNNotificationAction.
Chính
Notification Content Extension — là một tiện ích mở rộng ứng dụng ghi đè hiển thị thông báo đẩy trên iOS. Thay vì biểu ngữ tiêu chuẩn với tiêu đề, nội dung tin nhắn và các nút, có thể hiển thị giao diện được phát triển hoàn toàn trong Interface Builder hoặc theo chương trình qua UIKit hoặc SwiftUI.
Không giống như Notification Service Extension, thay đổi nội dung trước khi hiển thị, Content Extension chỉ chịu trách nhiệm về trình bày trực quan. Tiện ích mở rộng nhận thông báo đã sẵn sàng sau tất cả các sửa đổi và quyết định cách hiển thị nó. Đây là sự khác biệt chính giữa hai loại tiện ích mở rộng thông báo.
Tiện ích mở rộng được kích hoạt khi người dùng thực hiện cử chỉ mở rộng — cuộn thông báo xuống hoặc nhấp vào nó (tùy thuộc vào model thiết bị). iOS khởi chạy quy trình tiện ích mở rộng, tạo bộ điều khiển từ nib hoặc storyboard được chỉ định và chuyển thông báo qua UNNotificationContentExtension.
Phát triển bắt đầu bằng cách thêm target mới trong Xcode với mẫu Notification Content Extension. Xcode tạo tệp MainInterface.storyboard và một lớp kế thừa từ UIViewController triển khai giao thức UNNotificationContentExtension.
Chiều cao tối đa của vùng tùy chỉnh — 320 điểm trên iPhone (đối với model màn hình lớn) và 352 điểm trên iPad. Nội dung vượt quá các ranh giới này sẽ bị cắt. Để thích ứng với các kích thước khác nhau, nên sử dụng Auto Layout và UIScrollView cho nội dung có thể cuộn. Chiều rộng luôn bằng chiều rộng thông báo và tự động thay đổi khi xoay thiết bị.
Apple Human Interface Guidelines cảnh báo: giao diện thông báo phải ngắn gọn và chỉ chứa một phần tử chính — hình ảnh, trình phát, bản đồ hoặc biểu mẫu nhập nhanh. Nhiều phần tử tương tác làm quá tải người dùng và phức tạp hóa tương tác.
App Group — cơ chế duy nhất để trao đổi dữ liệu giữa tiện ích mở rộng và ứng dụng chính. Thông qua thư mục dùng chung của App Group, có thể truyền hình ảnh được lưu trong bộ nhớ đệm, mã thông báo và cài đặt. Các lệnh gọi trực tiếp đến API của ứng dụng chính hoặc truy cập vào UserDefaults của nó không khả dụng do sự cô lập tiến trình.
class NotificationViewController: UIViewController {
func didReceive(
_ notification: UNNotification
) {
guard let attachment = notification
.request.content.attachments.first()
else { return }
if attachment.url.startAccessingSecurityScopedResource() {
imageView.image = UIImage(contentsOfFile:
attachment.url.path)
attachment.url.stopAccessingSecurityScopedResource()
}
}
}
UNNotificationContentExtension — giao thức chính xác định vòng đời của thông báo tùy chỉnh. Giao thức cung cấp các phương thức để nhận nội dung, xử lý hành động và quản lý giao diện.
didReceive(_:with:) được gọi khi nhận được thông báo. Tiện ích mở rộng nhận đối tượng UNNotification và UNNotificationContentExtensionMediaPlayPauseButtonType để quản lý trình phát đa phương tiện. Trong phương thức này, cần thiết lập giao diện — tải hình ảnh, khởi tạo trình phát hoặc hiển thị dữ liệu. Hệ thống gọi phương thức này mỗi khi thông báo được cập nhật theo thời gian thực.
Cần lưu ý rằng tiện ích mở rộng có thời gian giới hạn để thực thi — khoảng 30 giây cho toàn bộ chu kỳ hiển thị. Nếu giao diện không được chuẩn bị trong thời gian này, iOS sẽ hiển thị thông báo hệ thống. Đối với tài nguyên nặng — tải hình ảnh từ mạng, giải mã video — nên sử dụng các hoạt động không đồng bộ với bộ nhớ đệm trước qua App Group.
Giao thức bao gồm các phương thức tùy chọn cho nút play/pause: mediaPlay, mediaPause và mediaPlayPauseButtonType. Nếu thông báo chứa nội dung âm thanh hoặc video, tiện ích mở rộng có thể hiển thị trình phát tích hợp với phần tử điều khiển hệ thống. iOS tự động thêm nút phát ở góc trên bên phải của tiện ích mở rộng khi trả về loại nút phù hợp.
UNNotificationAttachment — đối tượng chứa dữ liệu đa phương tiện được đính kèm với thông báo. Hình ảnh, tệp âm thanh và video được thêm vào ở giai đoạn tạo thông báo trên máy chủ hoặc trong Notification Service Extension qua UNNotificationAttachment.
Đối với hình ảnh: JPEG, PNG, GIF, HEIF. Đối với âm thanh: MP3, AAC, ALAC, WAV. Đối với video: MPEG-4, H.264, HEVC. Kích thước tối đa của mỗi tệp đính kèm — 50 MB, tối đa 4 tệp đính kèm cho mỗi thông báo. Hệ thống tự động tải xuống tệp đính kèm trong nền trước khi hiển thị thông báo và cung cấp cho tiện ích mở rộng quyền truy cập vào URL cục bộ thông qua tài nguyên security-scoped.
Theo Apple, tiện ích mở rộng không nên tự tải xuống phương tiện — UNNotificationAttachment đã chứa URL cục bộ sau khi hệ thống hoàn tất tải xuống. Tuy nhiên, nếu tệp đính kèm không được tải kịp (ví dụ: do kết nối kém), tiện ích mở rộng có thể hiển thị văn bản giữ chỗ hoặc thay thế.
Mỗi UNNotificationAttachment cung cấp security-scoped URL mà tiện ích mở rộng phải truy cập qua startAccessingSecurityScopedResource() và giải phóng qua stopAccessingSecurityScopedResource(). Các phương thức này phải được gọi theo cặp — nếu không tài nguyên sẽ không được giải phóng và gây rò rỉ quyền truy cập.
let attachment = notification.request.content.attachments.first()
guard attachment.url.startAccessingSecurityScopedResource()
else { return }
defer { attachment.url.stopAccessingSecurityScopedResource() }
let data = try Data(contentsOf: attachment.url)
imageView.image = UIImage(data: data)
Notification Content Extension hỗ trợ các hành động tương tác tùy chỉnh — các nút hiển thị bên dưới nội dung thông báo. Các hành động được đăng ký khi tạo danh mục thông báo qua UNNotificationCategory và có thể là hành động phá hủy, văn bản hoặc nền.
UNNotificationAction — hành động đơn giản với tiêu đề và cờ phá hủy tùy chọn. UNTextInputNotificationAction — hành động có trường nhập văn bản, ví dụ để trả lời nhanh tin nhắn. Cả hai loại đều hỗ trợ tùy chọn UNNotificationActionOptions.authenticationRequired — yêu cầu mở khóa thiết bị trước khi thực thi.
Tiện ích mở rộng nhận hành động đã chọn qua phương thức didReceive(_:withCompletionHandler:), nơi đối tượng UNNotificationResponse với mã định danh hành động và văn bản tùy chọn được truyền vào. Tiện ích mở rộng có thể tự xử lý phản hồi hoặc chuyển nó đến ứng dụng chính qua vùng chứa App Group dùng chung.
let category = UNNotificationCategory(
identifier: "message",
actions: [
UNTextInputNotificationAction(
identifier: "reply",
title: "Reply",
options: .authenticationRequired
),
UNNotificationAction(
identifier: "mark_read",
title: "Mark Read",
options: .foreground
)
],
intentIdentifiers: []
)
Câu hỏi thường gặp
Content Extension chịu trách nhiệm hiển thị trực quan thông báo, còn Service Extension chịu trách nhiệm thay đổi nội dung trước khi hiển thị. Content Extension hoạt động sau Service Extension và không thể thay đổi tải trọng của thông báo.
Swift và Objective-C cho UIKit. Từ iOS 16, SwiftUI cũng được hỗ trợ để tạo giao diện thông báo qua NotificationContentView với các bổ ngữ kích thước và cấu hình.
Có, từ iOS 16, tiện ích mở rộng có thể sử dụng SwiftUI qua UIHostingController. Tuy nhiên, tất cả năng lực của UIKit — kích thước, ràng buộc, tài nguyên security-scoped — vẫn được giữ nguyên và áp dụng cho nội dung SwiftUI.
Tối đa 4 tệp đính kèm cho mỗi thông báo. Mỗi tệp đính kèm có kích thước tối đa 50 MB. Các định dạng được hỗ trợ: hình ảnh (JPEG, PNG, HEIF), âm thanh (MP3, AAC) và video (MPEG-4, H.264).
Qua App Group — thư mục dùng chung trên đĩa. UserDefaults với hậu tố app group cũng hoạt động. Các lệnh gọi trực tiếp đến API ứng dụng chính không khả dụng do sự cô lập tiến trình của tiện ích mở rộng.
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