Background Fetch: τι είναι, αρχή λειτουργίας και ρύθμιση ενημερώσεων

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

Background Fetch — μηχανισμός iOS που αφυπνίζει περιοδικά την εφαρμογή στο παρασκήνιο για λήψη φρέσκου περιεχομένου. Το σύστημα αναλύει τη συμπεριφορά του χρήστη και επιλέγει τα βέλτιστα παράθυρα για ενημέρωση. Σύμφωνα με τα δεδομένα της Apple, 2026, η εφαρμογή λαμβάνει από 30 έως 120 δευτερόλεπτα για να εκτελέσει τη λειτουργία, μετά από τα οποία το σύστημα αναστέλλει ή τερματίζει τη διαδικασία.

Κύρια σημεία

  • Background Fetch — iOS API για περιοδική ενημέρωση περιεχομένου στο παρασκήνιο.
  • Το σύστημα διαχειρίζεται τη συχνότητα αφύπνισης βάσει ανάλυσης της συμπεριφοράς του χρήστη.
  • Ελάχιστο διάστημα ορίζεται μέσω του UIApplication.minimumBackgroundFetchInterval.
  • Απαξίωση — από iOS 13+ ο μηχανισμός θεωρείται legacy, συνιστάται το BGTaskScheduler.
  • Χρόνος εκτέλεσης — έως 30 δευτερόλεπτα, μετά από τα οποία το σύστημα τερματίζει βίαια την εργασία.

Τι είναι το Background Fetch στο iOS;

Background Fetch — είναι ένα iOS API που επιτρέπει στην εφαρμογή να λαμβάνει περιοδικά φρέσκα δεδομένα στο παρασκήνιο. Πρωτοπαρουσιάστηκε στο iOS 7 μαζί με τον μηχανισμό Background App Refresh. Κύριος στόχος — το περιεχόμενο να είναι ενημερωμένο τη στιγμή που ο χρήστης ανοίγει την εφαρμογή, χωρίς να χρειάζεται να περιμένει φόρτωση.

Διαφορά από τις ειδοποιήσεις Push

Οι ειδοποιήσεις Push ξεκινούν από τον διακομιστή — στέλνει ένα σήμα στη συσκευή και το σύστημα αποφασίζει αν θα αφυπνίσει την εφαρμογή ή όχι. Το Background Fetch ξεκινά από το ίδιο το iOS βάσει προτύπων χρήσης της συσκευής. Το Push είναι καταλληλότερο για επείγοντα μηνύματα, το Fetch — για προγραμματισμένη ενημέρωση περιεχομένου (ειδήσεις, ροή κοινωνικών δικτύων).

Θέση στο οικοσύστημα εργασιών παρασκηνίου

Background Fetch — ένας από τους διάφορους μηχανισμούς εκτέλεσης στο παρασκήνιο στο iOS. BGAppRefreshTask (iOS 13+) εκτελεί την ίδια εργασία, αλλά με πιο ευέλικτο προγραμματισμό. Background Modes (ήχος, τοποθεσία) — για συνεχείς λειτουργίες. Silent Push — ενημέρωση που ξεκινά από τον διακομιστή. Το Fetch παραμένει σχετικό για έργα που υποστηρίζουν iOS 12 και παλαιότερες εκδόσεις.

  • Background Fetch — περιοδικό, ξεκινά από το σύστημα, iOS 7+.
  • BGAppRefreshTask — περιοδικό, ξεκινά από το σύστημα, iOS 13+.
  • BGProcessingTask — μακροχρόνιες εργασίες, iOS 13+.
  • Silent Push — ξεκινά από τον διακομιστή, iOS 7+.

Πώς λειτουργεί το Background Fetch: αρχιτεκτονική και κύκλος ζωής

iOS χρησιμοποιεί αλγόριθμο μηχανικής μάθησης για τον προσδιορισμό του βέλτιστου χρόνου αφύπνισης της εφαρμογής. Το σύστημα αναλύει πότε ο χρήστης συνήθως ανοίγει την εφαρμογή, πόσο καιρό τη χρησιμοποιεί και πόσο συχνά επιστρέφει. Βάσει αυτών των δεδομένων, το iOS υπολογίζει τα παράθυρα για το Background Fetch.

Διαδικασία εκτέλεσης εργασίας

Όταν το σύστημα αποφασίσει να αφυπνίσει την εφαρμογή, καλεί τη μέθοδο application(_:performFetchWithCompletionHandler:) στο AppDelegate. Η εφαρμογή πρέπει να κατεβάσει ελάχιστη ποσότητα νέων δεδομένων και να καλέσει τον completion handler με μία από τις τρεις καταστάσεις: .newData (δεδομένα λήφθηκαν), .noData (δεν υπάρχουν νέα δεδομένα) ή .failed (σφάλμα). Η κατάσταση επηρεάζει τη συχνότητα μελλοντικών αφυπνίσεων.

Επίδραση του completion handler στη συχνότητα κλήσεων

Η κατάσταση .newData ενημερώνει το σύστημα ότι η ενημέρωση ήταν χρήσιμη — το iOS μπορεί να αυξήσει τη συχνότητα αφύπνισης. Το .noData λέει ότι δεν υπάρχουν δεδομένα — η συχνότητα παραμένει ίδια ή μειώνεται. Το .failed σηματοδοτεί πρόβλημα — το σύστημα μειώνει τη συχνότητα για να μην εξαντλεί την μπαταρία. Η έμφαση πρέπει να είναι στην ειλικρινή κατάσταση, όχι στο εξαναγκασμένο .newData.

ΚατάστασηΣημασίαΕπίδραση
.newDataΔεδομένα λήφθηκαν επιτυχώςΗ συχνότητα μπορεί να αυξηθεί
.noDataΟ έλεγχος δεν έδωσε νέα δεδομέναΗ συχνότητα παραμένει ίδια
.failedΣφάλμα δικτύου ή διακομιστήΗ συχνότητα μειώνεται

Ρύθμιση Background Fetch σε έργο Xcode

Για να ενεργοποιήσετε το Background Fetch πρέπει να εκτελέσετε δύο βήματα: ενεργοποιήστε το capability στο Xcode και ορίστε το ελάχιστο διάστημα στον κώδικα. Το capability βρίσκεται στο Target — Signing & Capabilities — Background Modes — επιλέξτε το πλαίσιο Background Fetch. Χωρίς αυτό το βήμα, το σύστημα δεν θα αφυπνίσει την εφαρμογή.

Ορισμός ελάχιστου διαστήματος

Η μέθοδος UIApplication.shared.setMinimumBackgroundFetchInterval ορίζει τον ελάχιστο χρόνο σε δευτερόλεπτα μεταξύ κλήσεων Fetch. Η τιμή UIApplication.backgroundFetchIntervalMinimum (περίπου 15 λεπτά) υποδεικνύει στο σύστημα να αφυπνίζει την εφαρμογή όσο συχνά είναι ενεργειακά αποδοτικό. Ο ορισμός του διαστήματος στο application(_:didFinishLaunchingWithOptions:) είναι τυπική πρακτική.

swift
func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
    UIApplication.shared.setMinimumBackgroundFetchInterval(
        UIApplication.backgroundFetchIntervalMinimum
    )
    return true
}

Info.plist και capability

Κατά την ενεργοποίηση του Background Fetch στο Xcode, ενημερώνει αυτόματα το Info.plist — προσθέτει το κλειδί UIBackgroundModes με τιμή fetch. Αυτό είναι υποχρεωτικό βήμα: χωρίς αυτό η εφαρμογή δεν θα λάβει την κλήση performFetchWithCompletionHandler. Μπορείτε να ελέγξετε την παρουσία μέσω P list Source ή Build Settings.

Παραδείγματα κώδικα Background Fetch σε Swift

Ας εξετάσουμε την πλήρη υλοποίηση του Background Fetch για μια εφαρμογή ειδήσεων. Η υλοποίηση περιλαμβάνει λήψη δεδομένων, προσωρινή αποθήκευση και κλήση του completion handler. Ο κώδικας εκτελείται στο AppDelegate — το μοναδικό σημείο όπου το σύστημα καλεί fetch.

swift
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 στο κύριο νήμα.

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

Δοκιμή Background Fetch

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

Μετεγκατάσταση από Background Fetch σε BGTaskScheduler

Από το iOS 13, η Apple συνιστά το BGTaskScheduler ως αντικατάσταση του Background Fetch. Το BGTaskScheduler παρέχει πιο ευέλικτο προγραμματισμό, δύο τύπους εργασιών (refresh και processing) και καταχώρηση εργασιών με αναγνωριστικά. Η μετεγκατάσταση περιλαμβάνει πολλά βήματα και συνιστάται για όλα τα νέα έργα.

Βήμα προς βήμα μετεγκατάσταση

Πρώτο βήμα — ορίστε τα αναγνωριστικά εργασιών στο Info.plist μέσω του κλειδιού BGTaskSchedulerPermittedIdentifiers. Δεύτερο — καταχωρήστε τις εργασίες στο AppDelegate μέσω του BGTaskScheduler.shared.register. Τρίτο — αντικαταστήστε την κλήση του performFetchWithCompletionHandler με τον handler που μεταβιβάστηκε στο register. Τέταρτο — καλέστε το submit για προγραμματισμό της εργασίας.

swift
// Προηγουμένως (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

Το BGTaskScheduler παρέχει περισσότερο έλεγχο: BGProcessingTask για μακροχρόνιες λειτουργίες (έως 10 λεπτά), συνθήκες εκτέλεσης μέσω requiresNetworkConnectivity και requiresExternalPower, expiration handler για ομαλό τερματισμό. Το σύστημα αναλύει επίσης τη χρήση της εφαρμογής, αλλά ο προγραμματιστής μπορεί να ορίσει πιο ακριβείς απαιτήσεις.

Πότε να διατηρήσετε το Background Fetch

Εάν η εφαρμογή υποστηρίζει iOS 12 και παλαιότερες εκδόσεις, το Background Fetch παραμένει η μοναδική επιλογή για περιοδική ενημέρωση. Το BGTaskScheduler είναι διαθέσιμο μόνο από iOS 13+. Σε αυτήν την περίπτωση, χρησιμοποιήστε ένα wrapper: ελέγξτε τη διαθεσιμότητα του BGTaskScheduler μέσω if #available(iOS 13, *) και καλέστε το αντίστοιχο API.

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

Πόσο συχνά το iOS καλεί το Background Fetch;

Η ακριβής συχνότητα δεν είναι τεκμηριωμένη και εξαρτάται από τη συμπεριφορά του χρήστη. Το σύστημα αναλύει πόσο συχνά ο χρήστης ανοίγει την εφαρμογή και προσαρμόζει ανάλογα τη συχνότητα. Κατά μέσο όρο, με ενεργή χρήση, το fetch μπορεί να καλείται 1–3 φορές την ώρα. Με σπάνια χρήση — 1–2 φορές την ημέρα.

Γιατί δεν καλείται το Background Fetch μου;

Ελέγξτε τρεις συνθήκες: Background Fetch capability είναι ενεργοποιημένη στο Xcode, έχει οριστεί το minimumBackgroundFetchInterval και ο χρήστης δεν έχει απενεργοποιήσει το Background App Refresh για την εφαρμογή στις ρυθμίσεις. Ελέγξτε επίσης ότι η συσκευή δεν είναι σε Low Power Mode και το επίπεδο μπαταρίας είναι πάνω από 20%.

Ποια είναι η διαφορά μεταξύ Background Fetch και BGAppRefreshTask;

Background Fetch — παλιό API (iOS 7), BGAppRefreshTask — νέο API (iOS 13+). Το BGAppRefreshTask παρέχει περισσότερο έλεγχο: expiration handler, δυνατότητα επαναπρογραμματισμού και έλεγχο κατάστασης. Το Background Fetch είναι απλούστερο στην υλοποίηση αλλά λιγότερο ευέλικτο. Η Apple συνιστά τη χρήση BGAppRefreshTask για νέα έργα.

Μπορούν να ληφθούν μεγάλα αρχεία μέσω Background Fetch;

Δεν συνιστάται. Background Fetch είναι περιορισμένο χρονικά (έως 30 δευτερόλεπτα). Για μεγάλες λήψεις, χρησιμοποιήστε URLSession με background configuration — το σύστημα θα συνεχίσει τη λήψη ακόμα και μετά την ολοκλήρωση του fetch. Εναλλακτική — BGProcessingTask (iOS 13+), όπου είναι διαθέσιμα έως 10 λεπτά και συνθήκες φόρτισης.

Καταναλώνει το Background Fetch μπαταρία;

Ναι, κάθε αφύπνιση καταναλώνει ενέργεια για την ενεργοποίηση του επεξεργαστή, την αρχικοποίηση της στοίβας δικτύου και τη λήψη δεδομένων. Το iOS βελτιστοποιεί τη συχνότητα για να ελαχιστοποιήσει την επίδραση. Με σωστή υλοποίηση — λήψη μόνο νέων δεδομένων, γρήγορη κλήση του completion handler — η επίδραση στην μπαταρία είναι ελάχιστη.

Σύνοψη

  • Background Fetch — iOS API για περιοδική λήψη δεδομένων στο παρασκήνιο, διαθέσιμο από iOS 7 και συνιστάται η αντικατάστασή του με BGTaskScheduler.
  • Το σύστημα διαχειρίζεται τη συχνότητα κλήσεων αναλύοντας τη συμπεριφορά του χρήστη — ο προγραμματιστής δεν μπορεί να εγγυηθεί τον χρόνο αφύπνισης.
  • Τρεις καταστάσεις του completion handler — .newData, .noData, .failed — επηρεάζουν τη συχνότητα μελλοντικών αφυπνίσεων της εφαρμογής.
  • Περιορισμός 30 δευτερολέπτων — μην εκτελείτε μακροχρόνιες λειτουργίες ή πολλαπλά διαδοχικά αιτήματα δικτύου.
  • Capability υποχρεωτική — Background Fetch στο Xcode + ορισμός minimumBackgroundFetchInterval στον κώδικα.
  • BGTaskScheduler — σύγχρονη αντικατάσταση από iOS 13+, που παρέχει περισσότερο έλεγχο και δύο τύπους εργασιών.
  • Για έργα που υποστηρίζουν iOS 12 και παλαιότερες εκδόσεις, χρησιμοποιήστε Background Fetch με έλεγχο διαθεσιμότητας του BGTaskScheduler μέσω if #available.

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

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

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

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