Notification Content Extension — τι είναι, πώς να δημιουργήσετε προσαρμοσμένη διεπαφή για iOS

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-21 Χρόνος ανάγνωσης: 8 λεπ

Notification Content Extension — είναι μια επέκταση iOS που σας επιτρέπει να αντικαταστήσετε την τυπική διεπαφή μιας push ειδοποίησης με ένα προσαρμοσμένο UIView. Ο προγραμματιστής αποκτά πλήρη έλεγχο πάνω στην εμφάνιση του περιεχομένου: εικόνες, βίντεο, κινούμενα σχέδια, προσαρμοσμένες γραμματοσειρές και διαδραστικά στοιχεία. Σύμφωνα με το Apple Developer, 2025, το Notification Content Extension υποστηρίζει οποιαδήποτε διεπαφή UIKit στον περιορισμένο χώρο της ειδοποίησης.

Κύρια σημεία

  • Notification Content Extension — επέκταση iOS για προσαρμοσμένο UI push ειδοποιήσεων.
  • Η επέκταση υλοποιεί το πρωτόκολλο UNNotificationContentExtension με την υποχρεωτική μέθοδο didReceive.
  • Η προσαρμοσμένη διεπαφή δημιουργείται στο Storyboard και μπορεί να περιέχει οποιαδήποτε στοιχεία UIKit.
  • Μέγιστο μέγεθος επέκτασης — 50 MB και δεν πρέπει να υπερβαίνει τα 12 MB σε συμπιεσμένη μορφή.
  • Η επέκταση ενεργοποιείται για ειδοποιήσεις με καθορισμένο categoryIdentifier.

Τι είναι το Notification Content Extension

Notification Content Extension — είναι μια επέκταση εφαρμογής στο iOS που αντικαθιστά το τυπικό πρότυπο εμφάνισης push ειδοποίησης με ένα προσαρμοσμένο UIView. Σε αντίθεση με μια συνηθισμένη ειδοποίηση όπου το περιεχόμενο περιορίζεται σε τίτλο, υπότιτλο και σώμα, η επέκταση επιτρέπει την εμφάνιση οποιασδήποτε διεπαφής UIKit: χάρτη με συντεταγμένες, γράφημα, γκαλερί εικόνων ή φόρμα εισαγωγής.

Πώς λειτουργεί

Όταν το iOS λαμβάνει μια push ειδοποίηση με καθορισμένο categoryIdentifier, το σύστημα ελέγχει εάν η επέκταση είναι καταχωρημένη για αυτήν την κατηγορία. Εάν ναι — το σύστημα εκκινεί την επέκταση σε ξεχωριστή διαδικασία και της μεταφέρει το περιεχόμενο της ειδοποίησης. Η επέκταση εμφανίζει τη δική της διεπαφή αντί για την τυπική. Ο χρήστης αλληλεπιδρά με την προσαρμοσμένη διεπαφή χωρίς να ανοίγει την κύρια εφαρμογή.

Διαφορά από το Notification Service Extension

Είναι σημαντικό να μην συγχέετε το Notification Content Extension με το Notification Service Extension. Το Service Extension επεξεργάζεται το περιεχόμενο πριν από την εμφάνιση της ειδοποίησης (λήψη συνημμένων, αποκρυπτογράφηση). Το Content Extension αντικαθιστά τη διεπαφή μετά τη λήψη του έτοιμου περιεχομένου. Και οι δύο επεκτάσεις μπορούν να λειτουργήσουν σε συνδυασμό: το Service Extension προετοιμάζει τα δεδομένα, το Content Extension τα εμφανίζει.

ΧαρακτηριστικόContent ExtensionService Extension
ΣκοπόςΠροσαρμοσμένο UI ειδοποίησηςΤροποποίηση περιεχομένου πριν από την εμφάνιση
Χρόνος εκτέλεσηςΌσο ο χρήστης βλέπει την ειδοποίησηΈως 30 δευτερόλεπτα στο παρασκήνιο
ΔιεπαφήΠλήρες UIKit UIViewΚαμία διεπαφή
APIUNNotificationContentExtensionUNNotificationServiceExtension

Περιορισμοί της επέκτασης

Το Notification Content Extension λειτουργεί σε απομονωμένη διαδικασία με περιορισμένους πόρους. Η επέκταση δεν έχει πρόσβαση στην κύρια αποθήκευση της εφαρμογής μέσω NSUserDefaults, εκτός από το App Group. Το μέγεθος της επέκτασης περιορίζεται στα 50 MB σε αποσυμπιεσμένη μορφή. Ο χρόνος εμφάνισης περιεχομένου είναι επίσης περιορισμένος — εάν η επέκταση δεν ολοκληρώσει την ενημέρωση εντός εύλογου χρόνου, το σύστημα την κλείνει.

Δημιουργία Notification Content Extension στο Xcode

Για να δημιουργήσετε την επέκταση στο Xcode, πρέπει να προσθέσετε ένα νέο target τύπου Notification Content Extension. Το Xcode θα δημιουργήσει αυτόματα το MainInterface.storyboard με έναν ελεγκτή που κληρονομεί το UIViewController και υλοποιεί το UNNotificationContentExtension.

Προσθήκη target-επέκτασης

Στο Xcode επιλέξτε File → New → Target → Notification Content Extension. Καθορίστε το όνομα της επέκτασης, τη γλώσσα (Swift ή Objective-C) και βεβαιωθείτε ότι το έργο είναι συνδεδεμένο με την ίδια ομάδα προγραμματιστών. Μετά τη δημιουργία του target, θα εμφανιστεί ένας φάκελος με τρία αρχεία: MainInterface.storyboard, Info.plist και το αρχείο ελεγκτή.

