Notification Content Extension — είναι μια επέκταση iOS που σας επιτρέπει να αντικαταστήσετε την τυπική διεπαφή μιας push ειδοποίησης με ένα προσαρμοσμένο UIView. Ο προγραμματιστής αποκτά πλήρη έλεγχο πάνω στην εμφάνιση του περιεχομένου: εικόνες, βίντεο, κινούμενα σχέδια, προσαρμοσμένες γραμματοσειρές και διαδραστικά στοιχεία. Σύμφωνα με το Apple Developer, 2025, το Notification Content Extension υποστηρίζει οποιαδήποτε διεπαφή UIKit στον περιορισμένο χώρο της ειδοποίησης.
Κύρια σημεία
Notification Content Extension — είναι μια επέκταση εφαρμογής στο iOS που αντικαθιστά το τυπικό πρότυπο εμφάνισης push ειδοποίησης με ένα προσαρμοσμένο UIView. Σε αντίθεση με μια συνηθισμένη ειδοποίηση όπου το περιεχόμενο περιορίζεται σε τίτλο, υπότιτλο και σώμα, η επέκταση επιτρέπει την εμφάνιση οποιασδήποτε διεπαφής UIKit: χάρτη με συντεταγμένες, γράφημα, γκαλερί εικόνων ή φόρμα εισαγωγής.
Όταν το iOS λαμβάνει μια push ειδοποίηση με καθορισμένο categoryIdentifier, το σύστημα ελέγχει εάν η επέκταση είναι καταχωρημένη για αυτήν την κατηγορία. Εάν ναι — το σύστημα εκκινεί την επέκταση σε ξεχωριστή διαδικασία και της μεταφέρει το περιεχόμενο της ειδοποίησης. Η επέκταση εμφανίζει τη δική της διεπαφή αντί για την τυπική. Ο χρήστης αλληλεπιδρά με την προσαρμοσμένη διεπαφή χωρίς να ανοίγει την κύρια εφαρμογή.
Είναι σημαντικό να μην συγχέετε το Notification Content Extension με το Notification Service Extension. Το Service Extension επεξεργάζεται το περιεχόμενο πριν από την εμφάνιση της ειδοποίησης (λήψη συνημμένων, αποκρυπτογράφηση). Το Content Extension αντικαθιστά τη διεπαφή μετά τη λήψη του έτοιμου περιεχομένου. Και οι δύο επεκτάσεις μπορούν να λειτουργήσουν σε συνδυασμό: το Service Extension προετοιμάζει τα δεδομένα, το Content Extension τα εμφανίζει.
| Χαρακτηριστικό | Content Extension | Service Extension |
|---|---|---|
| Σκοπός | Προσαρμοσμένο UI ειδοποίησης | Τροποποίηση περιεχομένου πριν από την εμφάνιση |
| Χρόνος εκτέλεσης | Όσο ο χρήστης βλέπει την ειδοποίηση | Έως 30 δευτερόλεπτα στο παρασκήνιο |
| Διεπαφή | Πλήρες UIKit UIView | Καμία διεπαφή |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Το Notification Content Extension λειτουργεί σε απομονωμένη διαδικασία με περιορισμένους πόρους. Η επέκταση δεν έχει πρόσβαση στην κύρια αποθήκευση της εφαρμογής μέσω NSUserDefaults, εκτός από το App Group. Το μέγεθος της επέκτασης περιορίζεται στα 50 MB σε αποσυμπιεσμένη μορφή. Ο χρόνος εμφάνισης περιεχομένου είναι επίσης περιορισμένος — εάν η επέκταση δεν ολοκληρώσει την ενημέρωση εντός εύλογου χρόνου, το σύστημα την κλείνει.
Για να δημιουργήσετε την επέκταση στο Xcode, πρέπει να προσθέσετε ένα νέο target τύπου Notification Content Extension. Το Xcode θα δημιουργήσει αυτόματα το MainInterface.storyboard με έναν ελεγκτή που κληρονομεί το UIViewController και υλοποιεί το UNNotificationContentExtension.
Στο Xcode επιλέξτε File → New → Target → Notification Content Extension. Καθορίστε το όνομα της επέκτασης, τη γλώσσα (Swift ή Objective-C) και βεβαιωθείτε ότι το έργο είναι συνδεδεμένο με την ίδια ομάδα προγραμματιστών. Μετά τη δημιουργία του target, θα εμφανιστεί ένας φάκελος με τρία αρχεία: MainInterface.storyboard, Info.plist και το αρχείο ελεγκτή.
Στο Info.plist της επέκτασης πρέπει υποχρεωτικά να καθοριστεί ο πίνακας NSExtensionAttributes με το κλειδί UNNotificationExtensionCategory. Αυτός ο πίνακας περιέχει τα αναγνωριστικά των κατηγοριών ειδοποιήσεων για τις οποίες θα ενεργοποιείται η επέκταση. Το προαιρετικό κλειδί UNNotificationExtensionInitialContentSizeRatio ορίζει την αρχική αναλογία διαστάσεων της προσαρμοσμένης διεπαφής για σωστή τοποθέτηση.
Συνιστάται η διατήρηση καθαρής αρχιτεκτονικής στο target-επέκτασης: ξεχωριστός φάκελος για ελεγκτές, ξεχωριστός για προσαρμοσμένες προβολές. Καθώς η επέκταση είναι ένα ξεχωριστό δυαδικό αρχείο, ο κώδικας της κύριας εφαρμογής δεν είναι άμεσα προσβάσιμος. Για κοινή χρήση κώδικα, δημιουργήστε ένα ξεχωριστό framework ή χρησιμοποιήστε το App Group για δεδομένα.
UNNotificationContentExtension — ένα πρωτόκολλο που πρέπει να υλοποιήσει ο ελεγκτής στο Notification Content Extension. Η μόνη υποχρεωτική μέθοδος είναι η didReceive(_:with:), η οποία καλείται κατά τη λήψη ειδοποίησης. Ο ελεγκτής λαμβάνει την ειδοποίηση και έναν έτοιμο view controller που πρέπει να ενημερωθεί με δεδομένα.
Ο ελεγκτής της επέκτασης πρέπει να κληρονομεί το UIViewController και να υλοποιεί το UNNotificationContentExtension. Το Storyboard ή το xib συνδέεται με αυτόν τον ελεγκτή. Κατά τη λήψη ειδοποίησης, η μέθοδος didReceive μεταφέρει το περιεχόμενο και ο ελεγκτής ενημερώνει τις προβολές του.
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)
}
}
Το σύστημα καθορίζει το μέγεθος της προσαρμοσμένης διεπαφής βάσει του κλειδιού UNNotificationExtensionInitialContentSizeRatio στο Info.plist και του τρέχοντος περιεχομένου. Συνιστάται να ορίσετε αυτό το κλειδί στην τιμή 0.1 για ελάχιστο αρχικό μέγεθος και στη συνέχεια να αλλάξετε το μέγεθος μέσω του preferredContentSize μετά τη φόρτωση του περιεχομένου.
Notification Content Extension δίνει πλήρη ελευθερία στη δημιουργία διεπαφής. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε στοιχεία UIKit: UITableView, MKMapView, WKWebView, UIStackView. Ωστόσο, πρέπει να λάβετε υπόψη τον περιορισμένο χώρο της ειδοποίησης και να βελτιστοποιήσετε την απόδοση.
Ένα από τα δημοφιλή σενάρια είναι η εμφάνιση χάρτη με τοποθεσία. Για αυτό, στο Storyboard της επέκτασης προστίθεται MKMapView και ο ελεγκτής μεταφέρει συντεταγμένες από το περιεχόμενο της ειδοποίησης. Είναι σημαντικό να μην ξεχάσετε να προσθέσετε το MapKit στο target της επέκτασης. Κατά τη χρήση χάρτη, λάβετε υπόψη το όριο μνήμης της επέκτασης — η φόρτωση σύνθετων πλακιδίων μπορεί να υπερβεί τους διαθέσιμους πόρους.
Το Notification Content Extension υποστηρίζει κινούμενα σχέδια UIView, συμπεριλαμβανομένης της αλλαγής μεγέθους, μετακίνησης και διαφάνειας στοιχείων. Κατά την είσοδο σε εκτεταμένη λειτουργία ειδοποίησης, μπορείτε να ξεκινήσετε κινούμενο σχέδιο εμφάνισης περιεχομένου. Τα κινούμενα σχέδια πρέπει να είναι σύντομα (έως 0.5 δευτερόλεπτα) και να μην εμποδίζουν τον χρήστη στην αλληλεπίδραση με την ειδοποίηση. Αποφύγετε τα ατελείωτα κινούμενα σχέδια — καταναλώνουν μπαταρία και μειώνουν την απόδοση.
Καθώς η επέκταση είναι ένας πλήρης UIViewController, μπορείτε να προσθέσετε χειρονομίες και χειρισμό αφής. Οι χειρονομίες UIKit (UITapGestureRecognizer, UIButton) λειτουργούν τυπικά. Για ενέργειες που απαιτούν άνοιγμα της εφαρμογής, χρησιμοποιήστε τον εκπρόσωπο της επέκτασης ή το userNotificationCenter. Τα διαδραστικά στοιχεία πρέπει να είναι αρκετά μεγάλα για άνετη αφή στον περιορισμένο χώρο — το ελάχιστο μέγεθος στόχου αφής είναι 44x44 σημεία σύμφωνα με τις συστάσεις της Apple.
Πολυμεσικό περιεχόμενο — βασική δυνατότητα του Notification Content Extension. Η ειδοποίηση μπορεί να περιέχει εικόνες, GIF, ήχο και βίντεο που εμφανίζονται στην προσαρμοσμένη διεπαφή. Τα συνημμένα παραδίδονται μέσω UNNotificationAttachment, το οποίο μπορεί να προστεθεί τόσο από τον διακομιστή μέσω payload όσο και από το Notification Service Extension μετά τη λήψη. Υποστηριζόμενες μορφές είναι JPEG, PNG, MPEG-4 και MP3.
Για να εμφανίσετε μια εικόνα, αρκεί να λάβετε το UNNotificationAttachment από το περιεχόμενο της ειδοποίησης και να το φορτώσετε από ένα τοπικό URL. Είναι σημαντικό να θυμάστε ότι η επέκταση έχει πρόσβαση μόνο σε τοπικά αρχεία — οι απομακρυσμένοι πόροι πρέπει να έχουν ληφθεί εκ των προτέρων από το Service Extension. Μέγιστο μέγεθος συνημμένου — 50 MB σε iOS 15+, το όριο αυξάνεται με κάθε επόμενη ενημέρωση. Για υποστήριξη πολλαπλών εικόνων, χρησιμοποιήστε UNNotificationAttachment με διαφορετικά αναγνωριστικά και εμφανίστε τις μέσω UIPageViewController.
Για να εμφανίσετε μια εικόνα στην προσαρμοσμένη διεπαφή, η επέκταση λαμβάνει το UNNotificationAttachment από το περιεχόμενο της ειδοποίησης και το φορτώνει από ένα τοπικό URL. Το συνημμένο πρέπει να έχει ληφθεί εκ των προτέρων από το Notification Service Extension — το Content Extension δεν έχει πρόσβαση στο δίκτυο. Μέγιστο μέγεθος πολυμεσικού συνημμένου — 50 MB σε iOS 15+, σε προηγούμενες εκδόσεις το όριο ήταν 10 MB. Η επέκταση πρέπει να χειρίζεται σωστά την απουσία συνημμένου και να εμφανίζει μια εφεδρική διεπαφή. Για προφόρτωση εικόνων χαμηλής ανάλυσης, χρησιμοποιήστε μικρογραφίες που δημιουργήθηκαν από το Service Extension πριν από την επισύναψη.
Το iOS υποστηρίζει αναπαραγωγή βίντεο στο Notification Content Extension μέσω AVPlayerLayer. Η επέκταση μπορεί να εμφανίσει μια συσκευή αναπαραγωγής βίντεο με κουμπιά ελέγχου απευθείας στην ειδοποίηση. Αυτό είναι ιδιαίτερα χρήσιμο για εφαρμογές παρακολούθησης βίντεο, ροής ή προεπισκόπησης περιεχομένου. Η αυτόματη αναπαραγωγή χωρίς ήχο επιτρέπεται υπό την προϋπόθεση ότι ο χρήστης αναμένει πολυμεσικό περιεχόμενο σε αυτήν την ειδοποίηση. Κατά την υλοποίηση της συσκευής αναπαραγωγής βίντεο, προσθέστε στοιχεία ελέγχου: play/pause, γραμμή προόδου και κουμπί κλεισίματος. Βεβαιωθείτε ότι το βίντεο δεν ξεκινά αυτόματα με ήχο — αυτό παραβιάζει τις συστάσεις της Apple για την εμπειρία χρήστη. Για προβολή διαφανειών από πολλές εικόνες, χρησιμοποιήστε κινούμενη μετάβαση μεταξύ τους μέσω UIView.transition με επιλογή μετάβασης αναστροφής σελίδας.
Το Notification Content Extension λειτουργεί σε περιορισμένο περιβάλλον με όριο μνήμης περίπου 50 MB. Για βελτιστοποίηση απόδοσης, χρησιμοποιήστε τεμπέλικη φόρτωση εικόνων, αποφύγετε βαριούς υπολογισμούς στο κύριο νήμα και εφαρμόστε Auto Layout με απλούς περιορισμούς. Βαριές λειτουργίες, όπως επεξεργασία εικόνων ή ανάλυση δεδομένων, εκτελέστε σε νήματα παρασκηνίου (DispatchQueue.global). Σε περίπτωση υπέρβασης του ορίου μνήμης, το σύστημα θα κλείσει την επέκταση και ο χρήστης θα δει την τυπική ειδοποίηση. Συνιστάται η προφίλ της επέκτασης μέσω Instruments (Allocations και Time Profiler) πριν από τη δημοσίευση, καθώς και ο έλεγχος κατανάλωσης μνήμης σε πραγματικές συσκευές με διαφορετικές εκδόσεις iOS.
Συχνές ερωτήσεις
Ναι, από το iOS 16 το Notification Content Extension υποστηρίζει SwiftUI μέσω UIHostingController. Ωστόσο, το UIKit παραμένει πιο σταθερή επιλογή για σύνθετες διεπαφές λόγω περιορισμένης υποστήριξης SwiftUI σε επεκτάσεις.
Ελέγξτε ότι το categoryIdentifier στο payload της ειδοποίησης ταιριάζει με το UNNotificationExtensionCategory στο Info.plist της επέκτασης. Επίσης βεβαιωθείτε ότι η επέκταση έχει προστεθεί στο κύριο target της εφαρμογής και είναι σωστά υπογεγραμμένη.
Χρησιμοποιήστε App Group — κοινόχρηστη αποθήκευση (UserDefaults suite) ή κοντέινερ αρχείων. Η κύρια εφαρμογή και η επέκταση πρέπει να ανήκουν στην ίδια ομάδα προγραμματιστών και να έχουν ενεργοποιημένη τη δυνατότητα App Groups.
Χρησιμοποιήστε τη μέθοδο didReceive(_:with:) με UNNotificationContentExtensionMediaPlayPauseButtonType για έλεγχο πολυμέσων ή ζητήστε ενημέρωση μέσω του εκπροσώπου. Πλήρης ενημέρωση περιεχομένου χωρίς νέα ειδοποίηση δεν είναι δυνατή.
Επιλέξτε το target της επέκτασης στο Xcode και εκτελέστε στον προσομοιωτή. Χρησιμοποιήστε lldb και breakpoints όπως σε μια συνηθισμένη εφαρμογή. Για δοκιμή, στείλτε push ειδοποίηση μέσω Firebase Console ή τοπικά μέσω Pusher.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης