BGTaskScheduler, iOS 13 ve sonrası uygulamalarda arka plan görevlerini planlamak ve yürütmek için Apple'ın framework'üdür. Kullanımdan kaldırılan Background Fetch ve performFetch'in yerini alarak arka plan işlemleri için birleşik bir API sağlar. Apple Developer Documentation, 2026'ya göre framework iki tür görev içerir: uzun işlemler için BGProcessingTask ve kısa içerik güncellemeleri için BGAppRefreshTask.
Önemli Noktalar
BGTaskScheduler, iOS 13'te tanıtılan ve arka plan görevlerinin yürütülmesini merkezi olarak yöneten bir Apple sistem framework'üdür. Ortaya çıkmasından önce geliştiriciler UIApplication backgroundTasks, performFetch ve appDelegate'te olay işleme kullanıyordu, bu da kod parçalanmasına ve öngörülemeyen davranışa yol açıyordu.
Framework ertelenmiş planlama prensibiyle çalışır: uygulama benzersiz tanımlayıcılarla görevleri kaydeder ve iOS bunları yürütmek için en uygun anı belirler. Sistem pil seviyesini, kullanıcı etkinliğini, ağ durumunu ve diğer faktörleri dikkate alır.
Temel yetenekler hem kısa hem de uzun arka plan işlemleriyle çalışmayı içerir. Android'deki AlarmManager'ın aksine, BGTaskScheduler kesin yürütme süresini garanti etmez — sistem koşullar elverişsizse bir görevi erteleme hakkını saklı tutar.
BGTaskScheduler işleyici (handler) tabanlı bir mimari kullanır. Uygulama her görev türü için bir işleyici kaydeder ve sistem uygun an geldiğinde onu çağırır. Framework'ün kendisi görevi doğrudan yürütmez — yalnızca uygulamaya çalıştırma zamanının geldiğini bildirir.
Kayıt, Info.plist dosyasında BGTaskSchedulerPermittedIdentifiers dizisi aracılığıyla görev tanımlayıcısının bildirilmesiyle başlar. Ardından uygulama kodunda, bir işleyici closure ile registerHandler(forTaskWithIdentifier:) yöntemi çağrılır.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// zorla sonlandırmada çağrılır
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Kayıttan sonra uygulama, submitTaskRequest aracılığıyla görev yürütmeyi açıkça talep etmelidir. Talep, görev tanımlayıcısını ve mümkün olan en erken başlangıç tarihini içerir. Sistem talebi kaydeder ve koşulları uygun gördüğünde işler.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Planlama hatası: \(error)")
}
BGTaskScheduler, her biri kendi kullanım senaryosu için tasarlanmış iki ana görev türü sağlar. Doğru türü seçmek, sistem tarafından görevin başarıyla yürütülme olasılığını doğrudan etkiler.
BGAppRefreshTask, kısa arka plan içerik güncellemeleri için tasarlanmıştır: yeni veri yükleme, sunucuyla senkronizasyon, widget'ları güncelleme. Yürütme süresi 30 saniye ile sınırlıdır ve sonrasında sistem görevi zorla sonlandırır. Bu görev türü BGProcessingTask'tan daha sık çalışır ve daha yüksek önceliğe sahiptir.
BGProcessingTask daha uzun işlemler için tasarlanmıştır: medya dosyalarını işleme, Core Data indeksleme, yedekleme oluşturma. Görev birkaç dakikaya kadar çalışabilir, ancak sistem onu daha az sıklıkta ve yalnızca uygun koşullarda başlatır — güce bağlı, kararlı Wi-Fi ve düşük cihaz yükü.
| Parametre | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Süre sınırı | 30 saniye | birkaç dakika |
| Başlatma sıklığı | yüksek | düşük |
| Koşullar | herhangi | güç + Wi-Fi |
| Güç gerektirir | hayır | önerilir |
| Örnek | feed güncelleme | video işleme |
Doğru kayıt, BGTaskScheduler'ın çalışması için zorunlu bir koşuldur. Bir görev Info.plist'te kayıtlı değilse, sistem onu yürütme talebini görmezden gelir.
Info.plist dosyası, dize tanımlayıcılarının bir listesiyle BGTaskSchedulerPermittedIdentifiers dizisini içermelidir. Her tanımlayıcı uygulama içinde benzersiz olmalıdır. Apple, ters alan adı notasyonu kullanılmasını önerir.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Bir görevi planlamak için submitTaskRequest yöntemini kullanın. Bir göreve artık ihtiyaç duyulmuyorsa, cancelTaskRequest veya cancelAllTaskRequests aracılığıyla iptal edilebilir. Sistem, uygulama silindiğinde veya veriler sıfırlandığında da görevleri otomatik olarak iptal eder.
BGTaskScheduler, getPendingTaskRequests aracılığıyla planlanmış görevlerin durumunu izleme olanağı sağlar. Bu yöntem, türleri, tanımlayıcıları ve earliestBeginDate'leri hakkında bilgi içeren tüm aktif taleplerin listesini döndürür. Her talep için, zaten tamamlanıp tamamlanmadığını veya iptal edilip edilmediğini kontrol edebilir ve yeniden planlamaya karar verebilirsiniz.
Sistemin bir arka plan görevinin başarısı hakkında doğrudan bir geri arama sağlamadığını unutmamak önemlidir — işleyicinin kendisi sonucu görev özellikleri aracılığıyla bildirmelidir. setTaskCompleted, bir görevi başarıyla tamamlanmış olarak işaretlemeye izin verir, ardından sistem bu türdeki bir sonraki planlanmış görevi başlatabilir. Bir görev setTaskCompleted'ı çağırmazsa, sistem onu zaman aşımı veya zorla sonlandırmada tamamlanmış sayar.
Teşhis için, işleyicide OSLog kullanılması ve Mac'te Console.app aracılığıyla günlüklerin görüntülenmesi önerilir. Apple ayrıca arka plan görev performansını analiz etmek için MetricKit aracı sağlar — yürütme süresi, enerji tüketimi ve başlatma sıklığı hakkında optimizasyon için kullanılabilecek verileri toplar.
// Belirli görevi iptal et
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Tüm görevleri iptal et
BGTaskScheduler.shared.cancelAllTaskRequests()
// Planlanan görevleri kontrol et
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("\(requests.count) görev planlandı")
}
BGTaskScheduler, arka plan çalışmasına katı sınırlamalar getirir. Sistem, koşullar elverişsizse bir görevi süresiz olarak erteleyebilir. Geliştiriciler, framework'ün gerçek zamanlı görevler için tasarlanmadığını anlamalıdır.
Temel sınırlamalar şunları içerir: sistem belirtilen zamanda görev yürütmeyi garanti etmez, eşzamanlı görevlerin maksimum sayısı sınırlıdır ve enerji tüketimi sıkı bir şekilde kontrol edilir. Birden fazla görevi art arda çalıştırmak, bunların birleştirilmesine veya iptal edilmesine neden olabilir.
Yürütme olasılığını artırmak için, BGProcessingTask için 1 saatten ve BGAppRefreshTask için 15 dakikadan daha erken olmayacak şekilde earliestBeginDate ayarlanması önerilir. expirationHandler'ı işlemek de önemlidir — bir görev zaman sınırını karşılayamazsa, sistem uygun sonlandırma için bu işleyiciyi çağırır. Sürekli bir arka plan çalışma döngüsünü sürdürmek için yeniden planlama işleyicinin içinde yapılmalıdır.
Bir diğer önemli sınırlama ağ istekleri ile ilgilidir. BGTaskScheduler, görev yürütme sırasında aktif bir ağ bağlantısını garanti etmez. Uygulama, NWPathMonitor aracılığıyla ağ kullanılabilirliğini bağımsız olarak kontrol etmeli ve bağlantı yoksa işlemeyi ertelemelidir. Bu, belirli bir ağ türüne bağlandığında görevi etkinleştirebilen Android JobScheduler'dan farklıdır. Pratikte geliştiriciler, güvenilir veri yükleme için BGTaskScheduler'ı NSURLSession'ın arka plan URL oturumlarıyla birleştirir.
macOS Catalina'dan itibaren BGTaskScheduler Mac'te de kullanılabilir. Bu, Apple Silicon'da çalışan UIKit uygulamaları için platformlar arası arka plan görevleri oluşturmaya olanak tanır. watchOS'ta framework sınırlı işlevselliğe sahiptir — yalnızca komplikasyonları güncellemek ve iPhone ile veri senkronize etmek için kısa BGAppRefreshTask'ler mevcuttur. Geliştiriciler, arka plan mimarisini planlarken platform farklılıklarını dikkate almalıdır.
Apple, BGTaskScheduler'da hata ayıklamak için çeşitli araçlar sağlar. lldb'deki e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] komutu, sistem sınırlamalarını atlayarak bir arka plan görevini zorla başlatır. Xcode'un Debug menüsünde kısa bir arka plan güncellemesini simüle eden Simulate Background Fetch bayrağı bulunur. Performans analizi için MetricKit kullanılır — her görevin başlatma sıklığı, yürütme süresi ve enerji tüketimi hakkında bilgi toplar. Bu veriler, planlama sıklığını optimize etmeye ve doğru görev türünü seçmeye yardımcı olur.
Pratikte BGTaskScheduler, widget verilerini güncellemek, iCloud senkronizasyonu, içerikli push bildirimlerini işleme ve Spotlight arama için indeksleme için uygundur. Gerçek zamanlı analiz, sohbet uygulamaları veya anında yürütme gerektiren herhangi bir görev için uygun değildir.
BGTaskScheduler'ın derinlemesine incelenmesi için Apple, resmi WWDC dokümantasyonunu önerir: "Advances in Background Tasks" oturumu (2020) kullanımdan kaldırılan API'lerden geçişi kapsar ve "Background Tasks in Practice" (2021) gerçek kullanım durumlarını içerir. Energy Efficiency Guide bölümü de framework'ün Apple'ın genel enerji tasarrufu stratejisine nasıl uyduğunu açıklaması açısından faydalıdır. Kod örnekleri, GitHub'daki resmi Apple Developer deposunda iOS ve macOS için tam projelerle birlikte mevcuttur.
Sıkça sorulan sorular
Background Fetch uygulama başına bir arka plan göreviyle sınırlıydı ve öncelik mekanizması yoktu. BGTaskScheduler, farklı türlerde birden çok görevi destekler, birleşik bir API ve otomatik enerji yönetimi sağlar.
Apple, kayıtlı tanımlayıcıların sayısına açık bir sınır koymaz, ancak pratikte 5–10'dan fazla görev kullanılmaması önerilir. Daha fazla sayı, sistem kaynakları için rekabet nedeniyle her bir belirli görevin yürütülme olasılığını azaltır.
Hata ayıklama için lldb'de e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] komutunu kullanın. Sistem sınırlamalarını atlayarak bir görevi zorla başlatır. Debug menüsündeki Xcode Simulate Background Fetch bayrağı da mevcuttur.
Evet, BGTaskScheduler, uygulama kullanıcı tarafından zorla kapatılmış olsa bile bir süreç başlatabilir. Ancak sistem ek gecikmeler uygulayabilir ve tüm görev türleri bu senaryoda yürütmeyi garanti etmez.
Sistem expirationHandler'ı çağırarak göreve sonlanması gerektiğini bildirir. Uygulama bu sinyali görmezden gelir ve çalışmaya devam ederse, iOS süreci zorla sonlandırır. Bundan sonra sistem, uygulamanın tüm arka plan görevlerinin önceliğini düşürebilir.
Ö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