1.iOS實際上是僞後臺
爲何說iOS是僞後臺?首先須要瞭解一下iOS中的後臺進程究竟是怎麼回事。iOS中所謂的「後臺駐留」並非指執行中的程序,而是指最近使用過的程序。當咱們是一個進程進入到後臺的時候,能夠想象成是Command+Tab鍵盤。
通常來講,當把一個app退到後臺的時候都會有5s的時間執行緩衝,有些程序能夠要求達到10分鐘(這個是須要開發人員來決定的),所以在按下Home鍵以後,原本的程序就會退到後臺中去,最多10分鐘以後仍是會被終止的,這固然和蘋果的後臺管理機制有關。
2.iOS多任務
自從出現操做系統以來就沒有多任務,就跟多線程同樣,無非是CPU在極短的時間裏在多個進程之間運做罷了。而單任務是當前的進程獨享資源。簡單來講,iOS4 以後APP的類型能夠分爲三種:
1. 保存現場。
即:按下Home鍵10秒內直接殺死進程,並釋放內存。通常說來,全部程序進入背景後都還有5 秒的執行緩衝時間,有些程序能夠要求延長到10 分鐘(這些固然是由開發人員在設計與提交程式時決定和聲明);所以,在你按下Home 鍵後,原本的程式就會退到背景,若是它有額外的背景執行做業,超過10 分鐘仍是會被iOS 停止。
2. iOS支持的「多任務」。
即:按下Home鍵轉入多任務狀態,保留在內存中,但只能系統容許的動做:好比GPS,好比Streaming Music等等。
3. 真正的桌面級別的多任務。
即:只有Safari/Mail纔是真正的多任務,蘋果嫡系大都都不是。這個級別的app在後臺是沒有任何限制動做。(對於無限制動做的程序,一是會在用戶無察覺的狀況下耗光電力,二是會有安全上面的問題)。
3.設備多任務
Apple在出於性能的考慮上,以前並非全部的設備都是支持多任務的。一般,當用戶按一下Home鍵的時候,當前應用就會進入後臺,應用在進入後臺以後就會被suspend(掛起)狀態,此時再也不去執行任何的代碼,若是系統在運行其餘程序出現內存警告的時候就會優先將先suspend的程序先退出系統,只有當用戶和再次啓動APP的時候纔會從掛起的狀態變成喚醒的狀態,這個是基本的多任務特新。
那麼既然是多任務應該會在應用進入後臺時作一些處理,好比暫停界面的定時刷新或者是網絡請求,同時,或者須要在程序進入前臺時候執行一些恢復操做,在應用的Appdelegate中有兩個方法用於處理這些消息:
(void)applicationDidEnterBackground:(UIApplication*)application {
}
- (void)applicationWillEnterForeground:(UIApplication*)application {
}
若是是在其餘的對象中處理後臺消息的時候,須要使用到系統的兩個通知UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification。
那麼在開發中咱們每每是須要在後臺作一些事情的,好比說GPS、播放音樂等。那麼這個時候須要咱們手動去聲明後臺的任務:
在Info.plist中添加UIBackgroundModes鍵值,它包含一個或多個string的值,包括:
audio:在後臺提供聲音播放功能,包括音頻流和播放視頻時的聲音
前面的每個value讓系統知道咱們的應用程序應當要在適當的時候被喚醒,好比說一個應用程序在後臺的時候也須要播放音樂,添加audio鍵用來告訴系統框架,須要繼續播放音頻,而且能夠在合適的時間間隔下回調應用程序;若是應用程序不包括此項,任何音頻播放在移到後臺後將中止運行。
後臺voip支持
因爲voip應用須要一個長鏈接到服務器,爲了讓這類應用能正常工做,iOS中加入後臺voip支持特性。爲支持這一特性,須要在Info.plist文件中UIBackgroundModes字段對應的數組中增長「voip」字符串。
此外你仍然須要配置一下你的網絡鏈接,以便支持後臺鏈接。iOS提供的網絡鏈接庫有幾種,下面一一說明:
a、若是你使用的是NSStream,如NSInputStream或NSOutputStream,須要調用setProperty:forKey:將Key爲NSStreamNetworkServiceType的value設置爲
NSStreamNetworkServiceTypeVoIP;
b、若是你使用NSURLRequest,須要調用setNetworkServiceType:將網絡類型設置爲NSURLNetworkServiceTypeVoIP;
c、若是你使用CFStream,如CFReadStreamRef或CFWriteStreamRef,須要調用CFReadStreamSetProperty或CFWriteStreamSetProperty將 kCFStreamNetworkServiceType屬性設置爲kCFStreamNetworkServiceTypeVoIP。