APP長時間后台運行


 *  參考: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]方法,可以說是多余的,我們完全可以刪除這個方法,在需要的時候單獨的改變或者開啟后台任務,其它的一些不做具體的修改說明。  起初當我需要達到這個目的時,我也是完全套用了原創的做法,然后在逐漸的修改,減少無用代碼,最后需求改變。。。要獲取物流狀態以及實時定位功能,這個正好讓我可以達到目的,我就在最初的時候直接開啟了定位。。。。當然耗電是肯定的。。內存感覺還可以。。

      以上僅僅是我個人的看法以及對代碼的理解,可能有很多不到位和錯誤的地方,希望各位大神給予意見以及修改的方向,讓我能夠深入的學習研究,多謝!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM