* 參考:http://www.nivalxer.com/archives/187
首先,我要說明的是在iOS中,一般應用程序在后台掛起之后僅擁有3分鍾時間來處理相應的未完成事件,但是3分鍾之后就會被系統直接殺死;我們這時還可以再次向后台申請10分鍾來處理需要處理的未完成事件,但是10分鍾之后就再也不能請求道額外的時間來做事情了,然而有時候為了滿足功能的需要,我們需要始終的讓程序在后台運行,這時候就想到了iOS中的幾種特殊的功能:1. voip技術:對於這種技術我也僅僅是知道而已,而且根據查閱的資料覺得這種方法比較麻煩;2.后台始終(循環)播放無聲音樂: 這種方法可以使用,但是要注意在上架過程中可能會因為這個原因被拒;3.后台定位:這種技術被運用的較多,特別是一些正好需要定位來支持相應功能的APP(上架時要注意標明)。
下面就是當你使用定位來保持程序后台始終運行的相應代碼:
1.因為iOS 9 的特殊性,所以我們先定義一個判斷方法以及聲明相應的屬性
2.下面我就貼出具體的代碼了,這些代碼是參考別人的,我會在下面解釋代碼的具體含義,同時給出優化方案,優化后的代碼並沒有單獨寫成Demo,所以就不具體的說明了,但是我會把這里的代碼給出說明:
好了,這些就是全部的代碼,當然如果你什么都不改變,只把你的判斷加進去,只求達到目的的整體移植過去也是可以達到目的的,但是個人覺得總重要的還是能夠知道每一句代碼是干什么的,這樣如果后續需求改變或者需要添加改變什么功能,也就能很快找到入口了。不多說了。接下來就來分析一下這部分代碼的具體含義吧。
********注意:如果你的項目中本身就需要定位,那么建議不要使用上述代碼,直接在appdelegate.m文件中啟動定位就可,否則做個太多的無用功。而且上述代碼的整體意義就是為了喚醒程序的,並沒有其他的特殊意義*************
總的來說,代碼是通過3個(個人感覺)死循環來實現的程序喚醒激活,從而保證應用程序不被后台殺死。
首先,我們初始化狀態值,(關於iOS判斷和相應屬性的設置必不可少,否則程序依然會被殺死)緊跟着APP啟動后我們會調用-[self monitorBatteryStateInBackground]方法,在這個方法中改變狀態,同時調用-
[self startBackgroundTask];方法來開啟后台任務,接下來程序進入- (void)applicationDidBecomeActive:(UIApplication *)application方法,並且在這個方法中我們改變狀態的BOOL值,此時 _jobExpired BOOL NO false _background BOOL NO false,=======》》
程序這個時候已經在前台運行完畢,而此時其[self startBackgroundTask]依然在運行着。。。我們可以發現此時並沒有什么用。
接下來,我們點擊Home鍵,退出前台,進入后台運行,此時調用方法- (void)applicationDidEnterBackground:(UIApplication *)application,這時:_jobExpired BOOL NO false _background BOOL NO false 然后我們看到其調用了最初寫的那個回調方法,並且進入后台,再次調用[self monitorBatteryStateInBackground]--------》_jobExpired BOOL NO false _background BOOL YES true
在這里面改變狀態值,調用[self startBackgroundTask]方法,此時才可以說進入后台任務,在后台任務中,我們發現那些什么標志位啊,神馬的貌似都沒有什么用,真正有用的也就是 位置更新 一個計數器的循環工作,以及下面的那個后台時間逐次遞減等等。。。。然后切記關注最后依然有一次狀態值的改變,在這里的改變是來控制上面的回調方法是否可以進入的判斷條件。
總的來說,他就是依賴於BOOL值改變,進入回調循環--計數器循環定位---后台剩余時間循環,來使程序始終運行,不被殺死的。
從上面的分析我們可以看到,對於僅僅達到始終運行的目的來說,很多冗余代碼(僅僅對於我們沒用,原創肯定有別的用法),而且在一些循環改變BOOL值得過程中,我們可以看到,其實他調用[self monitorBatteryStateInBackground]方法,可以說是多余的,我們完全可以刪除這個方法,在需要的時候單獨的改變或者開啟后台任務,其它的一些不做具體的修改說明。 起初當我需要達到這個目的時,我也是完全套用了原創的做法,然后在逐漸的修改,減少無用代碼,最后需求改變。。。要獲取物流狀態以及實時定位功能,這個正好讓我可以達到目的,我就在最初的時候直接開啟了定位。。。。當然耗電是肯定的。。內存感覺還可以。。
以上僅僅是我個人的看法以及對代碼的理解,可能有很多不到位和錯誤的地方,希望各位大神給予意見以及修改的方向,讓我能夠深入的學習研究,多謝!!!!