iOS

iOS7’de Arka Plan Görevi Tamamlama

iOS7 ile birlikte arka plan görevi tamamlamanın (background task completion) çalışma şekli bazı değişiklikler oldu. Ayrıntıya girmeden önce iOS’ta çoklu görev konusunu biraz açıklamaya çalışayım. Çoklu görev (multitasking) iOS4 ile başladı ve her yeni iOS ...

Abdulbasıt Tanhan |

07.11.2013

 

iOS7 ile birlikte arka plan görevi tamamlamanın (background task completion) çalışma şekli bazı değişiklikler oldu. Ayrıntıya girmeden önce iOS’ta çoklu görev konusunu biraz açıklamaya çalışayım.

Çoklu görev (multitasking) iOS4 ile başladı ve her yeni iOS sürümünde de üzerine eklenerek geliştirilmeye devam ediyor. 2 Ekim Cumartesi günü Geleceği Yazanlar ekibi olarak DevFest İstanbul 2013’e katıldık. Bizim için keyifli ve verimli bir tecrübe oldu. Burada sorulan sorulardan ve proje fikirlerinden çoğu, arka planda servis çalıştırma ile ilgiliydi. Genç uygulama geliştiricileri kullanıcıları rahatsız etmeden arka planda servis çalıştırarak bazı özellikler sunmak istiyor. Yakınmaları daha çok Android platformu isteklerini karşılıyorken, iOS ortamında bunu nasıl yapabileceklerinden emin olmamaları.

iOS bu konuda biraz daha kapalı. Bunun nedenini aslında anlamak zor değil. Apple'ın öncelikli amaçlarından biri, kullanıcı bilgilerini korumak, pil ömrünü uzatmak ve hücresel veri kullanımını verimli kullanmak. iOS’ta bazı durumlar dışında arka planda servis çalıştırmak mümkün değil. Ayrıca bu servisler uygulamayı tamamen öldürdüğünüzde çalışamıyor maalesef.

Hemen üzülmeyin, çünkü kullanıcılara sağlayabileceğiniz birçok yararlı arka plan servisi var.

Arka planda çalışma servisleri;

  • Arka plan görevi tamamlama
  • Arka plan ses oynatma
  • Konum servisleri
  • VoIP
  • Newsstand

 

Arka Plan Görevi Tamamlama

Uygulama arka plana atıldığında aşağıdakine benzer bir kodu sınıfınızın UIApplicationDelegate protokollerinden applicationWillResignActive metoduna koyabilirsiniz. Bu sayede uygulamayı arka plana atsanız ve telefonunuzu uyku moduna alsanız bile, kısıtlı bir süre için herhangi bir işlemi tamamlama şansına sahipsiniz. Bu dediğim iOS 7’ye kadar geçerli. iOS 7’deki güncellemeyi grafiğiyle birlikte aşağıda açıklamaya çalıştım.

Background Task Completion örnek kodu;

[cpp]if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])

{

NSLog(@"Çoklu görev desteklenir");

 

__block UIBackgroundTaskIdentifier background_task;

background_task = [application beginBackgroundTaskWithExpirationHandler:^ {

 

//Bittiginde yapilmasi gerekenler

[application endBackgroundTask: background_task];

background_task = UIBackgroundTaskInvalid;

}];

 

//Kod blogunu asenkron yapmak icin

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

 

//### arka plan görevi başladı

NSLog(@"Arka planda çalışıyorum\n");

while(TRUE)

{

NSLog(@"Kalan zamanım: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);

[NSThread sleepForTimeInterval:1]; //1 saniye bekle

}

//#### arka plan görevi bitti

 

//Clean up code. Tell the system that we are done.

[application endBackgroundTask: background_task];

background_task = UIBackgroundTaskInvalid;

});

}

else

{

NSLog(@"Çoklu görev desteklenmiyor.");

}[/cpp]

Bu kod satırından kalan kalan zamanınızı görebilirsiniz;

[code]NSLog(@"Kalan zamanım: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);[/code]

Arka plan görevi kullanım alanlarına örnek;

  • Video işleme
  • Dosya transferleri, indirme ve yükleme işlemleri
  • Veritabanı işlemlerini tamamlama

Aşağıdaki grafikte arka plan görev tamamlama akışını görebilirsiniz. iOS 6'da görev bitene kadar işlemde herhangi bir kesinti olmadan işlemi bitirme şansına sahipsiniz. Uygulamayı arka plana alıp telefonunuzu uyku durumuna alsanız bile telefonunuz tamamen uyku durumuna ancak arka plan görevini tamamladığında giriyor.

iOS 7 ile bunun değiştiğini, aşağıdaki akıştan da görebilirsiniz. Uygulamayı arka plana aldınız ve bir süre sonra uyku durumuna geçtiniz; bu durumda arka plan görevi durdurulmuş oluyor. Herhangi bir zamanda telefonunuzu uyku durumundan çıkardığınız an, arka plan görevi devam ediyor. Buradaki amaç, daha önce de belirtildiği gibi pil ömrünü uzatmak. Apple buradaki geçişi sağlamak için NSURLSession sınıfını kullanmayı öneriyor.

Bu konu uzun olduğu için bir sonraki bloğumda değinmek üzere çok ayrıntıya girmiyorum. Dilerseniz İnternet'ten NSURLSession ile ilgili birçok eğitim ve örnek bulabilirsiniz.

iOS 7 sonrası dikkat edilmesi gerekenler;

  • Uygulamalar artık cihazı uyanık tutamayacak,
  • Daha önce olduğu gibi birkaç dakikanız olacak arka plan görevi için,
  • Görevin sürekli olarak sürmesi kesin değil.