Ρύθμιση Info.plist

Στο Info.plist της επέκτασης πρέπει υποχρεωτικά να καθοριστεί ο πίνακας NSExtensionAttributes με το κλειδί UNNotificationExtensionCategory. Αυτός ο πίνακας περιέχει τα αναγνωριστικά των κατηγοριών ειδοποιήσεων για τις οποίες θα ενεργοποιείται η επέκταση. Το προαιρετικό κλειδί UNNotificationExtensionInitialContentSizeRatio ορίζει την αρχική αναλογία διαστάσεων της προσαρμοσμένης διεπαφής για σωστή τοποθέτηση.

Αρχιτεκτονική φακέλων επέκτασης

Συνιστάται η διατήρηση καθαρής αρχιτεκτονικής στο target-επέκτασης: ξεχωριστός φάκελος για ελεγκτές, ξεχωριστός για προσαρμοσμένες προβολές. Καθώς η επέκταση είναι ένα ξεχωριστό δυαδικό αρχείο, ο κώδικας της κύριας εφαρμογής δεν είναι άμεσα προσβάσιμος. Για κοινή χρήση κώδικα, δημιουργήστε ένα ξεχωριστό framework ή χρησιμοποιήστε το App Group για δεδομένα.

Υλοποίηση του πρωτοκόλλου UNNotificationContentExtension

UNNotificationContentExtension — ένα πρωτόκολλο που πρέπει να υλοποιήσει ο ελεγκτής στο Notification Content Extension. Η μόνη υποχρεωτική μέθοδος είναι η didReceive(_:with:), η οποία καλείται κατά τη λήψη ειδοποίησης. Ο ελεγκτής λαμβάνει την ειδοποίηση και έναν έτοιμο view controller που πρέπει να ενημερωθεί με δεδομένα.

Βασική υλοποίηση ελεγκτή

Ο ελεγκτής της επέκτασης πρέπει να κληρονομεί το UIViewController και να υλοποιεί το UNNotificationContentExtension. Το Storyboard ή το xib συνδέεται με αυτόν τον ελεγκτή. Κατά τη λήψη ειδοποίησης, η μέθοδος didReceive μεταφέρει το περιεχόμενο και ο ελεγκτής ενημερώνει τις προβολές του.

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

Διαχείριση μεγέθους διεπαφής

Το σύστημα καθορίζει το μέγεθος της προσαρμοσμένης διεπαφής βάσει του κλειδιού 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.

Συχνές ερωτήσεις

Μπορεί να χρησιμοποιηθεί SwiftUI στο Notification Content Extension;

Ναι, από το iOS 16 το Notification Content Extension υποστηρίζει SwiftUI μέσω UIHostingController. Ωστόσο, το UIKit παραμένει πιο σταθερή επιλογή για σύνθετες διεπαφές λόγω περιορισμένης υποστήριξης SwiftUI σε επεκτάσεις.

Γιατί δεν ενεργοποιείται η επέκταση για την ειδοποίησή μου;

Ελέγξτε ότι το categoryIdentifier στο payload της ειδοποίησης ταιριάζει με το UNNotificationExtensionCategory στο Info.plist της επέκτασης. Επίσης βεβαιωθείτε ότι η επέκταση έχει προστεθεί στο κύριο target της εφαρμογής και είναι σωστά υπογεγραμμένη.

Πώς να μεταφέρετε δεδομένα από την κύρια εφαρμογή στην επέκταση;

Χρησιμοποιήστε App Group — κοινόχρηστη αποθήκευση (UserDefaults suite) ή κοντέινερ αρχείων. Η κύρια εφαρμογή και η επέκταση πρέπει να ανήκουν στην ίδια ομάδα προγραμματιστών και να έχουν ενεργοποιημένη τη δυνατότητα App Groups.

Πώς να ενημερώσετε το περιεχόμενο της επέκτασης χωρίς νέα ειδοποίηση;

Χρησιμοποιήστε τη μέθοδο didReceive(_:with:) με UNNotificationContentExtensionMediaPlayPauseButtonType για έλεγχο πολυμέσων ή ζητήστε ενημέρωση μέσω του εκπροσώπου. Πλήρης ενημέρωση περιεχομένου χωρίς νέα ειδοποίηση δεν είναι δυνατή.

Πώς να κάνετε debug το Notification Content Extension;

Επιλέξτε το target της επέκτασης στο Xcode και εκτελέστε στον προσομοιωτή. Χρησιμοποιήστε lldb και breakpoints όπως σε μια συνηθισμένη εφαρμογή. Για δοκιμή, στείλτε push ειδοποίηση μέσω Firebase Console ή τοπικά μέσω Pusher.

Σύνοψη

  • Notification Content Extension — επέκταση iOS για προσαρμοσμένη εμφάνιση push ειδοποιήσεων.
  • Η επέκταση υλοποιεί το UNNotificationContentExtension και παρέχει πλήρη διεπαφή UIKit.
  • Ενεργοποιείται για ειδοποιήσεις με αντίστοιχο categoryIdentifier.
  • Υποστηρίζει οποιαδήποτε στοιχεία UI: χάρτες, εικόνες, βίντεο, κινούμενα σχέδια.
  • Λειτουργεί σε απομονωμένη διαδικασία με πρόσβαση μέσω App Group.
  • Όριο μεγέθους — 50 MB για αποσυμπιεσμένη επέκταση.
  • Για πολυμεσικό περιεχόμενο, χρησιμοποιήστε UNNotificationAttachment που προετοιμάστηκε από το Service Extension.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης