BGTaskScheduler — είναι το πλαίσιο της Apple για τον προγραμματισμό και την εκτέλεση εργασιών παρασκηνίου σε εφαρμογές iOS 13 και νεότερες. Αντικατέστησε τα παλιά Background Fetch και performFetch, παρέχοντας ένα ενιαίο API για εργασία με λειτουργίες παρασκηνίου. Σύμφωνα με το Apple Developer Documentation, 2026, το πλαίσιο περιλαμβάνει δύο τύπους εργασιών: BGProcessingTask για μεγάλες λειτουργίες και BGAppRefreshTask για σύντομες ενημερώσεις περιεχομένου.
Κύρια σημεία
BGTaskScheduler — είναι το πλαίσιο συστήματος της Apple, που εισήχθη στο iOS 13, το οποίο διαχειρίζεται κεντρικά την εκτέλεση εργασιών παρασκηνίου. Πριν από την εμφάνισή του, οι προγραμματιστές χρησιμοποιούσαν τα UIApplication backgroundTasks, performFetch και τον χειρισμό συμβάντων στο appDelegate, οδηγώντας σε κατακερματισμό κώδικα και απρόβλεπτη συμπεριφορά.
Το πλαίσιο λειτουργεί με βάση την αρχή του καθυστερημένου προγραμματισμού: η εφαρμογή καταχωρεί εργασίες με μοναδικά αναγνωριστικά και το iOS καθορίζει μόνο του τη βέλτιστη στιγμή για την εκτέλεσή τους. Το σύστημα λαμβάνει υπόψη το επίπεδο μπαταρίας, τη δραστηριότητα του χρήστη, την κατάσταση δικτύου και άλλους παράγοντες.
Βασικές δυνατότητες περιλαμβάνουν εργασία τόσο με σύντομες όσο και με μεγάλες λειτουργίες παρασκηνίου. Σε αντίθεση με το AlarmManager στο Android, το BGTaskScheduler δεν εγγυάται ακριβή χρόνο εκτέλεσης — το σύστημα διατηρεί το δικαίωμα να καθυστερήσει την εργασία εάν οι συνθήκες είναι δυσμενείς.
BGTaskScheduler χρησιμοποιεί αρχιτεκτονική βασισμένη σε χειριστές (handlers). Η εφαρμογή καταχωρεί έναν χειριστή για κάθε τύπο εργασίας και το σύστημα τον καλεί όταν έρθει η κατάλληλη στιγμή. Το ίδιο το πλαίσιο δεν εκτελεί την εργασία άμεσα — ειδοποιεί απλώς την εφαρμογή ότι είναι ώρα να την ξεκινήσει.
Η εγγραφή ξεκινά με τη δήλωση του αναγνωριστικού εργασίας στο Info.plist μέσω του πίνακα BGTaskSchedulerPermittedIdentifiers. Στη συνέχεια, στον κώδικα της εφαρμογής, καλείται η μέθοδος registerHandler(forTaskWithIdentifier:) με ένα closure-χειριστή.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// καλείται κατά την αναγκαστική λήξη
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Μετά την εγγραφή, η εφαρμογή πρέπει να ζητήσει ρητά την εκτέλεση της εργασίας μέσω του submitTaskRequest. Το αίτημα περιέχει το αναγνωριστικό εργασίας και την ημερομηνία της νωρίτερης δυνατής έναρξης. Το σύστημα αποθηκεύει το αίτημα και το επεξεργάζεται όταν κρίνει ότι οι συνθήκες είναι κατάλληλες.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Σφάλμα προγραμματισμού: \(error)")
}
BGTaskScheduler παρέχει δύο κύριους τύπους εργασιών, καθένας από τους οποίους είναι σχεδιασμένος για το δικό του σενάριο χρήσης. Η επιλογή του σωστού τύπου επηρεάζει άμεσα την πιθανότητα επιτυχούς εκτέλεσης της εργασίας από το σύστημα.
BGAppRefreshTask έχει σχεδιαστεί για σύντομες ενημερώσεις περιεχομένου παρασκηνίου: φόρτωση νέων δεδομένων, συγχρονισμός με τον διακομιστή, ενημέρωση widget. Ο χρόνος εκτέλεσης περιορίζεται στα 30 δευτερόλεπτα, μετά τα οποία το σύστημα τερματίζει αναγκαστικά την εργασία. Αυτός ο τύπος εργασιών εκτελείται συχνότερα από το BGProcessingTask και έχει υψηλότερη προτεραιότητα.
BGProcessingTask έχει σχεδιαστεί για μεγαλύτερες λειτουργίες: επεξεργασία αρχείων πολυμέσων, ευρετηρίαση δεδομένων Core Data, δημιουργία αντιγράφων ασφαλείας. Η εργασία μπορεί να διαρκέσει έως αρκετά λεπτά, αλλά το σύστημα την εκτελεί λιγότερο συχνά και μόνο υπό ευνοϊκές συνθήκες — σύνδεση σε τροφοδοσία, σταθερό Wi-Fi και χαμηλό φορτίο συσκευής.
| Παράμετρος | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Χρονικό όριο | 30 δευτερόλεπτα | αρκετά λεπτά |
| Συχνότητα εκτέλεσης | υψηλή | χαμηλή |
| Συνθήκες | οποιεσδήποτε | τροφοδοσία + Wi-Fi |
| Απαιτεί τροφοδοσία | όχι | συνιστάται |
| Παράδειγμα | ενημέρωση ροής | επεξεργασία βίντεο |
Σωστή εγγραφή — είναι υποχρεωτική προϋπόθεση για τη λειτουργία του BGTaskScheduler. Εάν η εργασία δεν είναι καταχωρημένη στο Info.plist, το σύστημα θα αγνοήσει οποιοδήποτε αίτημα εκτέλεσής της.
Στο αρχείο Info.plist προστίθεται ένας πίνακας BGTaskSchedulerPermittedIdentifiers με μια λίστα αναγνωριστικών κειμένου. Κάθε αναγνωριστικό πρέπει να είναι μοναδικό εντός της εφαρμογής. Η Apple συνιστά τη χρήση αντίστροφης σημειογραφίας τομέα.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Για τον προγραμματισμό χρησιμοποιείται η μέθοδος submitTaskRequest. Εάν η εργασία δεν είναι πλέον απαραίτητη, μπορεί να ακυρωθεί μέσω cancelTaskRequest ή cancelAllTaskRequests. Το σύστημα ακυρώνει αυτόματα τις εργασίες κατά τη διαγραφή της εφαρμογής ή την επαναφορά δεδομένων.
Το BGTaskScheduler παρέχει τη δυνατότητα παρακολούθησης της κατάστασης των προγραμματισμένων εργασιών μέσω του getPendingTaskRequests. Αυτή η μέθοδος επιστρέφει μια λίστα όλων των ενεργών αιτημάτων με πληροφορίες σχετικά με τον τύπο, το αναγνωριστικό και το earliestBeginDate. Για κάθε αίτημα, μπορείτε να ελέγξετε εάν έχει ήδη εκτελεστεί ή ακυρωθεί και να λάβετε απόφαση σχετικά με τον επαναπρογραμματισμό.
Είναι σημαντικό να σημειωθεί ότι το σύστημα δεν παρέχει άμεση ανάκληση (Callback) σχετικά με την επιτυχία εκτέλεσης της εργασίας παρασκηνίου — ο χειριστής πρέπει ο ίδιος να αναφέρει το αποτέλεσμα μέσω των ιδιοτήτων της εργασίας. Η setTaskCompleted επιτρέπει τη σήμανση της εργασίας ως επιτυχώς ολοκληρωμένης, μετά την οποία το σύστημα μπορεί να ξεκινήσει την επόμενη προγραμματισμένη εργασία αυτού του τύπου. Εάν η εργασία δεν καλέσει την setTaskCompleted, το σύστημα τη θεωρεί ολοκληρωμένη μετά τη λήξη του χρόνου ή κατά την αναγκαστική λήξη.
Για τη διάγνωση προβλημάτων συνιστάται η χρήση του OSLog στον χειριστή και η προβολή καταγραφών μέσω του Console.app σε Mac. Η Apple παρέχει επίσης το εργαλείο MetricKit για ανάλυση απόδοσης εργασιών παρασκηνίου — συλλέγει δεδομένα σχετικά με τον χρόνο εκτέλεσης, την κατανάλωση ενέργειας και τη συχνότητα εκτέλεσης, τα οποία μπορούν να χρησιμοποιηθούν για βελτιστοποίηση.
// Ακύρωση συγκεκριμένης εργασίας
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Ακύρωση όλων των εργασιών
BGTaskScheduler.shared.cancelAllTaskRequests()
// Έλεγχος προγραμματισμένων εργασιών
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("\(requests.count) εργασίες προγραμματίστηκαν")
}
BGTaskScheduler επιβάλλει αυστηρούς περιορισμούς στην εργασία παρασκηνίου. Το σύστημα μπορεί να καθυστερήσει την εργασία για αόριστο χρονικό διάστημα εάν οι συνθήκες είναι δυσμενείς. Ο προγραμματιστής πρέπει να κατανοεί ότι το πλαίσιο δεν είναι σχεδιασμένο για εργασίες πραγματικού χρόνου.
Μεταξύ των βασικών περιορισμών: το σύστημα δεν εγγυάται την εκτέλεση της εργασίας στον καθορισμένο χρόνο, ο μέγιστος αριθμός ταυτόχρονων εργασιών είναι περιορισμένος και η κατανάλωση ενέργειας ελέγχεται αυστηρά. Η εκτέλεση πολλών εργασιών διαδοχικά μπορεί να οδηγήσει σε συγχώνευση ή ακύρωσή τους.
Για την αύξηση της πιθανότητας εκτέλεσης, συνιστάται η ρύθμιση του earliestBeginDate όχι νωρίτερα από 1 ώρα για το BGProcessingTask και 15 λεπτά για το BGAppRefreshTask. Είναι επίσης σημαντικό να χειρίζεστε το expirationHandler — εάν η εργασία δεν χωράει στο όριο, το σύστημα καλεί αυτόν τον χειριστή για σωστό τερματισμό. Ο επαναπρογραμματισμός πρέπει να γίνεται εντός του ίδιου του χειριστή για να διατηρείται ένας συνεχής κύκλος εργασίας παρασκηνίου.
Ένας ακόμη σημαντικός περιορισμός αφορά τα αιτήματα δικτύου. Το BGTaskScheduler δεν εγγυάται την ύπαρξη ενεργής σύνδεσης δικτύου κατά την εκτέλεση της εργασίας. Η εφαρμογή πρέπει να ελέγχει η ίδια τη διαθεσιμότητα δικτύου μέσω του NWPathMonitor και να καθυστερεί την επεξεργασία εάν η σύνδεση απουσιάζει. Αυτό διαφέρει από το Android JobScheduler, το οποίο μπορεί να ενεργοποιήσει την εργασία μόνο όταν είναι συνδεδεμένο σε δίκτυο συγκεκριμένου τύπου. Στην πράξη, οι προγραμματιστές συχνά συνδυάζουν το BGTaskScheduler με συνεδρίες URL παρασκηνίου NSURLSession για αξιόπιστη φόρτωση δεδομένων.
Από το macOS Catalina, το BGTaskScheduler είναι επίσης διαθέσιμο σε Mac. Αυτό επιτρέπει τη δημιουργία διαπλατφορμικών εργασιών παρασκηνίου για εφαρμογές UIKit που εκτελούνται σε Apple Silicon. Στο watchOS, το πλαίσιο λειτουργεί περιορισμένα — διατίθενται μόνο σύντομες BGAppRefreshTask για ενημέρωση complication και συγχρονισμό δεδομένων με το iPhone. Οι προγραμματιστές πρέπει να λαμβάνουν υπόψη τις διαφορές πλατφόρμας κατά τον σχεδιασμό της αρχιτεκτονικής παρασκηνίου.
Για τον εντοπισμό σφαλμάτων στο BGTaskScheduler, η Apple παρέχει πολλά εργαλεία. Η εντολή e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] στο lldb εξαναγκάζει την εκτέλεση της εργασίας παρασκηνίου, αγνοώντας τους περιορισμούς του συστήματος. Στο Xcode είναι διαθέσιμη η σημαία Simulate Background Fetch στο μενού Debug, η οποία προσομοιώνει μια σύντομη ενημέρωση παρασκηνίου. Για ανάλυση απόδοσης χρησιμοποιείται το MetricKit — συλλέγει πληροφορίες σχετικά με τη συχνότητα εκτέλεσης, τη διάρκεια και την κατανάλωση ενέργειας κάθε εργασίας. Αυτά τα δεδομένα βοηθούν στη βελτιστοποίηση της συχνότητας προγραμματισμού και στην επιλογή του σωστού τύπου εργασίας.
Στην πράξη, το BGTaskScheduler είναι κατάλληλο για ενημέρωση δεδομένων widget, συγχρονισμό iCloud, επεξεργασία push ειδοποιήσεων με περιεχόμενο και ευρετηρίαση αναζήτησης Spotlight. Δεν είναι κατάλληλο για αποστολή αναλυτικών στοιχείων σε πραγματικό χρόνο, εφαρμογές συνομιλίας ή οποιεσδήποτε εργασίες απαιτούν άμεση εκτέλεση.
Για εμπεριστατωμένη μελέτη του BGTaskScheduler, η Apple συνιστά την επίσημη τεκμηρίωση WWDC: η συνεδρία “Advances in Background Tasks” (2020) καλύπτει τη μετεγκατάσταση από παλιά API, και η “Background Tasks in Practice” (2021) περιέχει πραγματικές περιπτώσεις χρήσης. Επίσης χρήσιμος είναι ο οδηγός Energy Efficiency Guide, όπου περιγράφεται πώς το πλαίσιο εντάσσεται στη συνολική στρατηγική εξοικονόμησης ενέργειας της Apple. Παραδείγματα κώδικα είναι διαθέσιμα στο επίσημο αποθετήριο Apple Developer στο GitHub με πλήρη έργα για iOS και macOS.
Συχνές Ερωτήσεις
Background Fetch περιοριζόταν σε μία εργασία παρασκηνίου ανά εφαρμογή και δεν είχε μηχανισμό προτεραιοτήτων. Το BGTaskScheduler υποστηρίζει πολλές εργασίες διαφορετικών τύπων, παρέχει ενιαίο API και αυτόματη διαχείριση ενέργειας.
Η Apple δεν θέτει ρητό όριο στον αριθμό των καταχωρημένων αναγνωριστικών, αλλά στην πράξη συνιστάται η χρήση όχι περισσότερων από 5–10 εργασιών. Ο μεγαλύτερος αριθμός μειώνει την πιθανότητα εκτέλεσης κάθε συγκεκριμένης εργασίας λόγω ανταγωνισμού για πόρους συστήματος.
Για εντοπισμό σφαλμάτων, χρησιμοποιήστε την εντολή e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] στο lldb. Εξαναγκάζει την εκτέλεση της εργασίας, παρακάμπτοντας τους περιορισμούς του συστήματος. Επίσης, η σημαία Xcode Simulate Background Fetch είναι διαθέσιμη στο μενού Debug.
Ναι, το BGTaskScheduler μπορεί να ξεκινήσει τη διαδικασία ακόμα και αν η εφαρμογή έχει κλείσει αναγκαστικά από τον χρήστη. Ωστόσο, το σύστημα μπορεί να εφαρμόσει πρόσθετες καθυστερήσεις και δεν εγγυώνται όλοι οι τύποι εργασιών την εκτέλεση σε αυτό το σενάριο.
Το σύστημα θα καλέσει το expirationHandler, στέλνοντας σήμα στην εργασία για την ανάγκη τερματισμού. Εάν η εφαρμογή αγνοήσει αυτό το σήμα και συνεχίσει να λειτουργεί, το iOS θα τερματίσει αναγκαστικά τη διαδικασία. Στη συνέχεια, το σύστημα μπορεί να μειώσει την προτεραιότητα όλων των εργασιών παρασκηνίου της εφαρμογής.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης