Η τοπική ειδοποίηση είναι ένα μήνυμα που στέλνει η εφαρμογή στον χρήστη χωρίς τη συμμετοχή απομακρυσμένου διακομιστή. Όλα τα δεδομένα επεξεργάζονται και εμφανίζονται απευθείας στη συσκευή του παραλήπτη. Ένας τέτοιος μηχανισμός είναι κατάλληλος για υπενθυμίσεις, χρονοδιακόπτες και ξυπνητήρια όταν η εφαρμογή βρίσκεται στο παρασκήνιο ή είναι κλειστή. Σύμφωνα με το Apple Developer Documentation, το UNUserNotificationCenter παρέχει κεντρική διαχείριση των τοπικών ειδοποιήσεων στο iOS.
Κύρια σημεία
Μια τοπική ειδοποίηση είναι ένα μήνυμα ενεργοποίησης που δημιουργείται και εμφανίζεται από το λειτουργικό σύστημα στην ίδια συσκευή όπου είναι εγκατεστημένη η εφαρμογή. Σε αντίθεση με τις push ειδοποιήσεις, οι τοπικές δεν περνούν μέσω εξωτερικού διακομιστή — όλη η λογική προγραμματισμού εκτελείται στην πλευρά του πελάτη.
Τέτοιες ειδοποιήσεις λειτουργούν ανεξάρτητα από την κατάσταση της εφαρμογής: ενεργή, ελαχιστοποιημένη ή εντελώς κλειστή. Το λειτουργικό σύστημα αναλαμβάνει την παράδοση την καθορισμένη ώρα και ο προγραμματιστής καθορίζει μόνο το περιεχόμενο και τον ενεργοποιητή.
Το σύστημα εγγυάται την παράδοση της τοπικής ειδοποίησης ακόμη και χωρίς δίκτυο. Αυτό είναι ένα βασικό πλεονέκτημα έναντι των push ειδοποιήσεων που απαιτούν σταθερή σύνδεση στο διαδίκτυο και λειτουργικό διακομιστή.
Κάθε τοπική ειδοποίηση αποτελείται από τρία μέρη: περιεχόμενο (τίτλος, σώμα, ήχος), ενεργοποιητή (χρονική ή γεω-συνθήκη) και αναγνωριστικό αιτήματος. Το αναγνωριστικό επιτρέπει την ακύρωση ή ενημέρωση της ειδοποίησης πριν από την παράδοσή της.
Ο προγραμματιστής μπορεί να ορίσει έως 64 τοπικές ειδοποιήσεις για μία εφαρμογή στο iOS και απεριόριστο αριθμό στο Android. Η διαφορά οφείλεται σε αρχιτεκτονικούς περιορισμούς των λειτουργικών συστημάτων.
Και οι δύο πλατφόρμες παρέχουν τα δικά τους API για εργασία με τοπικές ειδοποιήσεις. Στο iOS το κεντρικό στοιχείο είναι το UNUserNotificationCenter, στο Android — το NotificationManager. Παρά τις διαφορετικές διεπαφές, η λογική είναι η ίδια: η εφαρμογή δημιουργεί ένα αίτημα, το καταχωρεί στο σύστημα και το λειτουργικό σύστημα παραδίδει την ειδοποίηση την καθορισμένη στιγμή.
Το iOS χρησιμοποιεί UNCalendarNotificationTrigger για ημερολογιακά συμβάντα, UNTimeIntervalNotificationTrigger για χρονικά διαστήματα και UNLocationNotificationTrigger για γεωτοποθεσία. Το Android προσφέρει AlarmManager, WorkManager και ακριβή προγραμματισμό μέσω setExact.
Από το Android 12 — το SCHEDULE_EXACT_ALARM απαιτεί ειδική άδεια από τον χρήστη. Στο iOS η άδεια ζητείται μία φορά μέσω UNUserNotificationCenter.requestAuthorization και ο χρήστης επιλέγει το επίπεδο πρόσβασης: banners, ήχοι, εικονίδια.
Οι τοπικές ειδοποιήσεις ταξινομούνται ανά τύπο ενεργοποιητή, όχι ανά περιεχόμενο. Κάθε τύπος καθορίζει πότε και υπό ποιες συνθήκες θα εμφανιστεί η ειδοποίηση στον χρήστη.
Στο iOS και Android οι τύποι ενεργοποιητών υλοποιούνται διαφορετικά, αν και η λογική ταξινόμηση είναι η ίδια. Το iOS χρησιμοποιεί UNCalendarNotificationTrigger για ημερομηνίες, UNTimeIntervalNotificationTrigger για χρονικά διαστήματα και UNLocationNotificationTrigger για γεωτοποθεσία. Το Android προσφέρει AlarmManager με setExact και setRepeating, καθώς και WorkManager για καθυστερημένες εργασίες.
| Τύπος ενεργοποιητή | Περιγραφή | Παράδειγμα |
|---|---|---|
| Χρονικό διάστημα | Ειδοποίηση μετά από N δευτερόλεπτα από την εκκίνηση | Χρονοδιακόπτης αντίστροφης μέτρησης |
| Ημερολογιακή ημερομηνία | Ειδοποίηση σε συγκεκριμένη ώρα και ημερομηνία | Υπενθύμιση συνάντησης |
| Γεωτοποθεσία | Ειδοποίηση κατά την είσοδο/έξοδο από μια περιοχή | Υπενθύμιση κοντά στο κατάστημα |
| Χωρίς όρους | Άμεση παράδοση κατά την κλήση API | Ειδοποίηση λήψης |
Στο iOS είναι επίσης διαθέσιμο το UNNotificationAttachment — συνημμένο εικόνας, ήχου ή βίντεο στο σώμα της ειδοποίησης. Το Android υποστηρίζει προσαρμοσμένα πρότυπα με κουμπιά και μεγάλες εικόνες μέσω NotificationCompat.Style.
Η επιλογή ενεργοποιητή εξαρτάται από το σενάριο: οι ημερολογιακές υπενθυμίσεις λειτουργούν καλύτερα μέσω ημερολογιακού ενεργοποιητή και οι γεω-υπενθυμίσεις — μέσω γεωτοποθεσίας. Οι ενεργοποιητές χρονικού διαστήματος είναι κατάλληλοι για τακτικά συμβάντα με σταθερή περίοδο.
Στο iOS οι τοπικές ειδοποιήσεις παραδίδονται από το σύστημα ακόμη και όταν η εφαρμογή είναι κλειστή — το UNUserNotificationCenter διαχειρίζεται την ουρά ανεξάρτητα. Στο Android η παράδοση εξαρτάται από τον επιλεγμένο μηχανισμό: το AlarmManager ενεργοποιείται ακόμη και με κλειστή οθόνη, ενώ το WorkManager λαμβάνει υπόψη την εξοικονόμηση ενέργειας.
Οι τοπικές ειδοποιήσεις λύνουν προβλήματα όπου η εξωτερική υποδομή είναι περιττή ή μη διαθέσιμη. Κύρια σενάρια: υπενθυμίσεις, χρονοδιακόπτες, εκπαιδευτικές συμβουλές και καθυστερημένες ενέργειες.
Έρευνες της Localytics δείχνουν ότι οι εφαρμογές που χρησιμοποιούν τοπικές υπενθυμίσεις διατηρούν 35% περισσότερους χρήστες την πρώτη εβδομάδα μετά την εγκατάσταση. Αυτό καθιστά τις τοπικές ειδοποιήσεις ένα ισχυρό εργαλείο onboarding.
Είναι σημαντικό να μην γίνεται κατάχρηση της συχνότητας — το σύστημα ομαδοποιεί μόνο του τις ειδοποιήσεις από μία εφαρμογή και ο χρήστης μπορεί να απενεργοποιήσει όλες τις τοπικές ειδοποιήσεις αν τον ενοχλούν. Η βέλτιστη συχνότητα δεν είναι περισσότερες από 2–3 ειδοποιήσεις την ημέρα για μη κρίσιμα συμβάντα.
Για τον προγραμματισμό μιας τοπικής ειδοποίησης στο Android χρησιμοποιήστε το NotificationManager μαζί με το AlarmManager. Από το Android 8+ πρέπει πρώτα να δημιουργηθεί ένα κανάλι ειδοποιήσεων, διαφορετικά η ειδοποίηση δεν θα εμφανιστεί.
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"
val channel = NotificationChannel(
channelId,
"Υπενθυμίσεις",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Κανάλι για υπενθυμίσεις εργασιών"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
val intent = Intent(this, ReminderReceiver::class.java).apply {
putExtra("notification_id", notificationId)
putExtra("channel_id", channelId)
}
val pendingIntent = PendingIntent.getBroadcast(
this, notificationId.hashCode(),
intent, PendingIntent.FLAG_UPDATE_CURRENT
)
val alarmManager = getSystemService(AlarmManager::class.java)
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerTimeMillis,
pendingIntent
)
Στο Android 12+ ελέγξτε την άδεια SCHEDULE_EXACT_ALARM πριν καλέσετε το setExact. Εάν δεν έχει δοθεί η άδεια — χρησιμοποιήστε το setWindow που εγγυάται την παράδοση εντός χρονικού παραθύρου.
Όταν ενεργοποιείται το AlarmManager, το σύστημα στέλνει ένα broadcast Intent που λαμβάνεται από το BroadcastReceiver. Μέσα σε αυτό πρέπει να δημιουργηθεί και να εμφανιστεί η ειδοποίηση μέσω του NotificationManager. Βεβαιωθείτε ότι το PendingIntent χρησιμοποιεί FLAG_UPDATE_CURRENT, διαφορετικά όταν αλλάξουν τα δεδομένα οι παλιές ειδοποιήσεις θα συνεχίσουν να χρησιμοποιούν το παλιό Intent.
Στο iOS οι τοπικές ειδοποιήσεις δημιουργούνται μέσω του UNUserNotificationCenter χρησιμοποιώντας UNMutableNotificationContent και έναν από τους ενεργοποιητές. Πριν από τον προγραμματισμό πρέπει να ζητηθεί άδεια από τον χρήστη.
import UserNotifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
guard granted else { return }
}
let content = UNMutableNotificationContent()
content.title = "Υπενθύμιση εργασίας"
content.body = "Μην ξεχάσετε να ολοκληρώσετε την αναφορά έως τις 18:00"
content.sound = .default
content.userInfo = ["task_id": "42"]
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 3600,
repeats: false
)
let request = UNNotificationRequest(
identifier: "task_reminder_42",
content: content,
trigger: trigger
)
center.add(request)
Το iOS υποστηρίζει έως 64 ταυτόχρονα αιτήματα τοπικών ειδοποιήσεων. Εάν ξεπεραστεί το όριο — το σύστημα απορρίπτει νέα αιτήματα έως ότου τα ενεργά αιτήματα παραδοθούν ή ακυρωθούν. Χρησιμοποιήστε το getPendingNotificationRequests για να ελέγξετε την τρέχουσα ουρά.
Όταν ο χρήστης αλληλεπιδρά με μια τοπική ειδοποίηση iOS, καλείται η μέθοδος userNotificationCenter:didReceive response του αντιπροσώπου UNUserNotificationCenterDelegate. Σε αυτήν τη μέθοδο είναι διαθέσιμα το αναγνωριστικό αιτήματος, το actionIdentifier (ποιο κουμπί πατήθηκε) και τα προσαρμοσμένα userInfo. Αυτό επιτρέπει τη διάκριση μεταξύ απλού ανοίγματος της ειδοποίησης και πατήματος ενός συγκεκριμένου κουμπιού ενέργειας.
Για να είναι οι τοπικές ειδοποιήσεις χρήσιμες και να μην ενοχλούν τον χρήστη, ακολουθήστε μερικούς βασικούς κανόνες. Πρώτον: ελέγξτε τη συχνότητα — όχι περισσότερες από 2–3 ειδοποιήσεις την ημέρα για μη κρίσιμα συμβάντα, διαφορετικά ο χρήστης θα απενεργοποιήσει όλες τις ειδοποιήσεις της εφαρμογής.
Δεύτερον: δώστε επιλογή στον χρήστη. Προσθέστε στη διεπαφή τη δυνατότητα απενεργοποίησης συγκεκριμένων τύπων τοπικών ειδοποιήσεων. Στο Android γι' αυτό είναι βολικό να χρησιμοποιήσετε ξεχωριστό NotificationChannel με χαμηλή σημασία, στο iOS — ξεχωριστή κατηγορία στις ρυθμίσεις της εφαρμογής.
Τρίτον: συμφραζόμενη συνάφεια — η ειδοποίηση πρέπει να εμφανίζεται όταν τη χρειάζεται ο χρήστης. Οι γεω-ενεργοποιητές είναι ιδανικοί για υπενθυμίσεις υποχρεώσεων κοντά στο σπίτι, οι ημερολογιακοί — για συναντήσεις, οι ενεργοποιητές χρονικού διαστήματος — για τακτικές ενέργειες όπως το ποτό νερού ή οι διατάσεις. Μην αναμιγνύετε τους τύπους χωρίς ανάγκη.
Τέταρτον: δοκιμάστε σε πραγματικές συσκευές. Ο προσομοιωτής iOS δεν εξομοιώνει όλα τα σενάρια παράδοσης τοπικών ειδοποιήσεων, ειδικά στο παρασκήνιο. Στο Android χρησιμοποιήστε την adb shell dumpsys notification για να ελέγξετε την ουρά των προγραμματισμένων ειδοποιήσεων και τις παραμέτρους τους. Πέμπτον: πάντα να παρέχετε στον χρήστη τη δυνατότητα απενεργοποίησης των ειδοποιήσεων μέσω της διεπαφής της εφαρμογής — αυτή είναι υποχρεωτική απαίτηση UX και των οδηγιών App Store Review.
Συχνές Ερωτήσεις
Η τοπική ειδοποίηση προγραμματίζεται και παραδίδεται από τη συσκευή χωρίς τη συμμετοχή διακομιστή. Η push ειδοποίηση απαιτεί εξωτερική υπηρεσία (FCM, APNS) και σύνδεση στο διαδίκτυο. Οι τοπικές λειτουργούν εκτός σύνδεσης, οι push — μόνο με πρόσβαση στο δίκτυο.
Το iOS περιορίζει σε 64 ταυτόχρονα προγραμματισμένα αιτήματα. Το Android δεν έχει αυστηρό όριο, αλλά πάνω από 500 ειδοποιήσεις μπορεί να μειώσουν την απόδοση του συστήματος και να επηρεάσουν τον χρόνο παράδοσης.
Ναι, στο iOS χρησιμοποιήστε την removePendingNotificationRequests με το αναγνωριστικό αιτήματος. Στο Android καλέστε την NotificationManager.cancel ή ακυρώστε το PendingIntent μέσω AlarmManager. Το μοναδικό αναγνωριστικό είναι υποχρεωτικό για ακύρωση.
Στο iOS η άδεια ζητείται υποχρεωτικά μέσω requestAuthorization. Στο Android 13+ (Tiramisu) απαιτείται επίσης η άδεια POST_NOTIFICATIONS. Οι παλαιότερες εκδόσεις Android δεν απαιτούν ρητή άδεια για τοπικές ειδοποιήσεις.
Στο iOS δημιουργήστε UNNotificationAction και προσθέστε την στο UNNotificationCategory. Στο Android χρησιμοποιήστε την NotificationCompat.Builder.addAction με PendingIntent για BroadcastReceiver. Κάθε κουμπί ενεργοποιεί μια ξεχωριστή ενέργεια στην εφαρμογή.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης