Notification Content Extension — khái niệm và cách tạo giao diện tùy chỉnh cho iOS

Tác giả: IT Sectr Đã đăng: 2026-03-21 Thời gian đọc: 8 phút

Notification Content Extension là một phần mở rộng iOS cho phép thay thế giao diện thông báo push tiêu chuẩn bằng một UIView tùy chỉnh. Nhà phát triển có toàn quyền kiểm soát hiển thị nội dung: hình ảnh, video, hoạt ảnh, phông chữ tùy chỉnh và các yếu tố tương tác. Theo Apple Developer, 2025, Notification Content Extension hỗ trợ bất kỳ giao diện UIKit nào trong không gian giới hạn của thông báo.

Những điểm chính

  • Notification Content Extension — phần mở rộng iOS cho UI thông báo push tùy chỉnh.
  • Phần mở rộng triển khai giao thức UNNotificationContentExtension với phương thức bắt buộc didReceive.
  • Giao diện tùy chỉnh được tạo trong Storyboard và có thể chứa bất kỳ thành phần UIKit nào.
  • Kích thước tối đa của phần mở rộng là 50 MB và không được vượt quá 12 MB khi nén.
  • Phần mở rộng được kích hoạt cho các thông báo có categoryIdentifier được chỉ định.

Notification Content Extension là gì

Notification Content Extension là một phần mở rộng ứng dụng trong iOS thay thế mẫu hiển thị thông báo push tiêu chuẩn bằng một UIView tùy chỉnh. Không giống như thông báo thông thường, nơi nội dung bị giới hạn ở tiêu đề, phụ đề và nội dung, phần mở rộng cho phép hiển thị bất kỳ giao diện UIKit nào: bản đồ có tọa độ, biểu đồ, thư viện ảnh hoặc biểu mẫu nhập liệu.

Cách thức hoạt động

Khi iOS nhận được thông báo push với categoryIdentifier được chỉ định, hệ thống sẽ kiểm tra xem có phần mở rộng nào được đăng ký cho danh mục này không. Nếu có — hệ thống khởi chạy phần mở rộng trong một tiến trình riêng và chuyển nội dung thông báo cho nó. Phần mở rộng hiển thị giao diện của riêng mình thay vì giao diện tiêu chuẩn. Người dùng tương tác với giao diện tùy chỉnh mà không cần mở ứng dụng chính.

Sự khác biệt so với Notification Service Extension

Điều quan trọng là không nhầm lẫn Notification Content Extension với Notification Service Extension. Service Extension xử lý nội dung trước khi hiển thị thông báo (tải tệp đính kèm, giải mã). Content Extension thay thế giao diện sau khi nhận được nội dung đã sẵn sàng. Cả hai phần mở rộng có thể hoạt động cùng nhau: Service Extension chuẩn bị dữ liệu, Content Extension hiển thị chúng.

Đặc điểmContent ExtensionService Extension
Mục đíchUI thông báo tùy chỉnhSửa đổi nội dung trước khi hiển thị
Thời gian thực thiKhi người dùng nhìn thấy thông báoTối đa 30 giây trong nền
Giao diệnUIView UIKit đầy đủKhông có giao diện
APIUNNotificationContentExtensionUNNotificationServiceExtension

Giới hạn của phần mở rộng

Notification Content Extension hoạt động trong một tiến trình cách ly với tài nguyên hạn chế. Phần mở rộng không có quyền truy cập vào bộ nhớ chính của ứng dụng qua NSUserDefaults, ngoại trừ App Group. Kích thước phần mở rộng được giới hạn ở 50 MB ở trạng thái giải nén. Thời gian hiển thị nội dung cũng bị giới hạn — nếu phần mở rộng không hoàn tất cập nhật trong thời gian hợp lý, hệ thống sẽ đóng nó.

Tạo Notification Content Extension trong Xcode

