2011-03-22 9 views
17

Arka planda önemli konum değişikliklerini izleyen bir uygulama üzerinde çalışıyorum. Ben ios4 ve uygulama yaşam döngüsü hakkında tüm cevapları (iyi, sanırım!) Okuyorum, ama ne anlayamıyorum app arka planda uyandığında herhangi bir ağ erişimi yapıp yapamayacağımı önemli bir yer değişikliği sonucu.Önemli bir yer değişikliği için iphone uygulaması arka planda uyandırabilir mi ağ etkinliği yapın?

Uygulama şu anda TCP soketleri üzerinden ağ erişimine sahiptir. Uygulama askıya alındığında soket kapanır.

Soketi yeniden bağlayabilirim, bazı verileri alabilir, yeni konumu gönderebilir ve ardından konum değişikliği olayının bir sonucu olarak arka planda hala soketi kapatabilir miyim? Ofiste durağanken test etmek zor! Ağ etkinliğinin tamamlanması 10 saniyeden az sürdüğünü varsayabiliriz. Ayrıca uygulama bir voip uygulaması olarak kayıtlı değil varsayalım olabilir (olabilir mi?)

Herhangi bir fikir?

cevap

11

Yep. Ağ işlemlerinizi önemli değişiklik olaylarına dayanarak yapabilirsiniz.

Önemli değişikliklerde (sonlandırılmış veya askıya alınmış durumdan) arka plan durumuna uyandığınızda, http isteğinizi yapabilirsiniz. Uygulamanızın, HTTP isteğinizi tamamlamadan sonlandırıldığını görürseniz, UIApplication üzerindeki beginBackgroundTaskWithExpirationHandler: yöntemiyle ek arka plan işleme süresi isteyebilirsiniz.

Bunu test etmek için kısa tren yolculuklarında biraz zaman harcadım. :)

+0

Teşekkürler RBT, bu kesin bir şey. – Roger

+1

Teknik açıdan mümkün olabilir. Ama Apple buna izin veriyor mu? Uygulamanız (bu tekniği kullanarak) gerçekten onaylandı mı? – Toastor

+1

@Toastor Yep. Aslında o da bana öneren forumlarda bir Apple çalışanıydı. – RedBlueThing

4

RedBlueThing'in cevabını biraz ayrıntıyla onaylamak isterim.

Şimdi bunu yapmak için aşağıdakileri kullanıyorum. Söz bakarak epeyce insan görmek beri bu yardımcı oluyor Umut

bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: 
      ^{ 
       [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
      }]; 

// Now call methods doing network activity 
// ... 
// WHEN I KNOW THE LAST ACTION HAS COMPLETED USE THIS BLOCK OF CODE 

if (bgTask != UIBackgroundTaskInvalid) 
{ 
     [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
} 

UIBackgroundTaskIdentifier olarak bgTask bildirildi.

+0

Roger, ağ çağrılarınızı nasıl yaptınız? Arka planda gönderilmek için mücadele ediyorum, http://stackoverflow.com/questions/12463091/ios-background-location-not-sending-http-request –

İlgili konular