iOS開發(fā):后臺運行以及保持程序在后臺長時間運行

第一部分

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)批準(zhǔn)申請之后绍些,可以繼續(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)某些機制原因嚷炉。

文/Levan_li(簡書作者)

原文鏈接:http://www.reibang.com/p/174fd2673897

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市等太,隨后出現(xiàn)的幾起案子捂齐,更是在濱河造成了極大的恐慌,老刑警劉巖缩抡,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奠宜,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞻想,警方通過查閱死者的電腦和手機压真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蘑险,“玉大人滴肿,你說我怎么就攤上這事〉杵” “怎么了泼差?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呵俏。 經(jīng)常有香客問我拴驮,道長,這世上最難降的妖魔是什么柴信? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宽气,結(jié)果婚禮上随常,老公的妹妹穿的比我還像新娘潜沦。我一直安慰自己,他們只是感情好绪氛,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布唆鸡。 她就那樣靜靜地躺著,像睡著了一般枣察。 火紅的嫁衣襯著肌膚如雪争占。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天序目,我揣著相機與錄音臂痕,去河邊找鬼。 笑死猿涨,一個胖子當(dāng)著我的面吹牛握童,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叛赚,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼澡绩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俺附?” 一聲冷哼從身側(cè)響起肥卡,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎事镣,沒想到半個月后步鉴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蛮浑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年唠叛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沮稚。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡艺沼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蕴掏,到底是詐尸還是另有隱情障般,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布盛杰,位于F島的核電站挽荡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏即供。R本人自食惡果不足惜定拟,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逗嫡。 院中可真熱鬧青自,春花似錦株依、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逆瑞,卻和暖如春荠藤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背获高。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工哈肖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谋减。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓牡彻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親出爹。 傳聞我的和親對象是個殘疾皇子庄吼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容