2012-12-14 20 views
5


Koşu, ben beginBackgroundTaskWithExpirationHandler() altına koyduk ve böylece, aynı için on dakika ayrılmalıdır. Ancak, uygulamanın bundan önce askıya alındığını düşünüyorum. Yaptığım görev bellek ve CPU yoğun olduğu için, işletim sisteminin uygulamayı askıya alma durumuna getirmesi mümkün mü?
Öyleyse, bu kısıtlamaları atlamanın bir yolu var mı? (Özel API'leri kullanmaya açığım). onun basınçlı
Uygulamanın, arka plan durumuna girdiğinde bazı işlem yapıyorum sonlu uzunlukta arka plan görevi

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

     if([[UIDevice currentDevice] isMultitaskingSupported]){ 
      __block UIBackgroundTaskIdentifier bgTask; 
      UIApplication *application = [UIApplication sharedApplication]; 
      bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

        [application endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid; 
      }]; 

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
       [self captureImage]; 
       [application endBackgroundTask:bgTask]; 
       bgTask = UIBackgroundTaskInvalid; 
      }); 
     } 
    } 
+0

Arka plan görevini başlatmak için kullandığınız kodu gösterebilir misiniz? – Nate

+2

Bu nasıl oluyor da * gerçek bir soru değil *? – Nate

cevap

2

Ben Daij-Dan tamamen doğru olduğundan emin değilim uygulamanızı çalıştırmak için ios zorlamak için hiçbir yolu yoktur.

ona katılıyorum bu bölümü:

the os may kill you at any time when its pressured. 

Ancak kelime "baskı" oldukça belirsiz. Ve ben daha fazla zamana yasal olarak talep edilen uygulamayı askıya almak için çok fazla baskı (örnek olarak düşük bellek) olması gerektiğine inanıyorum. Bir yandan, gerçek bir senaryo örneği. Öte yandan, bu sık sık oluyor (iOS cihazları bugünlerde oldukça fazla belleğe sahip).

Bu yöntemde her çağrı tarafından dengelenmelidir: dokümantasyon (http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html) Gönderen

endBackgroundTask ile eşleşen bir çağrı: yöntemi. Arka plan görevlerini çalıştıran uygulamaların, bunları çalıştırmak için sınırlı bir süre vardır. (backgroundTimeRemaining özelliğini kullanarak ne kadar zaman olduğunu öğrenebilirsiniz.) EndBackgroundTask çağrısı yapmazsanız: zaman geçmeden önce her görev için sistem uygulamayı durdurur. İşleyici parametresinde bir blok nesnesi sağlarsanız, sistem, görev sona erdirilmeden önce, görev sona erdirmek için işvereninizi arar.

tavsiye ediyorum:

  • tamamlama işleyicisi bazı günlükleri ekle

Ve uygulamanızın askıya var ise inceleme sistemi konsol günlükleri (backgroundTimeremaining dahil) mantığı ile günlüklerine günlükleri ekle .

P.S. Kamu API'sı olduğu için iphone-privateapi etiketini kaldırdım.

+0

Teşekkürler. BackgroundTimeRemaining özelliğini kullandım ve sadece 0'a kadar ani bir düşüş bulmak için kalan süreyi izledim. –

+0

Bu ilginç. Sistem konsolunda bu konuda şüpheli bir şey gördünüz mü (hiç böyle bir durum görmemiştim). –

1

os her an sizi öldürebilir: Burada

arka plan görevi başlatma kodudur. On dakika hakkında hiçbir garanti yoktur. (eğer uslu durursan da çok daha uzun çalıştırabilirsiniz: D)

AFAIK