Background Fetch, yeni içerik indirmek için arka planda periyodik olarak uygulamayı uyandıran bir iOS mekanizmasıdır. Sistem, kullanıcı davranışını analiz eder ve güncelleme için en uygun zaman aralıklarını seçer. Apple, 2026'ya göre, uygulama işlemi gerçekleştirmek için 30 ila 120 saniye alır, ardından sistem süreci askıya alır veya sonlandırır.
Önemli Noktalar
Background Fetch, uygulamanın arka planda periyodik olarak yeni veri almasını sağlayan bir iOS API'sidir. İlk olarak iOS 7'de Background App Refresh mekanizmasıyla birlikte tanıtılmıştır. Ana hedef, kullanıcı uygulamayı açtığında içeriğin güncel olması ve yükleme beklenmesine gerek kalmamasıdır.
Push bildirimleri sunucu tarafından başlatılır — sunucu cihaza sinyal gönderir ve sistem uygulamayı uyandırıp uyandırmayacağına karar verir. Background Fetch, cihaz kullanım modellerine dayanarak iOS'un kendisi tarafından başlatılır. Push acil mesajlar için daha uygundur, Fetch ise planlı içerik güncellemeleri (haberler, sosyal medya akışı) içindir.
Background Fetch, iOS'ta birkaç arka plan yürütme mekanizmasından biridir. BGAppRefreshTask (iOS 13+) aynı görevi ancak daha esnek planlamayla gerçekleştirir. Background Modes (ses, konum) sürekli işlemler içindir. Silent Push, sunucu tarafından başlatılan güncellemelerdir. Fetch, iOS 12 ve altını destekleyen projeler için geçerliliğini korur.
iOS, uygulamayı uyandırmak için en uygun zamanı belirlemek üzere makine öğrenimi algoritması kullanır. Sistem, kullanıcının genellikle uygulamayı ne zaman açtığını, ne kadar süre kullandığını ve ne sıklıkla geri döndüğünü analiz eder. Bu verilere dayanarak iOS, Background Fetch için zaman aralıklarını hesaplar.
Sistem uygulamayı uyandırmaya karar verdiğinde, AppDelegate'te application(_:performFetchWithCompletionHandler:) metodunu çağırır. Uygulama minimum miktarda yeni veri yüklemeli ve üç durumdan biriyle tamamlama işleyicisini çağırmalıdır: .newData (veri yüklendi), .noData (yeni veri yok) veya .failed (hata). Durum, gelecekteki uyandırma sıklığını etkiler.
.newData durumu, sisteme güncellemenin faydalı olduğunu bildirir — iOS uyandırma sıklığını artırabilir. .noData, veri olmadığını belirtir — sıklık aynı kalır veya azalır. .failed bir sorun olduğunu gösterir — sistem pil tasarrufu için sıklığı azaltır. Vurgu, .newData'yı zorlamak değil, dürüst bir durum üzerinde olmalıdır.
| Durum | Anlamı | Etkisi |
|---|---|---|
| .newData | Veriler başarıyla yüklendi | Sıklık artabilir |
| .noData | Kontrol yeni veri vermedi | Sıklık aynı kalır |
| .failed | Ağ veya sunucu hatası | Sıklık azalır |
Background Fetch'i etkinleştirmek için iki adım gereklidir: Xcode'da yeteneği etkinleştirin ve kodda minimum aralığı ayarlayın. Yetenek, Target — Signing & Capabilities — Background Modes — Background Fetch kutusunu işaretlemekte bulunur. Bu adım olmadan, sistem uygulamayı uyandırmaz.
UIApplication.shared.setMinimumBackgroundFetchInterval metodu, Fetch çağrıları arasındaki minimum süreyi saniye cinsinden ayarlar. UIApplication.backgroundFetchIntervalMinimum değeri (yaklaşık 15 dakika), sisteme uygulamayı enerji verimli olduğu kadar sık uyandırmasını söyler. Aralığı application(_:didFinishLaunchingWithOptions:) içinde ayarlamak standart uygulamadır.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
Xcode'da Background Fetch etkinleştirildiğinde, Info.plist otomatik olarak güncellenir — UIBackgroundModes anahtarına fetch değeri eklenir. Bu zorunlu bir adımdır: bu olmadan uygulama performFetchWithCompletionHandler çağrısını almaz. P list Source veya Build Settings aracılığıyla doğrulayabilirsiniz.
Bir haber uygulaması için tam bir Background Fetch uygulamasına bakalım. Uygulama, veri yükleme, önbelleğe alma ve tamamlama işleyicisi çağrısını içerir. Kod, AppDelegate'te çalışır — sistemin fetch'i çağırdığı tek yer.
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 aracılığıyla veri yüklendikten sonra, yerel depolamaya — CoreData, UserDefaults veya File Manager'a kaydedilmesi gerekir. Uygulama açıldığında veriler zaten kullanılabilir olmalıdır. İş parçacığı güvenli yazma için arka plan bağlamıyla CoreData kullanın. Kaydettikten sonra, ana iş parçacığında kullanıcı arayüzünü güncelleyin.
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()
}
}
Test için Simülatör'ü kullanın — Xcode'da Debug — Simulate Background Fetch'i seçin. Fiziksel bir cihazda, sistemin fetch yapmaya karar vermesini beklemeniz gerekir. Hızlandırmak için minimum aralığı 1 dakikaya ayarlayabilirsiniz, ancak pil zayıf olduğunda sistem bunu yok sayabilir.
Background Fetch'in, uygulama mimarisini tasarlarken dikkate alınması gereken birkaç sınırlaması vardır. En önemlisi, sistem çağrı sıklığını tamamen kontrol eder ve geliştirici bunu garanti edemez. Minimum aralık ayarlanmış olsa bile, sistem saatlerce fetch'i çağırmayabilir.
Sistem, görevi yürütmesi için uygulamaya sınırlı süre tahsis eder — genellikle 30 saniyeye kadar. Uygulama bu süre içinde tamamlama işleyicisini çağırmazsa, sistem süreci zorla sonlandırır ve gelecekteki uyandırma sıklığını azaltır. Tüm ağ istekleri kompakt olmalıdır — çağrı başına 1-2'den fazla olmamalıdır.
iOS, Background Fetch'i planlarken pil seviyesini dikkate alır. Şarj %20'nin altında olduğunda, uyandırma sıklığı azalır. Düşük Güç Modu etkinleştirildiğinde, sistem tüm uygulamalar için arka plan güncellemelerini tamamen devre dışı bırakabilir. Kullanıcı, ayarlardan belirli bir uygulama için Background App Refresh'i de devre dışı bırakabilir.
Background Fetch'ten başlatılan URLSession, standart modda çalışır — arka plan oturum desteği olmadan. Büyük indirmeler için arka plan yapılandırmasıyla URLSession kullanın. Sistem, fetch tamamlandıktan sonra bile indirmeye devam eder, ancak bir sonraki uyandırmaya kadar ilerleme izlenmez.
iOS 13'ten itibaren Apple, BGTaskScheduler'ı Background Fetch'in yerine önermektedir. BGTaskScheduler daha esnek planlama, iki görev türü (yenileme ve işleme) ve tanımlayıcılarla görev kaydı sağlar. Geçiş birkaç adım içerir ve tüm yeni projeler için önerilir.
İlk adım — BGTaskSchedulerPermittedIdentifiers anahtarı aracılığıyla Info.plist'te görev tanımlayıcılarını tanımlamak. İkinci — BGTaskScheduler.shared.register aracılığıyla AppDelegate'te görevleri kaydetmek. Üçüncü — performFetchWithCompletionHandler çağrısını register'a iletilen işleyiciyle değiştirmek. Dördüncü — görevi planlamak için submit'i çağırmak.
// Önce (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// Geçişten sonra (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 daha fazla kontrol sağlar: uzun işlemler için BGProcessingTask (10 dakikaya kadar), requiresNetworkConnectivity ve requiresExternalPower aracılığıyla yürütme koşulları ve kontrollü sonlandırma için bir süre sonu işleyicisi. Sistem ayrıca uygulama kullanımını analiz eder, ancak geliştirici daha kesin gereksinimler belirleyebilir.
Uygulama iOS 12 ve altını destekliyorsa, Background Fetch periyodik güncellemeler için tek seçenek olarak kalır. BGTaskScheduler yalnızca iOS 13+'ten itibaren kullanılabilir. Bu durumda, bir sarmalayıcı kullanın: if #available(iOS 13, *) aracılığıyla kullanılabilirliği kontrol edin ve uygun API'yi çağırın.
Sıkça Sorulan Sorular
Kesin sıklık belgelenmemiştir ve kullanıcı davranışına bağlıdır. Sistem, kullanıcının uygulamayı ne sıklıkta açtığını analiz eder ve sıklığı buna göre ayarlar. Ortalama olarak, aktif kullanımda fetch saatte 1–3 kez çağrılabilir. Seyrek kullanımda — günde 1–2 kez.
Üç koşulu kontrol edin: Background Fetch yeteneği Xcode'da etkinleştirilmiş, minimumBackgroundFetchInterval ayarlanmış ve kullanıcı ayarlardan uygulama için Background App Refresh'i devre dışı bırakmamış. Ayrıca cihazın Düşük Güç Modu'nda olmadığını ve pil seviyesinin %20'nin üzerinde olduğunu kontrol edin.
Background Fetch eski API'dir (iOS 7), BGAppRefreshTask ise yeni API'dir (iOS 13+). BGAppRefreshTask daha fazla kontrol sağlar: süre sonu işleyicisi, yeniden planlama yeteneği ve durum kontrolü. Background Fetch uygulaması daha basittir ancak daha az esnektir. Apple yeni projeler için BGAppRefreshTask kullanılmasını önerir.
Önerilmez. Background Fetch zaman sınırlıdır (30 saniyeye kadar). Büyük indirmeler için arka plan yapılandırmasıyla URLSession kullanın — sistem fetch tamamlandıktan sonra bile indirmeye devam eder. Alternatif, 10 dakikaya kadar ve şarj koşullarına izin veren BGProcessingTask'tir (iOS 13+).
Evet, her uyandırma işlemciyi açmak, ağ yığınını başlatmak ve veri yüklemek için enerji tüketir. iOS, etkiyi en aza indirmek için sıklığı optimize eder. Doğru uygulamayla — yalnızca yeni veri yükleme, hızlı tamamlama işleyicisi çağrısı — pil etkisi minimumdur.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun