Background Fetch — μηχανισμός iOS που αφυπνίζει περιοδικά την εφαρμογή στο παρασκήνιο για λήψη φρέσκου περιεχομένου. Το σύστημα αναλύει τη συμπεριφορά του χρήστη και επιλέγει τα βέλτιστα παράθυρα για ενημέρωση. Σύμφωνα με τα δεδομένα της Apple, 2026, η εφαρμογή λαμβάνει από 30 έως 120 δευτερόλεπτα για να εκτελέσει τη λειτουργία, μετά από τα οποία το σύστημα αναστέλλει ή τερματίζει τη διαδικασία.
Κύρια σημεία
Background Fetch — είναι ένα iOS API που επιτρέπει στην εφαρμογή να λαμβάνει περιοδικά φρέσκα δεδομένα στο παρασκήνιο. Πρωτοπαρουσιάστηκε στο iOS 7 μαζί με τον μηχανισμό Background App Refresh. Κύριος στόχος — το περιεχόμενο να είναι ενημερωμένο τη στιγμή που ο χρήστης ανοίγει την εφαρμογή, χωρίς να χρειάζεται να περιμένει φόρτωση.
Οι ειδοποιήσεις Push ξεκινούν από τον διακομιστή — στέλνει ένα σήμα στη συσκευή και το σύστημα αποφασίζει αν θα αφυπνίσει την εφαρμογή ή όχι. Το Background Fetch ξεκινά από το ίδιο το iOS βάσει προτύπων χρήσης της συσκευής. Το Push είναι καταλληλότερο για επείγοντα μηνύματα, το Fetch — για προγραμματισμένη ενημέρωση περιεχομένου (ειδήσεις, ροή κοινωνικών δικτύων).
Background Fetch — ένας από τους διάφορους μηχανισμούς εκτέλεσης στο παρασκήνιο στο iOS. BGAppRefreshTask (iOS 13+) εκτελεί την ίδια εργασία, αλλά με πιο ευέλικτο προγραμματισμό. Background Modes (ήχος, τοποθεσία) — για συνεχείς λειτουργίες. Silent Push — ενημέρωση που ξεκινά από τον διακομιστή. Το Fetch παραμένει σχετικό για έργα που υποστηρίζουν iOS 12 και παλαιότερες εκδόσεις.
iOS χρησιμοποιεί αλγόριθμο μηχανικής μάθησης για τον προσδιορισμό του βέλτιστου χρόνου αφύπνισης της εφαρμογής. Το σύστημα αναλύει πότε ο χρήστης συνήθως ανοίγει την εφαρμογή, πόσο καιρό τη χρησιμοποιεί και πόσο συχνά επιστρέφει. Βάσει αυτών των δεδομένων, το iOS υπολογίζει τα παράθυρα για το Background Fetch.
Όταν το σύστημα αποφασίσει να αφυπνίσει την εφαρμογή, καλεί τη μέθοδο application(_:performFetchWithCompletionHandler:) στο AppDelegate. Η εφαρμογή πρέπει να κατεβάσει ελάχιστη ποσότητα νέων δεδομένων και να καλέσει τον completion handler με μία από τις τρεις καταστάσεις: .newData (δεδομένα λήφθηκαν), .noData (δεν υπάρχουν νέα δεδομένα) ή .failed (σφάλμα). Η κατάσταση επηρεάζει τη συχνότητα μελλοντικών αφυπνίσεων.
Η κατάσταση .newData ενημερώνει το σύστημα ότι η ενημέρωση ήταν χρήσιμη — το iOS μπορεί να αυξήσει τη συχνότητα αφύπνισης. Το .noData λέει ότι δεν υπάρχουν δεδομένα — η συχνότητα παραμένει ίδια ή μειώνεται. Το .failed σηματοδοτεί πρόβλημα — το σύστημα μειώνει τη συχνότητα για να μην εξαντλεί την μπαταρία. Η έμφαση πρέπει να είναι στην ειλικρινή κατάσταση, όχι στο εξαναγκασμένο .newData.
| Κατάσταση | Σημασία | Επίδραση |
|---|---|---|
| .newData | Δεδομένα λήφθηκαν επιτυχώς | Η συχνότητα μπορεί να αυξηθεί |
| .noData | Ο έλεγχος δεν έδωσε νέα δεδομένα | Η συχνότητα παραμένει ίδια |
| .failed | Σφάλμα δικτύου ή διακομιστή | Η συχνότητα μειώνεται |
Για να ενεργοποιήσετε το Background Fetch πρέπει να εκτελέσετε δύο βήματα: ενεργοποιήστε το capability στο Xcode και ορίστε το ελάχιστο διάστημα στον κώδικα. Το capability βρίσκεται στο Target — Signing & Capabilities — Background Modes — επιλέξτε το πλαίσιο Background Fetch. Χωρίς αυτό το βήμα, το σύστημα δεν θα αφυπνίσει την εφαρμογή.
Η μέθοδος UIApplication.shared.setMinimumBackgroundFetchInterval ορίζει τον ελάχιστο χρόνο σε δευτερόλεπτα μεταξύ κλήσεων Fetch. Η τιμή UIApplication.backgroundFetchIntervalMinimum (περίπου 15 λεπτά) υποδεικνύει στο σύστημα να αφυπνίζει την εφαρμογή όσο συχνά είναι ενεργειακά αποδοτικό. Ο ορισμός του διαστήματος στο application(_:didFinishLaunchingWithOptions:) είναι τυπική πρακτική.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
Κατά την ενεργοποίηση του Background Fetch στο Xcode, ενημερώνει αυτόματα το Info.plist — προσθέτει το κλειδί UIBackgroundModes με τιμή fetch. Αυτό είναι υποχρεωτικό βήμα: χωρίς αυτό η εφαρμογή δεν θα λάβει την κλήση performFetchWithCompletionHandler. Μπορείτε να ελέγξετε την παρουσία μέσω P list Source ή Build Settings.
Ας εξετάσουμε την πλήρη υλοποίηση του Background Fetch για μια εφαρμογή ειδήσεων. Η υλοποίηση περιλαμβάνει λήψη δεδομένων, προσωρινή αποθήκευση και κλήση του completion handler. Ο κώδικας εκτελείται στο AppDelegate — το μοναδικό σημείο όπου το σύστημα καλεί fetch.
func application(
_ application: UIApplication,
performFetchWithCompletionHandler handler: @escaping (UIBackgroundFetchResult) -> Void
) {
let url = URL(string: "https://api.example.com/latest")!
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
handler(.failed)
return
}
do {
let articles = try JSONDecoder().decode([Article].self, from: data)
cacheArticles(articles)
handler(articles.isEmpty ? .noData : .newData)
} catch {
handler(.failed)
}
}.resume()
}
Μετά τη λήψη δεδομένων μέσω Background Fetch, πρέπει να αποθηκευτούν σε τοπικό χώρο αποθήκευσης — CoreData, UserDefaults ή File Manager. Κατά το άνοιγμα της εφαρμογής, τα δεδομένα πρέπει ήδη να είναι διαθέσιμα. Χρησιμοποιήστε CoreData με περιβάλλον παρασκηνίου για ασφαλή εγγραφή σε νήματα. Μετά την αποθήκευση, ενημερώστε το UI στο κύριο νήμα.
func cacheArticles(_ articles: [Article]) {
let container = NSPersistentContainer(name: "AppModel")
container.performBackgroundTask { context in
articles.forEach { article in
let entity = ArticleEntity(context: context)
entity.id = Int64(article.id)
entity.title = article.title
entity.body = article.body
}
try? context.save()
}
}
Για δοκιμή χρησιμοποιήστε τον Simulator — επιλέξτε Debug — Simulate Background Fetch στο Xcode. Σε φυσική συσκευή, πρέπει να περιμένετε έως ότου το σύστημα αποφασίσει να εκτελέσει fetch. Για επιτάχυνση, μπορείτε να ορίσετε το ελάχιστο διάστημα σε 1 λεπτό, αλλά το σύστημα μπορεί και πάλι να το αγνοήσει όταν η μπαταρία είναι χαμηλή.
Background Fetch έχει μια σειρά περιορισμών που είναι σημαντικό να ληφθούν υπόψη κατά τον σχεδιασμό της αρχιτεκτονικής της εφαρμογής. Το κύριο — το σύστημα ελέγχει πλήρως τη συχνότητα κλήσεων και ο προγραμματιστής δεν μπορεί να την εγγυηθεί. Ακόμα και με ορισμένο ελάχιστο διάστημα, το σύστημα μπορεί να μην καλεί fetch για ώρες.
Το σύστημα διαθέτει στην εφαρμογή περιορισμένο χρόνο για την εκτέλεση της εργασίας — συνήθως έως 30 δευτερόλεπτα. Εάν η εφαρμογή δεν καλέσει τον completion handler εντός αυτού του χρόνου, το σύστημα τερματίζει βίαια τη διαδικασία και μειώνει τη συχνότητα μελλοντικών αφυπνίσεων. Όλα τα αιτήματα δικτύου πρέπει να είναι συμπαγή — όχι περισσότερα από 1–2 ανά κλήση.
Το iOS λαμβάνει υπόψη το επίπεδο φόρτισης της μπαταρίας κατά τον προγραμματισμό του Background Fetch. Όταν το επίπεδο είναι κάτω από 20%, η συχνότητα αφύπνισης μειώνεται. Όταν είναι ενεργοποιημένη η Low Power Mode, το σύστημα μπορεί να απενεργοποιήσει πλήρως τις ενημερώσεις παρασκηνίου για όλες τις εφαρμογές. Ο χρήστης μπορεί επίσης να απενεργοποιήσει το Background App Refresh για μια συγκεκριμένη εφαρμογή στις ρυθμίσεις.
Το URLSession που εκκινείται από το Background Fetch λειτουργεί σε τυπική λειτουργία — χωρίς υποστήριξη για συνεδρίες παρασκηνίου. Για μεγάλες λήψεις, χρησιμοποιήστε URLSession με background configuration. Το σύστημα θα συνεχίσει τη λήψη ακόμα και μετά την ολοκλήρωση του fetch, αλλά η πρόοδος δεν θα παρακολουθείται μέχρι την επόμενη αφύπνιση.
Από το iOS 13, η Apple συνιστά το BGTaskScheduler ως αντικατάσταση του Background Fetch. Το BGTaskScheduler παρέχει πιο ευέλικτο προγραμματισμό, δύο τύπους εργασιών (refresh και processing) και καταχώρηση εργασιών με αναγνωριστικά. Η μετεγκατάσταση περιλαμβάνει πολλά βήματα και συνιστάται για όλα τα νέα έργα.
Πρώτο βήμα — ορίστε τα αναγνωριστικά εργασιών στο Info.plist μέσω του κλειδιού BGTaskSchedulerPermittedIdentifiers. Δεύτερο — καταχωρήστε τις εργασίες στο AppDelegate μέσω του BGTaskScheduler.shared.register. Τρίτο — αντικαταστήστε την κλήση του performFetchWithCompletionHandler με τον handler που μεταβιβάστηκε στο register. Τέταρτο — καλέστε το submit για προγραμματισμό της εργασίας.
// Προηγουμένως (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// Μετά τη μετεγκατάσταση (BGTaskScheduler)
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.example.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
let request = BGAppRefreshTaskRequest(
identifier: "com.example.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
Το BGTaskScheduler παρέχει περισσότερο έλεγχο: BGProcessingTask για μακροχρόνιες λειτουργίες (έως 10 λεπτά), συνθήκες εκτέλεσης μέσω requiresNetworkConnectivity και requiresExternalPower, expiration handler για ομαλό τερματισμό. Το σύστημα αναλύει επίσης τη χρήση της εφαρμογής, αλλά ο προγραμματιστής μπορεί να ορίσει πιο ακριβείς απαιτήσεις.
Εάν η εφαρμογή υποστηρίζει iOS 12 και παλαιότερες εκδόσεις, το Background Fetch παραμένει η μοναδική επιλογή για περιοδική ενημέρωση. Το BGTaskScheduler είναι διαθέσιμο μόνο από iOS 13+. Σε αυτήν την περίπτωση, χρησιμοποιήστε ένα wrapper: ελέγξτε τη διαθεσιμότητα του BGTaskScheduler μέσω if #available(iOS 13, *) και καλέστε το αντίστοιχο API.
Συχνές Ερωτήσεις
Η ακριβής συχνότητα δεν είναι τεκμηριωμένη και εξαρτάται από τη συμπεριφορά του χρήστη. Το σύστημα αναλύει πόσο συχνά ο χρήστης ανοίγει την εφαρμογή και προσαρμόζει ανάλογα τη συχνότητα. Κατά μέσο όρο, με ενεργή χρήση, το fetch μπορεί να καλείται 1–3 φορές την ώρα. Με σπάνια χρήση — 1–2 φορές την ημέρα.
Ελέγξτε τρεις συνθήκες: Background Fetch capability είναι ενεργοποιημένη στο Xcode, έχει οριστεί το minimumBackgroundFetchInterval και ο χρήστης δεν έχει απενεργοποιήσει το Background App Refresh για την εφαρμογή στις ρυθμίσεις. Ελέγξτε επίσης ότι η συσκευή δεν είναι σε Low Power Mode και το επίπεδο μπαταρίας είναι πάνω από 20%.
Background Fetch — παλιό API (iOS 7), BGAppRefreshTask — νέο API (iOS 13+). Το BGAppRefreshTask παρέχει περισσότερο έλεγχο: expiration handler, δυνατότητα επαναπρογραμματισμού και έλεγχο κατάστασης. Το Background Fetch είναι απλούστερο στην υλοποίηση αλλά λιγότερο ευέλικτο. Η Apple συνιστά τη χρήση BGAppRefreshTask για νέα έργα.
Δεν συνιστάται. Background Fetch είναι περιορισμένο χρονικά (έως 30 δευτερόλεπτα). Για μεγάλες λήψεις, χρησιμοποιήστε URLSession με background configuration — το σύστημα θα συνεχίσει τη λήψη ακόμα και μετά την ολοκλήρωση του fetch. Εναλλακτική — BGProcessingTask (iOS 13+), όπου είναι διαθέσιμα έως 10 λεπτά και συνθήκες φόρτισης.
Ναι, κάθε αφύπνιση καταναλώνει ενέργεια για την ενεργοποίηση του επεξεργαστή, την αρχικοποίηση της στοίβας δικτύου και τη λήψη δεδομένων. Το iOS βελτιστοποιεί τη συχνότητα για να ελαχιστοποιήσει την επίδραση. Με σωστή υλοποίηση — λήψη μόνο νέων δεδομένων, γρήγορη κλήση του completion handler — η επίδραση στην μπαταρία είναι ελάχιστη.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης