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 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.
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.
Đ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ểm | Content Extension | Service Extension |
|---|---|---|
| Mục đích | UI thông báo tùy chỉnh | Sửa đổi nội dung trước khi hiển thị |
| Thời gian thực thi | Khi người dùng nhìn thấy thông báo | Tối đa 30 giây trong nền |
| Giao diện | UIView UIKit đầy đủ | Không có giao diện |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
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 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.
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.
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.
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.
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.
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ó.
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)
}
}
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.
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.
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.
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.
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.
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ị 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.
Để 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.
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.
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ó, 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.
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.
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.
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.
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
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