後臺執行以及保持程式在後臺長時間執行

發表於2016-08-19

第一部分

1.先說說iOS 應用程式5個狀態:

停止執行-應用程式已經終止,或者還未啟動。

不活動-應用程式處於前臺但不再接收事件(例如,使用者在app處於活動時鎖住了裝置)。

活動-app處於“使用中”的狀態。

後臺-app不再螢幕上顯示,但它仍然執行程式碼。

掛起-app仍然駐留記憶體但不再執行程式碼。

按下Home鍵時,app從活動狀態轉入後臺,絕大部分app通常在幾秒內就從後臺變成了掛起。

在記憶體吃緊的時候,iphone會首先關閉那些掛起的app。

從 iOS 4 開始,應用就可以在退到後臺後,繼續執行一小段時間(10 分鐘);

2.還可以把自己宣告為需要在後臺執行,就能不限時地執行了。

不過限制為播放音樂、使用 GPS 、voip、。 值得一提的是,有的應用為了達到後臺不限時執行的目的,在後臺播放無聲的音樂(稽核不一定會被發現)。

iOS 5 開始又多了一種型別:下載報刊雜誌。

然後 iOS 7 則可以下載各種玩意和定時抓取。

iOS 7 需要注意的區別:iOS 7 以前,應用進入後臺繼續執行時,如果使用者鎖屏了,那麼 iOS 會等待應用執行完,才進入睡眠狀態。而在 iOS 7 上,系統會很快進入睡眠狀態,那些後臺應用也就暫停了。如果收到事件被喚醒(例如定時事件、推送、位置更新等),後臺應用才能繼續執行一會。因為處理過程變成了斷斷續續的,因此下載時也要使用 NSURLSession 來處理(即下文中的 Background Transfer Service)。

3. 在我看來,蘋果限制 app在後臺執行,是為了更有效的利用硬體使用當前的app,不然,過多的app駐留後臺,對手機資源佔用是一大問題。

二. ios7以後提供的後臺介面模式

1、Background Audio,這是後臺的音訊,這個很早之前便有,也是iOS裝置中用得最多的後臺應用,呼叫這個介面可以實現後臺的音樂播放。

2、Location Services,這是後臺的定位,系統會擁有統一頁面進行管理。

3、VoIP,後臺語音服務,類似Skype通話應用需要呼叫,可進行後臺的語音通話。

4、Newsstand,報刊雜誌後臺自動下載更新,其能夠自動實時更新。

5、Background Task  Completion,這個介面早在iOS 4時候便擁有,其可以供任意型別的APP使用,不過在舊系統中,這個介面的後臺限制執行時間僅為10分鐘,意味著當應用退至後臺,其後臺執行僅能持續10分鐘便會轉至休眠狀態。iOS 7中對這個介面作出了改變,原來的為連續10分鐘,即不論你這10分鐘內使用者是否關閉螢幕進入休眠狀態,應用仍然會在後臺等待10分鐘完結後推出,而新的改進為假如遇到關閉螢幕休眠的情況,這後臺執行的10分鐘便會跟隨一同休眠,剩餘的後臺時間將會留待使用者再一次喚醒裝置才計算。這樣後臺執行的時間仍然為10分鐘,但並不連續,這樣做的優點為省電。

如現在有一些詞典應用帶有後臺複製選詞功能,實際上其是利用了這個介面,如果使用者開啟詞典後並推出,即使螢幕關閉,但詞典仍然在後臺執行,電量消耗還是比較大的,在iOS 7上,這個問題可以得到解決。

6、 Remote Notification,這是本次較大的一個改進介面,以往聊天類應用接受推送後點進去需要再收一次資訊,這情況在QQ、微信等應用上最為明顯。不過擁有了這個介面後,這情況將不復存在,以後推送將能夠直接啟動後臺任務。值得注意的是remote notification支援silent notification(靜默推送),這樣dropbox這類同步應用可以在後臺以最節能的模式實時靜默同步了,類似布卡漫畫這種也可以推送正在追的漫畫的新章節並在後臺靜默下載,待到下載好再給使用者傳送一個本地推送,使用者點開即看無需再聯網。

7、Background Transfer Service,後臺上傳下載。iOS最接近傳統多工的後臺介面,可供任意型別的app呼叫,無時間限制。應用場景包括後臺上傳和下載資料,這使得遊戲後臺更新資料包,後臺上傳視訊等等都成為可能,但是正如其名字,它只能用於處理上傳下載這種傳輸類的任務,類似後臺剪下板監控這種它就無能為力了。

iOS 7新增的background fetch,這個後臺介面在蘋果WWDC 2013上有提及,其會根據使用者行為自動調整達到效率最優的後臺模式,能夠處理不是很有時效性的資訊獲取。例如一些社交、新聞類的應用的後臺資訊更新,iOS系統便會根據應用啟動頻率、時間和當前網路和電量的狀況來智慧分配每個應用的後臺獲取頻率和啟動時長。

三 .  當前社交專案,如何使用ios後臺

1.當前專案特點:

a. 在儲存長連線的情況下,使用者一直線上,才能即時接收到訊息;

b. 在初始化連線的時候,需要做很多處理,如果經常連線,必然很耗電, 所以盡力在後臺的時候,不是時常斷開後又連線;

2. 通過以上分析,改選用何種方式來儲存app後臺執行

voip不行;

靜音播放,不清除這種方式,是否可以通過稽核;

vpns推送,可取的方式,(具體方法: 使用者在登入後,傳送一個裝置的tokenid; 在傳送訊息時,平臺根據對方是離線還是線上,來判斷要不要發推送訊息)

3.background fetch在該專案中的應用

由於該app在初始化時,需要耗點時間,最好的方式就是通過  後臺獲取  來處理該工作,這樣能保證使用者的流暢體驗。

第二部分:保持程式在後臺長時間執行

iOS為了讓裝置儘量省電,減少不必要的開銷,保持系統流暢,因而對後臺機制採用墓碑式的“假後臺”。除了系統官方極少數程式可以真後臺,一般開發者開發出來的應用程式後臺受到以下限制:

1.使用者按Home之後,App轉入後臺進行執行,此時擁有180s後臺時間(iOS7)或者600s(iOS6)執行時間可以處理後臺操作

2.當180S或者600S時間過去之後,可以告知系統未完成任務,需要申請繼續完成,系統批准申請之後,可以繼續執行,但總時間不會超過10分鐘。

3.當10分鐘時間到之後,無論怎麼向系統申請繼續後臺,系統會強制掛起App,掛起所有後臺操作、執行緒,直到使用者再次點選App之後才會繼續執行。

當然iOS為了特殊應用也保留了一些可以實現“真後臺”的方法,摘取比較常用的:

1.VOIP

2.定位服務

3.後臺下載

4.在後臺一直播放無聲音樂(容易受到電話或者其他程式影響,所以暫未考慮)

5….更多

其中VOIP需要繫結一個Socket連結並申明給系統,系統將會在後臺接管這個連線,一旦遠端資料過來,你的App將會被喚醒10s(或者更少)的時間來處理資料,超過時間或者處理完畢,程式繼續休眠。

後臺現在是iOS7引入的新API,網上實現的程式碼比較少,博主也沒有細心去找。

由於博主要做的App需要在後臺一直執行,每隔一段時間給伺服器主動傳送訊息來保持帳號登陸狀態,因而必須確保App不被系統墓碑限制。

博主最先嚐試了很多方法,包括朋友發來的一個Demo,每180s後臺時間過期就銷燬自己然後再建立一個後臺任務,但是實際測試只有10分鐘時間。最後因為考慮到VOIP對服務端改動太大,時間又太緊,所以選擇了定位服務的方法來保持後臺。

要啟動定位服務:

1.需要引入標頭檔案:#import

2.在AppDelegate.m中定義CLLocationManager * locationManager;作為全域性變數方便控制

3.在程式啟動初期對定位服務進行初始化:

1

2locationManager = [[CLLocationManager alloc] init];

locationManager.delegate =self;//or whatever class you have for managing location

4.在程式轉入後臺的時候,啟動定位服務

[locationManager startUpdatingLocation];(第一次執行這個方法的時候,如果之前使用者沒有使用過App,則會彈出是否允許位置服務,關於使用者是否允許,後面程式碼中有判斷)

這樣在定位服務可用的時候,程式會不斷重新整理後臺時間,實際測試,發現後臺180s時間不斷被重新整理,達到長久後臺的目的。

但是這樣使用也有一些問題,在部分機器上面,定位服務即使開啟也可能不能重新整理後臺時間,需要完全結束程式再執行。穩定性不知道是因為程式碼原因還是系統某些機制原因。

相關文章