Notification Content Extension — bản chất, giao diện tùy chỉnh và thiết lập trong iOS

Tác giả: IT Sectr Đã đăng: 2026-06-15 Thời gian đọc: 9 phút

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 tạo giao diện tùy chỉnh cho thông báo đẩy thay vì mẫu hệ thống tiêu chuẩn
  • Kiến trúc dựa trên giao thức UNNotificationContentExtension với các phương thức didReceive(_:with:) và didReceive(_:withCompletionHandler:)
  • Tiện ích mở rộng có thể hiển thị tệp đính kèm đa phương tiện — hình ảnh, âm thanh và video — ngay trong thông báo mà không cần mở ứng dụng
  • Thông báo tương tác hỗ trợ các hành động tùy chỉnh với phản hồi và nhập văn bản
  • Kích thước giao diện bị giới hạn — chiều cao tối đa của thông báo tùy chỉnh là 320 điểm trên iPhone và 352 trên iPad

Notification Content Extension là gì

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.

Tạo giao diện thông báo tùy chỉnh

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.

Kích thước và giới hạn giao diện

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.

Kết nối với ứng dụng chính

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.

swift
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()
        }
    }
}

Giao thức UNNotificationContentExtension

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.

Phương thức didReceive:with:

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.

Quản lý trình phát đa phương tiện

Giao thức bao gồm các phương thức tùy chọn cho nút play/pause: mediaPlay, mediaPausemediaPlayPauseButtonType. 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.

Tệp đính kèm đa phương tiện và xử lý

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.

Định dạng được hỗ trợ

Đố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ế.

Làm việc với tài nguyên security-scoped

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.

swift
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)

Thông báo tương tác và hành động

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.

Loại hành động

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.

swift
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

Sự khác biệt giữa Notification Content Extension và Service Extension là gì?

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.

Những ngôn ngữ lập trình nào được hỗ trợ?

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ó thể sử dụng SwiftUI trong Notification Content Extension không?

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.

Có thể đính kèm bao nhiêu tệp đa phương tiện vào một thông báo?

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).

Làm thế nào để truyền dữ liệu từ tiện ích mở rộng vào ứng dụng chính?

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

  • Notification Content Extension thay thế giao diện thông báo tiêu chuẩn bằng giao diện tùy chỉnh với bất kỳ phần tử trực quan nào
  • Kiến trúc sử dụng giao thức UNNotificationContentExtension với các phương thức didReceive để cập nhật giao diện
  • UNNotificationAttachment cung cấp tệp đính kèm đa phương tiện với tải xuống nền tự động và truy cập security-scoped
  • Các hành động tương tác hỗ trợ nhập văn bản và thao tác phá hủy qua UNNotificationAction
  • Chiều cao tối đa của giao diện — 320 điểm trên iPhone, để thích ứng nội dung nên sử dụng UIScrollView
  • Trao đổi dữ liệu với ứng dụng chính — chỉ qua App Group và thư mục dùng chung trên đĩa

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.

Thảo luận dự án

Đọc thêm