2011-03-22 56 views
17

我正在研究監視後臺中重要位置更改的應用程序。我一直在閱讀關於ios4和應用程序生命週期的所有答案(當然,我想都是!),但是我無法弄清楚的是當應用程序在後臺被喚醒時是否可以進行任何網絡訪問作爲一個重大的位置變化的結果。iPhone應用程序可以在後臺喚醒以顯着改變位置嗎?

該應用程序當前通過TCP套接字進行網絡訪問。套接字在應用程序暫停時關閉。

作爲接收位置更改事件的結果,我是否可以重新連接套接字,接收一些數據,發送新位置,然後在仍處於後臺的情況下關閉套接字?在辦公室靜止時很難測試!我們可以假設網絡活動需要不到10秒的時間才能完成。還假定該應用程序沒有註冊爲一個VoIP應用程序(可能/應該是?...)

任何想法?

回答

11

是的。您可以根據重大變化事件來進行網絡處理。

當您在醒來時(從終止或暫停狀態)發生重大更改時喚醒到後臺狀態時,您可以發出http請求。如果您在完成HTTP請求之前發現應用程序被終止,則可以通過UIApplication上的beginBackgroundTaskWithExpirationHandler:方法要求額外的後臺處理時間。

我花了一段時間在短途旅行中測試了一下。 :)

+0

謝謝RBT,這聽起來很有說服力。 – Roger 2011-03-24 09:02:19

+1

從技術的角度來看,這是可能的。但蘋果允許嗎?您的應用程序(使用此技術)是否已獲得批准? – Toastor 2011-07-26 09:02:44

+1

@Toastor是的。事實上,這是一個在論壇上的蘋果員工,他們也建議我這樣做。 – RedBlueThing 2011-07-26 12:29:30

4

我只想確認RedBlueThing的答案的一些細節。

我現在使用以下來完成此操作。 bgTask被聲明爲UIBackgroundTaskIdentifier

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; 
} 

希望這有助於出去,因爲我看到不少人在關注這個問題。

+0

羅傑,你是如何實現你的網絡電話?我努力讓它們在後臺發送,http://stackoverflow.com/questions/12463091/ios-background-location-not-sending-http-request – 2012-09-17 21:15:12

相關問題