1.iOS其實(shí)是偽后臺
為什么說iOS是偽后臺?首先需要了解一下iOS中的后臺進(jìn)程到底是怎么回事。iOS中所謂的“后臺駐留”并不是指執(zhí)行中的程序,而是指最近使用過的程序奈嘿。當(dāng)我們是一個進(jìn)程進(jìn)入到后臺的時候,可以想象成是Command+Tab鍵盤吞加。
一般來說裙犹,當(dāng)把一個app退到后臺的時候都會有5s的時間執(zhí)行緩沖,有些程序可以要求達(dá)到10分鐘(這個是需要開發(fā)人員來決定的)衔憨,因此在按下Home鍵之后叶圃,本來的程序就會退到后臺中去,最多10分鐘之后還是會被終止的巫财,這當(dāng)然和蘋果的后臺管理機(jī)制有關(guān)盗似。
2.iOS多任務(wù)
自從出現(xiàn)操作系統(tǒng)以來就沒有多任務(wù),就跟多線程一樣平项,無非是CPU在極短的時間里在多個進(jìn)程之間運(yùn)作罷了。而單任務(wù)是當(dāng)前的進(jìn)程獨(dú)享資源悍及。簡單來說闽瓢,iOS4 之后APP的類型可以分為三種:
1. 保存現(xiàn)場。
即:按下Home鍵10秒內(nèi)直接殺死進(jìn)程心赶,并釋放內(nèi)存扣讼。一般說來,所有程序進(jìn)入背景后都還有5 秒的執(zhí)行緩沖時間缨叫,有些程序可以要求延長到10 分鐘(這些當(dāng)然是由開發(fā)人員在設(shè)計與提交程式時決定和聲明)椭符;因此,在你按下Home 鍵后耻姥,本來的程式就會退到背景销钝,如果它有額外的背景執(zhí)行作業(yè),超過10 分鐘還是會被iOS 中止琐簇。
2.iOS支持的“多任務(wù)”蒸健。
即:按下Home鍵轉(zhuǎn)入多任務(wù)狀態(tài),保留在內(nèi)存中婉商,但只能系統(tǒng)允許的動作:比如GPS似忧,比如Streaming Music等等。
3.真正的桌面級別的多任務(wù)丈秩。
即:只有Safari/Mail才是真正的多任務(wù)盯捌,蘋果嫡系大都都不是。這個級別的app在后臺是沒有任何限制動作蘑秽。(對于無限制動作的程序饺著,一是會在用戶無察覺的情況下耗光電力箫攀,二是會有安全上面的問題)。
3.設(shè)備多任務(wù)
Apple在出于性能的考慮上瓶籽,之前并不是所有的設(shè)備都是支持多任務(wù)的匠童。通常,當(dāng)用戶按一下Home鍵的時候塑顺,當(dāng)前應(yīng)用就會進(jìn)入后臺汤求,應(yīng)用在進(jìn)入后臺之后就會被suspend(掛起)狀態(tài),此時不再去執(zhí)行任何的代碼严拒,如果系統(tǒng)在運(yùn)行其他程序出現(xiàn)內(nèi)存警告的時候就會優(yōu)先將先suspend的程序先退出系統(tǒng)扬绪,只有當(dāng)用戶和再次啟動APP的時候才會從掛起的狀態(tài)變成喚醒的狀態(tài),這個是基本的多任務(wù)特新裤唠。
那么既然是多任務(wù)應(yīng)該會在應(yīng)用進(jìn)入后臺時做一些處理挤牛,比如暫停界面的定時刷新或者是網(wǎng)絡(luò)請求,同時种蘸,或者需要在程序進(jìn)入前臺時候執(zhí)行一些恢復(fù)操作墓赴,在應(yīng)用的Appdelegate中有兩個方法用于處理這些消息:
(void)applicationDidEnterBackground:(UIApplication*)application
{
//進(jìn)入后臺時要進(jìn)行的處理
}
-?(void)applicationWillEnterForeground:(UIApplication*)application
{
//進(jìn)入前臺時要進(jìn)行的處理
}
如果是在其他的對象中處理后臺消息的時候,需要使用到系統(tǒng)的兩個通知UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification航瞭。
那么在開發(fā)中我們往往是需要在后臺做一些事情的诫硕,比如說GPS、播放音樂等刊侯。那么這個時候需要我們手動去聲明后臺的任務(wù):
在Info.plist中添加UIBackgroundModes鍵值章办,它包含一個或多個string的值,包括:
audio:在后臺提供聲音播放功能滨彻,包括音頻流和播放視頻時的聲音
location:在后臺可以保持用戶的位置信息
voip:在后臺使用VOIP功能
前面的每一個value讓系統(tǒng)知道我們的應(yīng)用程序應(yīng)當(dāng)要在適當(dāng)?shù)臅r候被喚醒藕届,比如說一個應(yīng)用程序在后臺的時候也需要播放音樂,添加audio鍵用來告訴系統(tǒng)框架亭饵,需要繼續(xù)播放音頻休偶,并且可以在合適的時間間隔下回調(diào)應(yīng)用程序;如果應(yīng)用程序不包括此項冬骚,任何音頻播放在移到后臺后將停止運(yùn)行椅贱。
后臺voip支持
由于voip應(yīng)用需要一個長連接到服務(wù)器,為了讓這類應(yīng)用能正常工作只冻,iOS中加入后臺voip支持特性庇麦。為支持這一特性,需要在Info.plist文件中UIBackgroundModes字段對應(yīng)的數(shù)組中增加“voip”字符串喜德。
此外你仍然需要配置一下你的網(wǎng)絡(luò)連接山橄,以便支持后臺連接。iOS提供的網(wǎng)絡(luò)連接庫有幾種舍悯,下面一一說明:
a航棱、如果你使用的是NSStream睡雇,如NSInputStream或NSOutputStream,需要調(diào)用setProperty:forKey:將Key為NSStreamNetworkServiceType的value設(shè)置為
NSStreamNetworkServiceTypeVoIP饮醇;
b它抱、如果你使用NSURLRequest,需要調(diào)用setNetworkServiceType:將網(wǎng)絡(luò)類型設(shè)置為NSURLNetworkServiceTypeVoIP朴艰;
c观蓄、如果你使用CFStream,如CFReadStreamRef或CFWriteStreamRef祠墅,需要調(diào)用CFReadStreamSetProperty或CFWriteStreamSetProperty將kCFStreamNetworkServiceType屬性設(shè)置為kCFStreamNetworkServiceTypeVoIP侮穿。