Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
iOS'ta arka plan oluşturma işlemini gerçekleştirmenin en basit yolu, arka plan gereksinimlerinizi görevlere bölmek ve görevleri arka planda çalıştırmaktır. Görevler katı bir süre sınırının altındadır ve genellikle bir uygulama iOS 6'da arka plana taşındıktan sonra yaklaşık 600 saniye (10 dakika) işleme süresi alır ve iOS 7+ üzerinde 10 dakikadan kısa sürer.
Arka plan görevleri üç kategoriye ayrılabilir:
- Arka Planda Kasa Görevler - Uygulamanın arka plana girmesi halinde kesintiye uğramasını istemediğiniz bir görevin bulunduğu herhangi bir yerde çağrılır.
- DidEnterBackground Görevleri - Temizleme ve durum kaydetmeye yardımcı olmak için uygulama yaşam döngüsü yöntemi sırasında
DidEnterBackground
çağrılır. - Arka Plan Aktarımları (iOS 7+) - iOS 7'de ağ aktarımları gerçekleştirmek için kullanılan özel bir arka plan görevi türüdür. Normal görevlerin aksine, arka plan aktarımlarının önceden belirlenmiş bir zaman sınırı yoktur.
Arka plan açısından güvenlidir ve DidEnterBackground
görevler hem iOS 6 hem de iOS 7'de kullanılabilir ve bazı küçük farklılıklar vardır. Şimdi bu iki görev türünü daha ayrıntılı olarak inceleyelim.
Arka Plan Kasa Görevleri Oluşturma
Bazı uygulamalar, uygulamanın durumunu değiştirmesi durumunda iOS tarafından kesintiye uğramaması gereken görevler içerir. Bu görevleri kesintiye uğramaktan korumanın bir yolu, bunları uzun süre çalışan görevler olarak iOS'a kaydetmektir. Bu düzeni, kullanıcı uygulamayı arka plana yerleştirdiği durumlarda, uygulamanızda bir görevin kesintiye uğramasını istemediğiniz herhangi bir yerde kullanabilirsiniz. Bu düzen için harika bir aday, sunucunuza yeni bir kullanıcının kayıt bilgilerini gönderme veya oturum açma bilgilerini doğrulama gibi görevlerdir.
Aşağıdaki kod parçacığında, arka planda çalıştırılacak bir görevin kaydedilmesi gösterilmektedir:
nint taskID = UIApplication.SharedApplication.BeginBackgroundTask( () => {});
//runs on main or background thread
FinishLongRunningTask(taskID);
UIApplication.SharedApplication.EndBackgroundTask(taskID);
Kayıt işlemi, bir görevi benzersiz bir tanımlayıcıyla taskID
eşleştirip eşleştirme BeginBackgroundTask
ve EndBackgroundTask
çağrılara sarmalar. Tanımlayıcıyı oluşturmak için nesnedeki BeginBackgroundTask
UIApplication
yöntemine bir çağrı yapar ve uzun süre çalışan görevi (genellikle yeni bir iş parçacığında) başlatırız. Görev tamamlandığında, aynı tanımlayıcıyı çağırır EndBackgroundTask
ve geçiririz. Bu önemlidir çünkü bir çağrının eşleşen EndBackgroundTask
bir BeginBackgroundTask
özelliği yoksa iOS uygulamayı sonlandıracaktır.
Önemli
Arka plan açısından güvenli görevler, uygulamanın gereksinimlerine bağlı olarak ana iş parçacığında veya arka plan iş parçacığında çalıştırılabilir.
DidEnterBackground Sırasında Görevleri Gerçekleştirme
Uzun süre çalışan bir görevi arka planda güvenli hale getirmenin yanı sıra, bir uygulama arka plana yerleştirilirken görevleri başlatmak için de kayıt kullanılabilir. iOS, AppDelegate sınıfında uygulama durumunu kaydetmek, kullanıcı verilerini kaydetmek ve bir uygulama arka plana girmeden önce hassas içeriği şifrelemek için kullanılabilecek adlı DidEnterBackground
bir olay yöntemi sağlar. Bir uygulamanın bu yöntemden döndürülmesi için yaklaşık beş saniye vardır, aksi takdirde sonlandırılır. Bu nedenle, beş saniyeden uzun sürebilecek temizleme görevlerinin tamamlanması yöntemin DidEnterBackground
içinden çağrılabilir. Bu görevler ayrı bir iş parçacığında çağrılmalıdır.
İşlem, uzun süre çalışan bir görevi kaydetme işlemiyle neredeyse aynıdır. Aşağıdaki kod parçacığı bunu uygulamada gösterir:
public override void DidEnterBackground (UIApplication application) {
nint taskID = UIApplication.SharedApplication.BeginBackgroundTask( () => {});
new Task ( () => {
DoWork();
UIApplication.SharedApplication.EndBackgroundTask(taskID);
}).Start();
}
önceki örnekte yaptığımız gibi aracılığıyla görevimizi BeginBackgroundTask
kaydettiğiniz içindeki yöntemini AppDelegate
geçersiz kılarak DidEnterBackground
başlıyoruz. Ardından yeni bir iş parçacığı oluşturacak ve uzun süre çalışan görevimizi gerçekleştireceğiz. EndBackgroundTask
Yöntemi zaten döndürmüş olacağından, çağrısının artık uzun süre çalışan görevin DidEnterBackground
içinden yapıldığını unutmayın.
Önemli
iOS, bir uygulamanın kullanıcı arabiriminin yanıt vermeye devam etmesini sağlamak için bir izleme mekanizması kullanır. içinde çok fazla zaman DidEnterBackground
harcayan bir uygulama kullanıcı arabiriminde yanıt vermemeye başlayacaktır. Görevlerin arka planda çalıştırılmasını başlatmak, kullanıcı arabiriminin yanıt vermesini ve watchdog'un uygulamayı öldürmesini önleyerek zamanında geri dönmenizi sağlar DidEnterBackground
.
Arka Plan Görev Süresi Sınırlarını İşleme
iOS, arka plan görevinin ne kadar süreyle çalışabileceğine ilişkin katı sınırlar uygular ve çağrı ayrılan süre içinde yapılmazsa EndBackgroundTask
uygulama sonlandırılır. Kalan arka plan oluşturma süresini takip ederek ve gerektiğinde süre sonu işleyicilerini kullanarak iOS'un uygulamayı sonlandırmasını önleyebiliriz.
Kalan Arka Plan Süresine Erişme
Kayıtlı görevleri olan bir uygulama arka plana taşınırsa, kayıtlı görevlerin çalıştırılması yaklaşık 600 saniye sürer. Sınıfın statik BackgroundTimeRemaining
özelliğini UIApplication
kullanarak görevin tamamlanması için gereken süreyi denetleyebiliriz. Aşağıdaki kod, arka plan görevimizin kaldığı süreyi saniye olarak verir:
double timeRemaining = UIApplication.SharedApplication.BackgroundTimeRemaining;
Süre Sonu İşleyicileriyle Uygulama Sonlandırmayı Önleme
iOS, özelliğine erişim vermenin BackgroundTimeRemaining
yanı sıra, Süre Sonu İşleyicisi aracılığıyla arka plan süresi sona erme süresini işlemek için zarif bir yol sağlar. Bu, bir görev için ayrılan süre dolmak üzereyken yürütülecek isteğe bağlı bir kod bloğudur. Süre Sonu İşleyicisi'ndeki kod, uygulamanın düzgün çalıştığını gösteren ve görev süresi dolsa bile iOS'un uygulamayı sonlandırmasını önleyen görev kimliğini çağırır EndBackgroundTask
ve geçirir. EndBackgroundTask
hem süre sonu işleyicisi içinde hem de yürütmenin normal seyrinde çağrılmalıdır.
Süre sonu işleyicisi, aşağıda gösterildiği gibi lambda ifadesi kullanılarak anonim bir işlev olarak ifade edilir:
Task.Factory.StartNew( () => {
//expirationHandler only called if background time allowed exceeded
var taskId = UIApplication.SharedApplication.BeginBackgroundTask(() => {
Console.WriteLine("Exhausted time");
UIApplication.SharedApplication.EndBackgroundTask(taskId);
});
while(myFlag == true)
{
Console.WriteLine(UIApplication.SharedApplication.BackgroundTimeRemaining);
myFlag = SomeCalculationNeedsMoreTime();
}
//Only called if loop terminated due to myFlag and not expiration of time
UIApplication.SharedApplication.EndBackgroundTask(taskId);
});
Kodun çalışması için süre sonu işleyicileri gerekli olmasa da, arka plan göreviyle her zaman bir süre sonu işleyicisi kullanmanız gerekir.
iOS 7+'da Arka Plan Görevleri
iOS 7'de arka plan görevleriyle ilgili en büyük değişiklik, görevlerin nasıl uygulandığı değil, ne zaman çalıştırıldıklarıdır.
iOS 7 öncesi, arka planda çalışan bir görevin tamamlanması için 600 saniye olduğunu hatırlayın. Bu sınırın bir nedeni, arka planda çalışan bir görevin görev süresi boyunca cihazı uyanık tutmasıdır:
iOS 7 arka plan işleme, daha uzun pil ömrü için iyileştirilmiştir. iOS 7'de arka plan oluşturma fırsatçı hale gelir: Cihazın uyku moduna geçmesi yerine, görevler uyku moduna geçtiğinde dikkate alınır ve cihaz telefon aramaları, bildirimler, gelen e-postalar ve diğer yaygın kesintileri işlemek için uyandığında işlemlerini öbekler halinde yapar. Aşağıdaki diyagramda bir görevin nasıl ayrılabileceğine ilişkin içgörüler sağlanmaktadır:
Görev çalışma süresi artık sürekli olmadığından, ağ aktarımları gerçekleştiren görevlerin iOS 7'de farklı şekilde işlenmesi gerekir. Geliştiricilerin ağ aktarımlarını işlemek için API'yi kullanmaları NSURlSession
teşvik edilir. Sonraki bölümde arka plan aktarımları hakkında genel bir bakış sağlanır.
Arka Plan Aktarımları
iOS 7'de arka plan aktarımlarının omurgası yeni NSURLSession
API'dir. NSURLSession
şu görevler oluşturmamıza olanak tanır:
- Ağ ve cihaz kesintileri aracılığıyla içerik aktarma.
- Büyük dosyaları karşıya yükleme ve indirme ( Arka Plan Aktarım Hizmeti ).
Şimdi bunun nasıl çalıştığına daha yakından bakalım.
NSURLSession API
NSURLSession
ağ üzerinden içerik aktarmak için güçlü bir API'dir. Ağ kesintileri ve uygulama durumlarındaki değişiklikler aracılığıyla veri aktarımını işlemek için bir dizi araç sağlar.
NSURLSession
API bir veya birkaç oturum oluşturur ve bu oturumlar da görevleri ağ üzerinden ilgili veri bloklarını aktarmak için oluşturur. Görevler, verileri hızlı ve güvenilir bir şekilde aktarmak için zaman uyumsuz olarak çalışır. NSURLSession
Zaman uyumsuz olduğundan, aktarım tamamlandığında sisteme ve uygulamaya bildirmek için her oturum bir tamamlama işleyici bloğu gerektirir.
Hem iOS 7 öncesi hem de iOS 7 sonrası için geçerli olan bir ağ aktarımı gerçekleştirmek için, aktarımları sıralamak için kullanılabilir NSURLSession
olup olmadığını denetleyin ve şu değilse aktarımı gerçekleştirmek için normal bir arka plan görevi kullanın:
if ([NSURLSession class]) {
// Create a background session and enqueue transfers
}
else {
// Start a background task and transfer directly
// Do NOT make calls to update the UI here!
}
Önemli
iOS 6 arka plan kullanıcı arabirimi güncelleştirmelerini desteklemediğinden ve uygulamayı sonlandıracağı için iOS 6 uyumlu kodda kullanıcı arabirimini arka planda güncelleştirmek için çağrı yapmaktan kaçının.
NSURLSession
API, kimlik doğrulamasını işlemek, başarısız aktarımları yönetmek ve istemci tarafı (sunucu tarafı değil) hataları raporlamak için zengin bir özellik kümesi içerir. iOS 7'de tanıtılan görev çalışma süresindeki kesintileri kapatmaya yardımcı olur ve ayrıca büyük dosyaların hızlı ve güvenilir bir şekilde aktarılması için destek sağlar. Sonraki bölümde bu ikinci özellik inceler.
Arka Plan Aktarım Hizmeti
iOS 7'ye başlamadan önce dosyaları arka planda karşıya yüklemek veya indirmek güvenilir değildi. Arka plan görevlerinin çalıştırılması sınırlı bir süre alır, ancak bir dosyayı aktarmak için gereken süre ağ ve dosyanın boyutuna göre değişir. iOS 7'de, büyük dosyaları başarıyla karşıya yüklemek ve indirmek için bir NSURLSession
kullanabiliriz. Arka planda büyük dosyaların ağ aktarımlarını işleyen belirli NSURLSession
oturum türü, Arka Plan Aktarım Hizmeti olarak bilinir.
Arka Plan Aktarım Hizmeti kullanılarak başlatılan aktarımlar işletim sistemi tarafından yönetilir ve kimlik doğrulaması ile hataları işlemek için API'ler sağlar. Aktarımlar rastgele bir süre sınırına bağlı olmadığından, büyük dosyaları karşıya yüklemek veya indirmek, arka planda içeriği otomatik olarak güncelleştirmek ve daha fazlası için kullanılabilir. Hizmetin nasıl uygulanacağına ilişkin ayrıntılar için Arka Plan Aktarımı kılavuzuna bakın.
Arka Plan Aktarım Hizmeti genellikle uygulamaların arka planda içeriği yenilemesine yardımcı olmak için Arka Plan Getirme veya Uzak Bildirimler ile eşleştirilir. Sonraki iki bölümde, tüm uygulamaları hem iOS 6 hem de iOS 7'de arka planda çalışacak şekilde kaydetme kavramını tanıtacağız.