2016-03-01 75 views
1

我讀了很多關於iOS背景知識,但我仍然有理解概念的概念。背景http請求ios上的「殺死應用程序」

當我的應用程序因taskmanager(或由於內存壓力而被iOS所殺)併發生了significantLocationChange或GeoFence時,我的整個應用程序都由iOS啓動,並調用我的回調方法。

這裏第一個問題是:我在什麼狀態?即使是用戶界面部分加載,所以我是前景,但由於顯示屏上沒有任何東西,我認爲它是背景。

我的第二個和主要問題是,如何發送http請求並重新發送它們,如果互聯網連接當前關閉?

我試過使用[NSThread sleepWithInterval],dispatch延遲和NSTimer。它們都具有相同的不良結果:它在前景中效果很好,在NORMAL背景下很好(用戶按下homebutton),但在上述狀態下效果很差。如果運行速度足夠快,我可以發送多個http請求,但當我需要幾秒鐘睡眠時,我會隨機殺死。當我使用2秒延遲的定時器時,我能夠達到我的「重新發送http請求」方法2-3次,讓所有輸出的應用程序停止。如果我使用我計劃的30秒延遲,我甚至不會收到一次定時器呼叫。

所以最後一個問題是:是否有我需要註冊的背景權限?我已經使用

<key>UIBackgroundModes</key> 
<array> 
    <string>location</string> 
</array> 

或者它會幫助使用NSOperationQueue?它有我沒有的特殊權限嗎?

回答

1

你可以通過調用

[[UIApplication sharedApplication] applicationState] 

在你的情況檢查應用程序的狀態應該是UIApplicationStateBackground。如果您使用的是您的網絡請求NSURLSession


,你可以用一個後臺會話配置設置。當您的應用程序處於後臺時,即使您的應用程序未運行,這也將允許系統處理網絡請求。

+0

Thx爲您的答案。我能夠看到,我真的在後臺(枚舉2),至少這是很好的知道。 – Jens

+0

但是對於你的另一點,我已經使用NSURLSession,問題是,我仍然需要一個定時器或類似的,將調用NSURLSession的方法。而且看起來應用程序在計時器觸發之前就已經死了。 – Jens

+1

這是沒有辦法的,你的應用程序只能獲得少量的時間在後臺運行。因爲我不知道你爲什麼試圖添加一個計時器,所以我會說,不使用計時器就可以解決問題。 –