Để tạo phần mở rộng trong Xcode, cần thêm một target mới thuộc loại Notification Content Extension. Xcode sẽ tự động tạo MainInterface.storyboard với một bộ điều khiển kế thừa từ UIViewController và triển khai UNNotificationContentExtension.

Thêm target phần mở rộng

Trong Xcode, chọn File → New → Target → Notification Content Extension. Nhập tên phần mở rộng, ngôn ngữ (Swift hoặc Objective-C) và đảm bảo dự án được kết nối với cùng một nhóm phát triển. Sau khi tạo target, một thư mục xuất hiện với ba tệp: MainInterface.storyboard, Info.plist và tệp bộ điều khiển.

Cấu hình Info.plist

Trong Info.plist của phần mở rộng, bắt buộc phải chỉ định mảng NSExtensionAttributes với khóa UNNotificationExtensionCategory. Mảng này chứa các định danh của danh mục thông báo mà phần mở rộng sẽ được kích hoạt. Khóa tùy chọn UNNotificationExtensionInitialContentSizeRatio xác định tỷ lệ khung hình ban đầu của giao diện tùy chỉnh để định vị chính xác.

Kiến trúc thư mục phần mở rộng

Nên duy trì kiến trúc sạch trong target phần mở rộng: một thư mục riêng cho bộ điều khiển, một thư mục riêng cho các View tùy chỉnh. Vì phần mở rộng là một tệp nhị phân riêng biệt, mã của ứng dụng chính không thể truy cập trực tiếp. Để chia sẻ mã, hãy tạo một framework riêng hoặc sử dụng App Group cho dữ liệu.

Triển khai giao thức UNNotificationContentExtension

UNNotificationContentExtension là giao thức mà bộ điều khiển trong Notification Content Extension phải triển khai. Phương thức bắt buộc duy nhất là didReceive(_:with:), được gọi khi nhận được thông báo. Bộ điều khiển nhận được thông báo và bộ điều khiển xem đã sẵn sàng cần được cập nhật với dữ liệu.

Triển khai cơ bản bộ điều khiển

Bộ điều khiển phần mở rộng phải kế thừa từ UIViewController và triển khai UNNotificationContentExtension. Storyboard hoặc xib được liên kết với bộ điều khiển này. Khi nhận được thông báo, phương thức didReceive chuyển nội dung và bộ điều khiển cập nhật các view của nó.

swift
import UIKit
import UserNotifications
import UserNotificationsUI

class CustomNotificationViewController: UIViewController {

    @IBOutlet var titleLabel: UILabel!
    @IBOutlet var customImageView: UIImageView!

    func didReceive(
        notification: UNNotification
    ) {
        let content = notification.request.content
        titleLabel.text = content.title
        loadAttachment(content.attachments.first)
    }

    private func loadAttachment(attachment: UNNotificationAttachment?) {
        guard let url = attachment?.URL else { return }
        if let image = UIImage(contentsOfFile: url.path) {
            customImageView.image = image
        }
    }
}

extension CustomNotificationViewController: UNNotificationContentExtension {
    func didReceive(
        notification: UNNotification
    ) {
        didReceive(notification: notification)
    }
}

Kiểm soát kích thước giao diện

Hệ thống xác định kích thước giao diện tùy chỉnh dựa trên khóa UNNotificationExtensionInitialContentSizeRatio trong Info.plist và nội dung hiện tại. Nên đặt khóa này thành 0.1 để có kích thước ban đầu tối thiểu, sau đó thay đổi kích thước qua preferredContentSize sau khi tải nội dung.

Tùy chỉnh giao diện và tương tác

Notification Content Extension mang lại sự tự do hoàn toàn trong việc tạo giao diện. Có thể sử dụng bất kỳ thành phần UIKit nào: UITableView, MKMapView, WKWebView, UIStackView. Tuy nhiên, cần xem xét không gian giới hạn của thông báo và tối ưu hóa hiệu suất.

Thêm bản đồ vào thông báo

Một trong những tình huống phổ biến là hiển thị bản đồ với vị trí. Để làm điều này, thêm MKMapView vào Storyboard của phần mở rộng và bộ điều khiển chuyển tọa độ từ nội dung thông báo. Đừng quên thêm MapKit vào target của phần mở rộng. Khi sử dụng bản đồ, hãy xem xét giới hạn bộ nhớ của phần mở rộng — việc tải các ô phức tạp có thể vượt quá tài nguyên khả dụng.

Hoạt ảnh và chuyển tiếp

Notification Content Extension hỗ trợ hoạt ảnh UIView, bao gồm thay đổi kích thước, di chuyển và độ trong suốt của các phần tử. Khi vào chế độ mở rộng của thông báo, có thể khởi chạy hoạt ảnh xuất hiện nội dung. Hoạt ảnh phải ngắn (tối đa 0,5 giây) và không cản trở tương tác của người dùng với thông báo. Tránh hoạt ảnh vô hạn — chúng tiêu tốn pin và giảm hiệu suất.

Xử lý chạm trên giao diện tùy chỉnh

Vì phần mở rộng là một UIViewController đầy đủ, bạn có thể thêm cử chỉ và trình xử lý chạm. Cử chỉ UIKit (UITapGestureRecognizer, UIButton) hoạt động tiêu chuẩn. Đối với các hành động yêu cầu mở ứng dụng, hãy sử dụng ủy quyền của phần mở rộng hoặc userNotificationCenter. Các yếu tố tương tác phải đủ lớn để chạm thoải mái trong không gian giới hạn — kích thước tối thiểu của mục tiêu chạm là 44x44 điểm theo khuyến nghị của Apple.

Làm việc với phương tiện và tệp đính kèm

Nội dung đa phương tiện là tính năng chính của Notification Content Extension. Thông báo có thể chứa hình ảnh, GIF, âm thanh và video được hiển thị trong giao diện tùy chỉnh. Các tệp đính kèm được phân phối qua UNNotificationAttachment, có thể được thêm bởi máy chủ qua payload hoặc bởi Notification Service Extension sau khi tải xuống. Các định dạng được hỗ trợ là JPEG, PNG, MPEG-4 và MP3.

Hiển thị phương tiện trong phần mở rộng

Để hiển thị hình ảnh, chỉ cần lấy UNNotificationAttachment từ nội dung thông báo và tải nó từ URL cục bộ. Cần nhớ rằng phần mở rộng chỉ có quyền truy cập vào các tệp cục bộ — tài nguyên từ xa phải được tải xuống trước bởi Service Extension. Kích thước tối đa của tệp đính kèm — 50 MB trên iOS 15+, giới hạn thay đổi theo mỗi bản cập nhật. Để hỗ trợ nhiều hình ảnh, hãy sử dụng UNNotificationAttachment với các định danh khác nhau và hiển thị chúng qua UIPageViewController.

Tải và hiển thị hình ảnh

Để hiển thị hình ảnh trong giao diện tùy chỉnh, phần mở rộng lấy UNNotificationAttachment từ nội dung thông báo và tải nó từ URL cục bộ. Tệp đính kèm phải được tải xuống trước bởi Notification Service Extension — Content Extension không có quyền truy cập mạng. Kích thước tối đa của tệp đính kèm phương tiện — 50 MB trên iOS 15+, trong các phiên bản trước giới hạn là 10 MB. Phần mở rộng phải xử lý chính xác việc thiếu tệp đính kèm và hiển thị giao diện dự phòng. Để tải trước hình ảnh độ phân giải thấp, hãy sử dụng phiên bản hình thu nhỏ được tạo bởi Service Extension trước khi đính kèm.

Phát video trong thông báo

iOS hỗ trợ phát video trong Notification Content Extension qua AVPlayerLayer. Phần mở rộng có thể hiển thị trình phát video với các nút điều khiển ngay trong thông báo. Điều này đặc biệt hữu ích cho các ứng dụng giám sát, phát trực tuyến hoặc xem trước nội dung. Tự động phát không âm thanh được cho phép nếu người dùng mong đợi nội dung đa phương tiện trong thông báo này. Khi triển khai trình phát video, hãy thêm các yếu tố điều khiển: phát/tạm dừng, thanh tiến trình và nút đóng. Đảm bảo video không tự động bắt đầu với âm thanh — điều này vi phạm khuyến nghị của Apple về trải nghiệm người dùng. Đối với trình chiếu nhiều hình ảnh, hãy sử dụng chuyển tiếp hoạt ảnh giữa chúng qua UIView.transition với tùy chọn chuyển tiếp lật trang.

Tối ưu hóa hiệu suất phần mở rộng

Notification Content Extension hoạt động trong môi trường hạn chế với giới hạn bộ nhớ khoảng 50 MB. Để tối ưu hóa hiệu suất, hãy sử dụng tải lười hình ảnh, tránh tính toán nặng trên luồng chính và áp dụng Auto Layout với các ràng buộc đơn giản. Các thao tác nặng như xử lý hình ảnh hoặc phân tích dữ liệu, hãy thực hiện trong hàng đợi nền (DispatchQueue.global). Nếu vượt quá giới hạn bộ nhớ, hệ thống sẽ đóng phần mở rộng và người dùng sẽ thấy thông báo tiêu chuẩn. Nên phân tích phần mở rộng qua Instruments (Allocations và Time Profiler) trước khi phát hành, cũng như kiểm tra mức sử dụng bộ nhớ trên các thiết bị thực với các phiên bản iOS khác nhau.

Câu hỏi thường gặp

Có thể sử dụng SwiftUI trong Notification Content Extension không?

Có, từ iOS 16, Notification Content Extension hỗ trợ SwiftUI qua UIHostingController. Tuy nhiên, UIKit vẫn là lựa chọn ổn định hơn cho các giao diện phức tạp do hỗ trợ SwiftUI hạn chế trong các phần mở rộng.

Tại sao phần mở rộng không kích hoạt cho thông báo của tôi?

Kiểm tra xem categoryIdentifier trong payload thông báo có khớp với UNNotificationExtensionCategory trong Info.plist của phần mở rộng không. Đồng thời đảm bảo phần mở rộng đã được thêm vào target ứng dụng chính và được ký đúng cách.

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

Sử dụng App Group — bộ nhớ dùng chung (suite UserDefaults) hoặc vùng chứa tệp. Ứng dụng chính và phần mở rộng phải ở trong cùng một nhóm phát triển và có khả năng App Groups được bật.

Làm thế nào để cập nhật nội dung phần mở rộng mà không có thông báo mới?

Sử dụng phương thức didReceive(_:with:) với UNNotificationContentExtensionMediaPlayPauseButtonType để điều khiển phương tiện hoặc yêu cầu cập nhật qua ủy quyền. Không thể cập nhật hoàn toàn nội dung mà không có thông báo mới.

Làm thế nào để gỡ lỗi Notification Content Extension?

Chọn target phần mở rộng trong Xcode và chạy trên trình mô phỏng. Sử dụng lldb và các điểm dừng như trong ứng dụng thông thường. Để kiểm tra, hãy gửi thông báo push qua Firebase Console hoặc cục bộ qua Pusher.

Tóm tắt

  • Notification Content Extension — phần mở rộng iOS để hiển thị thông báo push tùy chỉnh.
  • Phần mở rộng triển khai UNNotificationContentExtension và cung cấp giao diện UIKit đầy đủ.
  • Được kích hoạt cho thông báo có categoryIdentifier khớp.
  • Hỗ trợ mọi thành phần UI: bản đồ, hình ảnh, video, hoạt ảnh.
  • Hoạt động trong tiến trình cách ly với quyền truy cập qua App Group.
  • Giới hạn kích thước — 50 MB phần mở rộng đã giải nén.
  • Đối với nội dung phương tiện, hãy sử dụng UNNotificationAttachment do Service Extension chuẩn bị.

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