第一部分
1.先說說iOS 應(yīng)用程序5個狀態(tài):
停止運行-應(yīng)用程序已經(jīng)終止念赶,或者還未啟動。
不活動-應(yīng)用程序處于前臺但不再接收事件(例如蒸走,用戶在app處于活動時鎖住了設(shè)備)宾袜。
活動-app處于“使用中”的狀態(tài)捻艳。
后臺-app不再屏幕上顯示,但它仍然執(zhí)行代碼庆猫。
掛起-app仍然駐留內(nèi)存但不再執(zhí)行代碼认轨。
按下Home鍵時,app從活動狀態(tài)轉(zhuǎn)入后臺月培,絕大部分app通常在幾秒內(nèi)就從后臺變成了掛起嘁字。
在內(nèi)存吃緊的時候,iphone會首先關(guān)閉那些掛起的app杉畜。
從 iOS 4 開始纪蜒,應(yīng)用就可以在退到后臺后,繼續(xù)運行一小段時間(10 分鐘)寻行;
2.還可以把自己聲明為需要在后臺運行霍掺,就能不限時地運行了。
不過限制為播放音樂拌蜘、使用 GPS 杆烁、voip、简卧。 值得一提的是兔魂,有的應(yīng)用為了達到后臺不限時運行的目的,在后臺播放無聲的音樂(審核不一定會被發(fā)現(xiàn))举娩。
iOS 5 開始又多了一種類型:下載報刊雜志析校。
然后 iOS 7 則可以下載各種玩意和定時抓取。
iOS
7 需要注意的區(qū)別:iOS 7 以前铜涉,應(yīng)用進入后臺繼續(xù)運行時智玻,如果用戶鎖屏了,那么 iOS 會等待應(yīng)用運行完芙代,才進入睡眠狀態(tài)吊奢。而在 iOS 7
上,系統(tǒng)會很快進入睡眠狀態(tài)纹烹,那些后臺應(yīng)用也就暫停了页滚。如果收到事件被喚醒(例如定時事件、推送铺呵、位置更新等)裹驰,后臺應(yīng)用才能繼續(xù)運行一會。因為處理過程變成了斷斷續(xù)續(xù)的片挂,因此下載時也要使用
NSURLSession 來處理(即下文中的 Background Transfer Service)幻林。
3. 在我看來贞盯,蘋果限制 app在后臺運行,是為了更有效的利用硬件使用當(dāng)前的app沪饺,不然邻悬,過多的app駐留后臺,對手機資源占用是一大問題随闽。
二. ios7以后提供的后臺接口模式
1、Background Audio肝谭,這是后臺的音頻掘宪,這個很早之前便有,也是iOS設(shè)備中用得最多的后臺應(yīng)用攘烛,調(diào)用這個接口可以實現(xiàn)后臺的音樂播放魏滚。
2、Location Services坟漱,這是后臺的定位鼠次,系統(tǒng)會擁有統(tǒng)一頁面進行管理。
3芋齿、VoIP腥寇,后臺語音服務(wù),類似Skype通話應(yīng)用需要調(diào)用觅捆,可進行后臺的語音通話赦役。
4、Newsstand栅炒,報刊雜志后臺自動下載更新掂摔,其能夠自動實時更新。
5赢赊、Background
Task? Completion乙漓,這個接口早在iOS
4時候便擁有,其可以供任意類型的APP使用释移,不過在舊系統(tǒng)中叭披,這個接口的后臺限制運行時間僅為10分鐘,意味著當(dāng)應(yīng)用退至后臺秀鞭,其后臺運行僅能持續(xù)10分鐘便會轉(zhuǎn)至休眠狀態(tài)趋观。iOS
7中對這個接口作出了改變,原來的為連續(xù)10分鐘锋边,即不論你這10分鐘內(nèi)用戶是否關(guān)閉屏幕進入休眠狀態(tài)皱坛,應(yīng)用仍然會在后臺等待10分鐘完結(jié)后推出,而新的改進為假如遇到關(guān)閉屏幕休眠的情況豆巨,這后臺運行的10分鐘便會跟隨一同休眠剩辟,剩余的后臺時間將會留待用戶再一次喚醒設(shè)備才計算。這樣后臺運行的時間仍然為10分鐘,但并不連續(xù)贩猎,這樣做的優(yōu)點為省電熊户。
如現(xiàn)在有一些詞典應(yīng)用帶有后臺復(fù)制選詞功能,實際上其是利用了這個接口吭服,如果用戶開啟詞典后并推出嚷堡,即使屏幕關(guān)閉,但詞典仍然在后臺運行艇棕,電量消耗還是比較大的蝌戒,在iOS 7上,這個問題可以得到解決沼琉。
6北苟、?Remote
Notification,這是本次較大的一個改進接口打瘪,以往聊天類應(yīng)用接受推送后點進去需要再收一次信息友鼻,這情況在QQ、微信等應(yīng)用上最為明顯闺骚。不過擁有了這個接口后彩扔,這情況將不復(fù)存在,以后推送將能夠直接啟動后臺任務(wù)葛碧。值得注意的是remote
notification支持silent
notification(靜默推送)借杰,這樣dropbox這類同步應(yīng)用可以在后臺以最節(jié)能的模式實時靜默同步了,類似布卡漫畫這種也可以推送正在追的漫畫的新章節(jié)并在后臺靜默下載进泼,待到下載好再給用戶發(fā)送一個本地推送蔗衡,用戶點開即看無需再聯(lián)網(wǎng)。
7乳绕、Background
Transfer
Service绞惦,后臺上傳下載。iOS最接近傳統(tǒng)多任務(wù)的后臺接口洋措,可供任意類型的app調(diào)用济蝉,無時間限制。應(yīng)用場景包括后臺上傳和下載數(shù)據(jù)菠发,這使得游戲后臺更新數(shù)據(jù)包王滤,后臺上傳視頻等等都成為可能,但是正如其名字滓鸠,它只能用于處理上傳下載這種傳輸類的任務(wù)雁乡,類似后臺剪切板監(jiān)控這種它就無能為力了。
iOS
7新增的background fetch糜俗,這個后臺接口在蘋果WWDC
2013上有提及踱稍,其會根據(jù)用戶行為自動調(diào)整達到效率最優(yōu)的后臺模式曲饱,能夠處理不是很有時效性的信息獲取。例如一些社交珠月、新聞類的應(yīng)用的后臺信息更新扩淀,iOS系統(tǒng)便會根據(jù)應(yīng)用啟動頻率、時間和當(dāng)前網(wǎng)絡(luò)和電量的狀況來智能分配每個應(yīng)用的后臺獲取頻率和啟動時長啤挎。
三 . ?當(dāng)前社交項目驻谆,如何使用ios后臺
1.當(dāng)前項目特點:
a. 在保存長連接的情況下,用戶一直在線庆聘,才能即時接收到消息旺韭;
b. 在初始化連接的時候,需要做很多處理掏觉,如果經(jīng)常連接,必然很耗電值漫, 所以盡力在后臺的時候澳腹,不是時常斷開后又連接;
2. 通過以上分析杨何,改選用何種方式來保存app后臺運行
voip不行酱塔;
靜音播放,不清除這種方式危虱,是否可以通過審核羊娃;
vpns推送,可取的方式埃跷,(具體方法: 用戶在登錄后蕊玷,發(fā)送一個設(shè)備的tokenid; 在發(fā)送消息時弥雹,平臺根據(jù)對方是離線還是在線垃帅,來判斷要不要發(fā)推送消息)
3.background fetch在該項目中的應(yīng)用
由于該app在初始化時,需要耗點時間剪勿,最好的方式就是通過 ?后臺獲取 ?來處理該工作贸诚,這樣能保證用戶的流暢體驗。
第二部分:保持程序在后臺長時間運行
iOS為了讓設(shè)備盡量省電厕吉,減少不必要的開銷酱固,保持系統(tǒng)流暢,因而對后臺機制采用墓碑式的“假后臺”头朱。除了系統(tǒng)官方極少數(shù)程序可以真后臺运悲,一般開發(fā)者開發(fā)出來的應(yīng)用程序后臺受到以下限制:
1.用戶按Home之后,App轉(zhuǎn)入后臺進行運行髓窜,此時擁有180s后臺時間(iOS7)或者600s(iOS6)運行時間可以處理后臺操作
2.當(dāng)180S或者600S時間過去之后扇苞,可以告知系統(tǒng)未完成任務(wù)欺殿,需要申請繼續(xù)完成,系統(tǒng)批準申請之后鳖敷,可以繼續(xù)運行脖苏,但總時間不會超過10分鐘。
3.當(dāng)10分鐘時間到之后定踱,無論怎么向系統(tǒng)申請繼續(xù)后臺棍潘,系統(tǒng)會強制掛起App,掛起所有后臺操作崖媚、線程亦歉,直到用戶再次點擊App之后才會繼續(xù)運行。
當(dāng)然iOS為了特殊應(yīng)用也保留了一些可以實現(xiàn)“真后臺”的方法畅哑,摘取比較常用的:
1.VOIP
2.定位服務(wù)
3.后臺下載
4.在后臺一直播放無聲音樂(容易受到電話或者其他程序影響肴楷,所以暫未考慮)
5….更多
其中VOIP需要綁定一個Socket鏈接并申明給系統(tǒng),系統(tǒng)將會在后臺接管這個連接荠呐,一旦遠端數(shù)據(jù)過來赛蔫,你的App將會被喚醒10s(或者更少)的時間來處理數(shù)據(jù),超過時間或者處理完畢泥张,程序繼續(xù)休眠呵恢。
后臺現(xiàn)在是iOS7引入的新API,網(wǎng)上實現(xiàn)的代碼比較少媚创,博主也沒有細心去找渗钉。
由于博主要做的App需要在后臺一直運行,每隔一段時間給服務(wù)器主動發(fā)送消息來保持帳號登陸狀態(tài)钞钙,因而必須確保App不被系統(tǒng)墓碑限制鳄橘。
博主最先嘗試了很多方法,包括朋友發(fā)來的一個Demo芒炼,每180s后臺時間過期就銷毀自己然后再創(chuàng)建一個后臺任務(wù)挥唠,但是實際測試只有10分鐘時間。最后因為考慮到VOIP對服務(wù)端改動太大焕议,時間又太緊宝磨,所以選擇了定位服務(wù)的方法來保持后臺。
要啟動定位服務(wù):
1.需要引入頭文件:#import
2.在AppDelegate.m中定義CLLocationManager * locationManager;作為全局變量方便控制
3.在程序啟動初期對定位服務(wù)進行初始化:
1
2locationManager = [[CLLocationManager alloc] init];
locationManager.delegate =self;//or whatever class you have for managing location
4.在程序轉(zhuǎn)入后臺的時候盅安,啟動定位服務(wù)
[locationManager startUpdatingLocation];(第一次運行這個方法的時候唤锉,如果之前用戶沒有使用過App,則會彈出是否允許位置服務(wù)别瞭,關(guān)于用戶是否允許窿祥,后面代碼中有判斷)
這樣在定位服務(wù)可用的時候,程序會不斷刷新后臺時間蝙寨,實際測試晒衩,發(fā)現(xiàn)后臺180s時間不斷被刷新嗤瞎,達到長久后臺的目的。
但是這樣使用也有一些問題听系,在部分機器上面贝奇,定位服務(wù)即使打開也可能不能刷新后臺時間,需要完全結(jié)束程序再運行靠胜。穩(wěn)定性不知道是因為代碼原因還是系統(tǒng)某些機制原因掉瞳。