熟悉基礎(chǔ)
iOS 應(yīng)用程序3個(gè)狀態(tài):
不活動(dòng)-應(yīng)用程序處于前臺(tái)但不再接收事件(例如识窿,用戶在app處于活動(dòng)時(shí)鎖住了設(shè)備)换团。
后臺(tái)-app不再屏幕上顯示把还,但它仍然執(zhí)行代碼协屡。
掛起-app仍然駐留內(nèi)存但不再執(zhí)行代碼。
按下Home鍵時(shí)全谤,app從活動(dòng)狀態(tài)轉(zhuǎn)入后臺(tái)肤晓,絕大部分app通常在幾秒內(nèi)就從后臺(tái)變成了掛起。
在內(nèi)存吃緊的時(shí)候认然,iphone會(huì)首先關(guān)閉那些掛起的app补憾。
從 iOS 4 開(kāi)始,應(yīng)用就可以在退到后臺(tái)后卷员,繼續(xù)運(yùn)行一小段時(shí)間(10 分鐘)盈匾;
2.還可以把自己聲明為需要在后臺(tái)運(yùn)行,就能不限時(shí)地運(yùn)行了毕骡。
不過(guò)限制為播放音樂(lè)削饵、使用 GPS 、voip未巫、窿撬。 值得一提的是,有的應(yīng)用為了達(dá)到后臺(tái)不限時(shí)運(yùn)行的目的叙凡,在后臺(tái)播放無(wú)聲的音樂(lè)(審核不一定會(huì)被發(fā)現(xiàn))劈伴。
iOS 5 開(kāi)始又多了一種類型:下載報(bào)刊雜志。
然后 iOS 7 則可以下載各種玩意和定時(shí)抓取握爷。
iOS 7 需要注意的區(qū)別:iOS 7 以前跛璧,應(yīng)用進(jìn)入后臺(tái)繼續(xù)運(yùn)行時(shí),如果用戶鎖屏了新啼,那么 iOS 會(huì)等待應(yīng)用運(yùn)行完追城,才進(jìn)入睡眠狀態(tài)。而在 iOS 7 上师抄,系統(tǒng)會(huì)很快進(jìn)入睡眠狀態(tài)漓柑,那些后臺(tái)應(yīng)用也就暫停了。如果收到事件被喚醒(例如定時(shí)事件叨吮、推送辆布、位置更新等),后臺(tái)應(yīng)用才能繼續(xù)運(yùn)行一會(huì)茶鉴。因?yàn)樘幚磉^(guò)程變成了斷斷續(xù)續(xù)的锋玲,因此下載時(shí)也要使用 NSURLSession 來(lái)處理(即下文中的 Background Transfer Service)。
- 在我看來(lái)涵叮,蘋(píng)果限制 app在后臺(tái)運(yùn)行惭蹂,是為了更有效的利用硬件使用當(dāng)前的app伞插,不然,過(guò)多的app駐留后臺(tái)盾碗,對(duì)手機(jī)資源占用是一大問(wèn)題媚污。
ios7以后提供的后臺(tái)接口模式
1、Background Audio廷雅,這是后臺(tái)的音頻耗美,這個(gè)很早之前便有,也是iOS設(shè)備中用得最多的后臺(tái)應(yīng)用航缀,調(diào)用這個(gè)接口可以實(shí)現(xiàn)后臺(tái)的音樂(lè)播放商架。
2、Location Services芥玉,這是后臺(tái)的定位蛇摸,系統(tǒng)會(huì)擁有統(tǒng)一頁(yè)面進(jìn)行管理。
3灿巧、VoIP赶袄,后臺(tái)語(yǔ)音服務(wù),類似Skype通話應(yīng)用需要調(diào)用砸烦,可進(jìn)行后臺(tái)的語(yǔ)音通話弃鸦。
4、Newsstand幢痘,報(bào)刊雜志后臺(tái)自動(dòng)下載更新唬格,其能夠自動(dòng)實(shí)時(shí)更新。
5颜说、Background Task Completion购岗,這個(gè)接口早在iOS 4時(shí)候便擁有,其可以供任意類型的APP使用门粪,不過(guò)在舊系統(tǒng)中喊积,這個(gè)接口的后臺(tái)限制運(yùn)行時(shí)間僅為10分鐘,意味著當(dāng)應(yīng)用退至后臺(tái)玄妈,其后臺(tái)運(yùn)行僅能持續(xù)10分鐘便會(huì)轉(zhuǎn)至休眠狀態(tài)乾吻。iOS 7中對(duì)這個(gè)接口作出了改變,原來(lái)的為連續(xù)10分鐘拟蜻,即不論你這10分鐘內(nèi)用戶是否關(guān)閉屏幕進(jìn)入休眠狀態(tài)绎签,應(yīng)用仍然會(huì)在后臺(tái)等待10分鐘完結(jié)后推出,而新的改進(jìn)為假如遇到關(guān)閉屏幕休眠的情況酝锅,這后臺(tái)運(yùn)行的10分鐘便會(huì)跟隨一同休眠诡必,剩余的后臺(tái)時(shí)間將會(huì)留待用戶再一次喚醒設(shè)備才計(jì)算。這樣后臺(tái)運(yùn)行的時(shí)間仍然為10分鐘搔扁,但并不連續(xù)爸舒,這樣做的優(yōu)點(diǎn)為省電蟋字。
如現(xiàn)在有一些詞典應(yīng)用帶有后臺(tái)復(fù)制選詞功能,實(shí)際上其是利用了這個(gè)接口扭勉,如果用戶開(kāi)啟詞典后并推出鹊奖,即使屏幕關(guān)閉,但詞典仍然在后臺(tái)運(yùn)行涂炎,電量消耗還是比較大的嫉入,在iOS 7上,這個(gè)問(wèn)題可以得到解決璧尸。
6、 Remote Notification熬拒,這是本次較大的一個(gè)改進(jìn)接口爷光,以往聊天類應(yīng)用接受推送后點(diǎn)進(jìn)去需要再收一次信息,這情況在QQ澎粟、微信等應(yīng)用上最為明顯蛀序。不過(guò)擁有了這個(gè)接口后,這情況將不復(fù)存在活烙,以后推送將能夠直接啟動(dòng)后臺(tái)任務(wù)徐裸。值得注意的是remote notification支持silent notification(靜默推送),這樣dropbox這類同步應(yīng)用可以在后臺(tái)以最節(jié)能的模式實(shí)時(shí)靜默同步了啸盏,類似布卡漫畫(huà)這種也可以推送正在追的漫畫(huà)的新章節(jié)并在后臺(tái)靜默下載重贺,待到下載好再給用戶發(fā)送一個(gè)本地推送,用戶點(diǎn)開(kāi)即看無(wú)需再聯(lián)網(wǎng)回懦。
7气笙、Background Transfer Service,后臺(tái)上傳下載怯晕。iOS最接近傳統(tǒng)多任務(wù)的后臺(tái)接口潜圃,可供任意類型的app調(diào)用,無(wú)時(shí)間限制舟茶。應(yīng)用場(chǎng)景包括后臺(tái)上傳和下載數(shù)據(jù)谭期,這使得游戲后臺(tái)更新數(shù)據(jù)包,后臺(tái)上傳視頻等等都成為可能吧凉,但是正如其名字隧出,它只能用于處理上傳下載這種傳輸類的任務(wù),類似后臺(tái)剪切板監(jiān)控這種它就無(wú)能為力了客燕。
iOS 7新增的background fetch鸳劳,這個(gè)后臺(tái)接口在蘋(píng)果WWDC 2013上有提及,其會(huì)根據(jù)用戶行為自動(dòng)調(diào)整達(dá)到效率最優(yōu)的后臺(tái)模式也搓,能夠處理不是很有時(shí)效性的信息獲取赏廓。例如一些社交涵紊、新聞?lì)惖膽?yīng)用的后臺(tái)信息更新,iOS系統(tǒng)便會(huì)根據(jù)應(yīng)用啟動(dòng)頻率幔摸、時(shí)間和當(dāng)前網(wǎng)絡(luò)和電量的狀況來(lái)智能分配每個(gè)應(yīng)用的后臺(tái)獲取頻率和啟動(dòng)時(shí)長(zhǎng)摸柄。
當(dāng)前社交項(xiàng)目,如何使用ios后臺(tái)
1.當(dāng)前項(xiàng)目特點(diǎn):
a. 在保存長(zhǎng)連接的情況下既忆,用戶一直在線驱负,才能即時(shí)接收到消息;
b. 在初始化連接的時(shí)候患雇,需要做很多處理跃脊,如果經(jīng)常連接,必然很耗電苛吱, 所以盡力在后臺(tái)的時(shí)候酪术,不是時(shí)常斷開(kāi)后又連接;
- 通過(guò)以上分析翠储,改選用何種方式來(lái)保存app后臺(tái)運(yùn)行
voip不行绘雁;
靜音播放,不清除這種方式援所,是否可以通過(guò)審核庐舟;
vpns推送,可取的方式住拭,(具體方法: 用戶在登錄后挪略,發(fā)送一個(gè)設(shè)備的tokenid; 在發(fā)送消息時(shí)废酷,平臺(tái)根據(jù)對(duì)方是離線還是在線瘟檩,來(lái)判斷要不要發(fā)推送消息)
3.background fetch在該項(xiàng)目中的應(yīng)用
由于該app在初始化時(shí),需要耗點(diǎn)時(shí)間澈蟆,最好的方式就是通過(guò) 后臺(tái)獲取 來(lái)處理該工作墨辛,這樣能保證用戶的流暢體驗(yàn)。
保持程序在后臺(tái)長(zhǎng)時(shí)間運(yùn)行
iOS為了讓設(shè)備盡量省電趴俘,減少不必要的開(kāi)銷睹簇,保持系統(tǒng)流暢,因而對(duì)后臺(tái)機(jī)制采用墓碑式的“假后臺(tái)”寥闪。除了系統(tǒng)官方極少數(shù)程序可以真后臺(tái)太惠,一般開(kāi)發(fā)者開(kāi)發(fā)出來(lái)的應(yīng)用程序后臺(tái)受到以下限制:
1.用戶按Home之后,App轉(zhuǎn)入后臺(tái)進(jìn)行運(yùn)行疲憋,此時(shí)擁有180s后臺(tái)時(shí)間(iOS7)或者600s(iOS6)運(yùn)行時(shí)間可以處理后臺(tái)操作
2.當(dāng)180S或者600S時(shí)間過(guò)去之后凿渊,可以告知系統(tǒng)未完成任務(wù),需要申請(qǐng)繼續(xù)完成,系統(tǒng)批準(zhǔn)申請(qǐng)之后埃脏,可以繼續(xù)運(yùn)行搪锣,但總時(shí)間不會(huì)超過(guò)10分鐘。
3.當(dāng)10分鐘時(shí)間到之后彩掐,無(wú)論怎么向系統(tǒng)申請(qǐng)繼續(xù)后臺(tái)构舟,系統(tǒng)會(huì)強(qiáng)制掛起App,掛起所有后臺(tái)操作堵幽、線程狗超,直到用戶再次點(diǎn)擊App之后才會(huì)繼續(xù)運(yùn)行。
當(dāng)然iOS為了特殊應(yīng)用也保留了一些可以實(shí)現(xiàn)“真后臺(tái)”的方法朴下,摘取比較常用的:
1.VOIP
2.定位服務(wù)
3.后臺(tái)下載
4.在后臺(tái)一直播放無(wú)聲音樂(lè)(容易受到電話或者其他程序影響努咐,所以暫未考慮)
5….更多
其中VOIP需要綁定一個(gè)Socket鏈接并申明給系統(tǒng),系統(tǒng)將會(huì)在后臺(tái)接管這個(gè)連接殴胧,一旦遠(yuǎn)端數(shù)據(jù)過(guò)來(lái)麦撵,你的App將會(huì)被喚醒10s(或者更少)的時(shí)間來(lái)處理數(shù)據(jù),超過(guò)時(shí)間或者處理完畢溃肪,程序繼續(xù)休眠。
后臺(tái)現(xiàn)在是iOS7引入的新API音五,網(wǎng)上實(shí)現(xiàn)的代碼比較少惫撰,博主也沒(méi)有細(xì)心去找。
由于博主要做的App需要在后臺(tái)一直運(yùn)行躺涝,每隔一段時(shí)間給服務(wù)器主動(dòng)發(fā)送消息來(lái)保持帳號(hào)登陸狀態(tài)厨钻,因而必須確保App不被系統(tǒng)墓碑限制。
博主最先嘗試了很多方法坚嗜,包括朋友發(fā)來(lái)的一個(gè)Demo夯膀,每180s后臺(tái)時(shí)間過(guò)期就銷毀自己然后再創(chuàng)建一個(gè)后臺(tái)任務(wù),但是實(shí)際測(cè)試只有10分鐘時(shí)間苍蔬。最后因?yàn)榭紤]到VOIP對(duì)服務(wù)端改動(dòng)太大诱建,時(shí)間又太緊,所以選擇了定位服務(wù)的方法來(lái)保持后臺(tái)碟绑。
4.在程序轉(zhuǎn)入后臺(tái)的時(shí)候俺猿,啟動(dòng)定位服務(wù)
[locationManager startUpdatingLocation];(第一次運(yùn)行這個(gè)方法的時(shí)候,如果之前用戶沒(méi)有使用過(guò)App格仲,則會(huì)彈出是否允許位置服務(wù)押袍,關(guān)于用戶是否允許,后面代碼中有判斷)
這樣在定位服務(wù)可用的時(shí)候凯肋,程序會(huì)不斷刷新后臺(tái)時(shí)間谊惭,實(shí)際測(cè)試,發(fā)現(xiàn)后臺(tái)180s時(shí)間不斷被刷新,達(dá)到長(zhǎng)久后臺(tái)的目的圈盔。
但是這樣使用也有一些問(wèn)題豹芯,在部分機(jī)器上面,定位服務(wù)即使打開(kāi)也可能不能刷新后臺(tái)時(shí)間药磺,需要完全結(jié)束程序再運(yùn)行告组。穩(wěn)定性不知道是因?yàn)榇a原因還是系統(tǒng)某些機(jī)制原因。