Background Execution (后臺執(zhí)行)
當(dāng)用于沒有-啟動應(yīng)用,系統(tǒng)移到后臺狀態(tài)。對于很多應(yīng)用损谦,后臺狀態(tài)只是一個簡短的停留方式岖免。懸掛程序是一個種方式去提高電池壽命,它同樣允許系統(tǒng)去專注于重要系統(tǒng)資源用于一個新的前臺程序當(dāng)用于關(guān)注的時候(觸發(fā)的時候)照捡。
大多的應(yīng)用可以很容易移動到懸掛狀態(tài)但是同樣也有很合適的理由去繼續(xù)運(yùn)行在后臺颅湘。一個徒步的應(yīng)用可能想去跟蹤用戶的位置所以它嫩鞏固顯示具體的位置在地圖上面。一個音頻的應(yīng)用可能需要繼續(xù)播放音樂在鎖頻的時候栗精。其他應(yīng)用可能需要下載內(nèi)容在后臺闯参,所以它能夠
最小的言辭顯示內(nèi)容給用戶。當(dāng)你發(fā)現(xiàn)你需要保持你的應(yīng)用在后臺運(yùn)行悲立,iOS幫助你有效和不需要系統(tǒng)資源或者用戶的電池鹿寨。技術(shù)提供iOS 進(jìn)入下面三個范疇:
(1)應(yīng)用安康市一個簡短的任務(wù)在前端能夠詢問時間去完成任務(wù)當(dāng)應(yīng)用移到后臺。
(2)應(yīng)用提示下載在前段能夠退卡管理這些下載到系統(tǒng)级历,因此允許你應(yīng)用被懸掛或者終止當(dāng)下載繼續(xù)释移。
(3)應(yīng)用需要運(yùn)行在后后臺去支持指定任務(wù)類型能夠聲明他們支持一個或者多個后臺執(zhí)行模式叭披。
總是嘗試去避免做一些后臺的工作除非提供用戶的提亞寥殖。一個應(yīng)用可能移到后臺因?yàn)橛脩魡硬煌膽?yīng)用應(yīng)為用戶鎖定設(shè)備并且沒有使用它現(xiàn)在。在兩種狀態(tài)下涩蜘,用戶顯示你的應(yīng)用不需要做一些有意思工作現(xiàn)在嚼贡。繼續(xù)運(yùn)行這些環(huán)境將不會使用設(shè)備的電池并且可能導(dǎo)致用戶強(qiáng)制退出應(yīng)用。這么有意思的工作你可以在后臺處理和避免它當(dāng)你能夠同诫。
Executing Finite-Length Tasks (執(zhí)行一個有限的任務(wù))
應(yīng)用移到后臺被執(zhí)行是將它們進(jìn)入到不活躍的狀態(tài)(盡可能)粤策,所以,它們能夠被系統(tǒng)懸掛误窖。如果你的應(yīng)用在中心任務(wù)和需要一些額外的時間去完成任務(wù)叮盘,你可以調(diào)用beginBackgroundTaskWithName:expirationHandler: 或 beginBackgroundTaskWithExpirationHandler:應(yīng)用方法去請求額外的時間。調(diào)用這些方法中的一個去暫時延長你的應(yīng)用霹俺,給一些維阿的時間去完成它的工作柔吼。在完成工作,你的應(yīng)用必須調(diào)用endBackgroudTask: 方法去讓系統(tǒng)知道它完成能夠被懸掛丙唧。
沒個調(diào)用 beginBackgroundTaskWithName:expirationHandler: or beginBackgroundTaskWithExpirationHandler: 方法都會產(chǎn)生一個唯一標(biāo)示去聯(lián)系對應(yīng)的響應(yīng)任務(wù)愈魏。當(dāng)你完成了任務(wù),你必須調(diào)用endBackgroundTask: 相應(yīng)標(biāo)識(token) 去讓系統(tǒng)知道任務(wù)已經(jīng)完成了想际。調(diào)用endBackgroundTask:方法失敗將導(dǎo)致應(yīng)用終端培漏。如果你提供了截止處理當(dāng)你開始任務(wù),系統(tǒng)調(diào)用處理和給你最后一個機(jī)會去結(jié)束任務(wù)和避免終止胡本。
你不需要去等待知道你的的應(yīng)用移到后臺去指定后臺任務(wù)牌柄。已給更有意思的設(shè)備就是去調(diào)用beginBackgroundTaskWithName:expirationHandler: 或 beginBackgroundTaskWithExpirationHandler: 在開始任務(wù)并且調(diào)用endBackgroundTask: 盡可能在你結(jié)束的時候。
你甚至可以遵循這個模式當(dāng)你的應(yīng)用程序是在前臺執(zhí)行侧甫。
下面的代碼就是展示了怎么開始一個long-running 任務(wù)但你的應(yīng)用轉(zhuǎn)到后臺珊佣。在這個例子中傻昙,
Listing 3-1 shows how to start a long-running task when your app transitions to the background. In this example,請求去開啟后臺任務(wù)包括截止處理因?yàn)槿蝿?wù)太長了。任務(wù)它本身提供發(fā)送隊(duì)列異步操作彩扔,所以pplicationDidEnterBackground: 方法能夠返回正常妆档。使用block簡單的代碼需要支持應(yīng)用其他重要變量。例如:后臺任務(wù)標(biāo)識(background task identifier)虫碉。 后臺變量是一個類白能量贾惦,嫩鞏固存儲指針指向當(dāng)前后臺任務(wù)標(biāo)識并且初始化權(quán)限是用這個方法。
注意:總是提供額外的處理當(dāng)啟動一個任務(wù)的時候敦捧,但是如果你想知道多長時間程序剩下能夠運(yùn)行须板,通過backgroundTimeRemaining (UIApplication)這個屬性。
在你的自己的額外處理中兢卵,你能夠包括額外的代碼需要去關(guān)閉你的任務(wù)习瑰。然而,其他代碼你包括必須不能夠花費(fèi)太長時間去執(zhí)行因?yàn)橥ㄟ^額外的處理時間被調(diào)用秽荤,你的應(yīng)用已經(jīng)非常接近時間限制了甜奄。對于這個原因,最小清除你的狀態(tài)信息并且結(jié)束任務(wù)窃款。
Downloading Content in the Background (在后臺下載內(nèi)容)【下面的內(nèi)容轉(zhuǎn)化或者傳輸都是transfers】
當(dāng)下載文件的時候课兄,應(yīng)用應(yīng)該使用NSURLSession 對象去開啟下載,因此系統(tǒng)能夠控制下載的進(jìn)程在應(yīng)用被懸掛或者終止的案例中晨继。當(dāng)你配置NSURLSession對象對于后臺轉(zhuǎn)化烟阐,系統(tǒng)管理這些轉(zhuǎn)化在區(qū)分進(jìn)程和報告狀態(tài)到你的應(yīng)用使用普通的方式。如果你爹應(yīng)用終止當(dāng)轉(zhuǎn)化還在持續(xù)紊扬,系統(tǒng)繼續(xù)轉(zhuǎn)化在后臺并且合適的啟動你的應(yīng)用當(dāng)轉(zhuǎn)化【傳輸】完成或者當(dāng)一個或者更多的任務(wù)需要的你應(yīng)用關(guān)注蜒茄。 去支持傳輸,你必須配置NSURLSession 合適餐屎,去配置回話檀葛,你必須第一個是創(chuàng)建NSURLSessionConfigurationobject 配置對象和設(shè)置幾個屬性為合適的值。你然后傳遞配置對象到合適的初始化方法(NSURLSession的)當(dāng)創(chuàng)建你的會話啤挎。
創(chuàng)建配置對象支持后臺下載步驟如下:
(1)創(chuàng)建配置對象使用 backgroundSessionConfigurationWithIdentifier: (NSURLSessionConfiguration)方法
(2)設(shè)置配置對象的值通過sessionSendsLaunchEvents 這個屬性為yes驻谆;
(3)如果你的應(yīng)用工開始傳輸當(dāng)在前臺,它推薦你也設(shè)置任意屬性去配置為yes庆聘;
(4)配置其他屬性去創(chuàng)建NSURLSession對象胜臊。
(5)使用配置對象去創(chuàng)建NSURLSession對象
一旦皮遏制,你的NSURLSession對象無間隙的處理上傳和下載任務(wù)到系統(tǒng)在合適的時間伙判。如果任務(wù)完成黨你的應(yīng)用仍然在運(yùn)行(在前端或者后端)象对,回話對象通知它的代理用一般的方式。如果用戶終止你的應(yīng)用宴抚,系統(tǒng)取消任意的其他的待解決的任務(wù)勒魔。
當(dāng)所有的任務(wù)連接到后臺會話完成甫煞,系統(tǒng)重新啟動一個終止應(yīng)用(估計sessionSendsLaunchEvents 屬性設(shè)置為yes,用戶不會強(qiáng)迫退出應(yīng)用)并且調(diào)用代理的application:handleEventsForBackgroundURLSession:completionHandler: 這個方法冠绢。(系統(tǒng)可能也重啟應(yīng)用去處理驗(yàn)證挑戰(zhàn)或者其他關(guān)聯(lián)時間要求應(yīng)用關(guān)注)抚吠。在你實(shí)現(xiàn)的代理方法中,使用提供的表示去創(chuàng)建一個新的NSURLSessionConfiguration 和NSURLSession 對象帶有相同的配置弟胀。系統(tǒng)重新連接你新的會話對象到先前的任務(wù)和去報告他們的狀態(tài)到會話的對象代理中國楷力。
Implementing Long-Running Tasks (實(shí)現(xiàn)長運(yùn)行任務(wù))
對于需求
對于需要更多執(zhí)行時間的實(shí)現(xiàn),必須制定允許運(yùn)行他們不被懸掛孵户,在iOS 中萧朝,只有制定appo類型運(yùn)行在后臺運(yùn)行;
(1)播放的內(nèi)容能夠聽得見的類型應(yīng)用云心在后臺運(yùn)行
(2)錄制音頻內(nèi)容的應(yīng)用在后臺
(3)保吃用戶的位置信息實(shí)時夏哭,例如導(dǎo)航應(yīng)用
(4)Voice over Internet Protocol (VoIP) 支持(網(wǎng)絡(luò)語音)
(5)應(yīng)用需要下載和通話層的新內(nèi)容的進(jìn)程检柬。
(6)應(yīng)用接受合理的更新從額外的附件
應(yīng)用實(shí)現(xiàn)這些服務(wù)必須宣告服務(wù)系統(tǒng)支持用戶的系統(tǒng)庫區(qū)實(shí)現(xiàn)關(guān)聯(lián)他們服務(wù)的方面。宣告這些服務(wù)讓系統(tǒng)知道哪些服務(wù)可以使用竖配,但是在一些案例中在系統(tǒng)庫阻住你的應(yīng)用被懸掛何址。
Declaring Your App’s Supported Background Tasks (聲明你的應(yīng)用支持后臺任務(wù))
支持后臺執(zhí)行的一些類型,必須設(shè)置高級聲明在應(yīng)用上械念。在xcode5以及之后头朱,在應(yīng)用設(shè)置中聲明你的的應(yīng)用具有后臺支持運(yùn)行的能力。UIBackgroundModes 關(guān)鍵字在info.plist中設(shè)置為啟動龄减。選擇一個或者復(fù)選框匯總增加響應(yīng)后臺模式的值到關(guān)鍵字匯總。下面的后臺模式你可以指定和xcode中設(shè)置對應(yīng)的關(guān)鍵字值在info.plist文件中班眯。
每一個在前面的系統(tǒng)中讓系統(tǒng)知道你的應(yīng)用應(yīng)該被喚醒或者啟動在一個合適的時間去相應(yīng)關(guān)聯(lián)的事件希停。例如:應(yīng)用開始播放音樂并且然后渠道后臺仍舊需喲啊執(zhí)行時間去前沖輸出緩存。audio模型啟動告訴系統(tǒng)庫他們應(yīng)該繼續(xù)回調(diào)到應(yīng)用在合適的間隔時間署隘。如果應(yīng)用沒有選擇這個模式宠能,音頻可能被播放或者錄制通過應(yīng)用停止當(dāng)應(yīng)用移到后臺的時候。
Tracking the User’s Location (跟蹤用戶的位置)
有幾種方式去最終用戶的位置在后臺磁餐,實(shí)際上并不是要求你的應(yīng)用在后臺繼續(xù)運(yùn)行:
(1)重要改變位置服務(wù)(推薦)
(2)只是前臺定位服務(wù)
(3)后臺定位服務(wù)
重要改變位置服務(wù)被強(qiáng)烈推薦不要高精確的位置數(shù)據(jù)违崇。通過這個服務(wù),位置更新被產(chǎn)生只是在位置發(fā)生了重大的改變诊霹。所以羞延,對于本地應(yīng)用或者應(yīng)用提供給用戶本地關(guān)聯(lián)的非關(guān)鍵的。如果應(yīng)用被懸掛當(dāng)更新發(fā)生的時候脾还,系統(tǒng)將會喚醒它然后處理更新伴箩。如果應(yīng)用啟動這個服務(wù)并且它然后終止,系統(tǒng)將會自動重啟當(dāng)一個新的位置是有效的鄙漏。服務(wù)有效是在ios 4 之后嗤谚,這個只是在設(shè)備上有效包括窩蜂音頻棺蛛。
只是前臺和后臺位置服務(wù)都可以用在標(biāo)準(zhǔn)的位置核心定位服務(wù)去獲取位置數(shù)據(jù)。只是在前臺的定位服務(wù)停止傳遞更新如果應(yīng)用曾經(jīng)被懸掛巩步,有可能會發(fā)生如果應(yīng)用沒有支持其他后臺服務(wù)或者任務(wù)旁赊。只是前臺定位服務(wù)計劃就是用于在程序在前臺的時候只需要的定位數(shù)據(jù)。你啟動定位支持從后臺模型選擇中的能力在xcode項(xiàng)目中(你同樣也能夠使它支持包括后臺模式 的key去設(shè)置定位的值)椅野。
啟動模式不會阻住系統(tǒng)懸掛引用彤恶,但是它能夠告訴系統(tǒng)它可以喚醒應(yīng)用當(dāng)新的位置數(shù)據(jù)傳遞過里。所以鳄橘,這個關(guān)鍵字嫩鞏固有效的讓應(yīng)用在后臺運(yùn)行去更新位置當(dāng)他們發(fā)生的時候声离。
重點(diǎn):建議盡量少用標(biāo)準(zhǔn)服務(wù),或者使用重點(diǎn)位置地址服務(wù)替代瘫怜。位置服務(wù)要求啟動用戶的iOS設(shè)備在radio硬件上术徊。在硬件上繼續(xù)運(yùn)行能夠消費(fèi)一系列能量。如果你的應(yīng)用不需要提供精確和吃持續(xù)的位置信息給用戶鲸湃,最好是最小化使用位置服務(wù)赠涮。
關(guān)于怎么使用每個不同的位置服務(wù)在你的應(yīng)用上,看:Location and Maps Programming Guide.
Playing and Recording Background Audio (播放和錄制后臺音頻)
一個應(yīng)用持續(xù)播放或者錄制能夠注冊那些任務(wù)在后臺(甚至當(dāng)應(yīng)用在后臺運(yùn)行)暗挑。在xcode項(xiàng)目上進(jìn)行設(shè)置支持模式笋除。你同樣能夠支持包括UIBackgroundModes 關(guān)鍵字在info.plist 文件中。應(yīng)用可以播放音頻在后臺而不會靜音炸裆。
典型的后臺音頻引用包括:
(1)音樂播放應(yīng)用
(2)音頻記錄應(yīng)用
(3)應(yīng)用支持音頻和在airPlay中重播
(4)VoIP 支持音頻和視頻在airPlay上垃它。
當(dāng)UIBackgroundModes 包括了audio的值,當(dāng)程序進(jìn)入后臺的時候烹看,系統(tǒng)的媒體庫不會讓應(yīng)用被懸掛国拇。當(dāng)程序播放音頻和視頻內(nèi)容,應(yīng)用將繼續(xù)運(yùn)行到后臺惯殊。然而酱吝,如果錄制或者播放停止,系統(tǒng)就會懸掛程序土思。
你可以使用這些系統(tǒng)音頻庫區(qū)在后臺音頻內(nèi)容工作和進(jìn)程使用這些庫當(dāng)庫沒有變化务热。因?yàn)槟愕膽?yīng)用不會被懸掛當(dāng)播放媒體文件,調(diào)用正常處理當(dāng)你的應(yīng)用在后臺的時候己儒。在你的回調(diào)中當(dāng)你的只要提供數(shù)據(jù)給播放崎岂。例如,一個媒體音頻需要下載音樂流數(shù)據(jù)從服務(wù)器中或推送當(dāng)前的音頻樣品到播放中址愿。應(yīng)用不應(yīng)該執(zhí)行其他任何的無關(guān)任務(wù)和沒有關(guān)聯(lián)的的播放该镣。
多余一個應(yīng)用支持音頻,系統(tǒng)支持哪一個應(yīng)用允許播放和音頻錄制在給定的時間。前臺應(yīng)用同樣有權(quán)限操作音頻损合∈⊙蓿可能不止一個應(yīng)用允許在后臺播放音頻,基于基礎(chǔ)配置決定每一個應(yīng)用的音頻會話嫁审。你應(yīng)該合適的皮遏制你的應(yīng)用音頻回話和小心使用系統(tǒng)庫處理中斷和類型的音頻相關(guān)的通知跋炕。怎么配置音頻會話對象在后臺執(zhí)行。查看《Audio Session Programming Guide》
Implementing a VoIP App (是吸納VoIP應(yīng)用)
語音網(wǎng)絡(luò)接口應(yīng)用允許用于讓用戶去使用手機(jī)調(diào)用使用網(wǎng)絡(luò)連接體態(tài)設(shè)備中的窩蜂服務(wù)律适。例如已給應(yīng)用需要支持持久的網(wǎng)絡(luò)連接到它關(guān)聯(lián)的服務(wù)中所以它能夠接收輸入的調(diào)用和其他關(guān)聯(lián)的數(shù)據(jù)辐烂。不是保持著VoIP應(yīng)用的一直醒著,系統(tǒng)允許他們被懸掛并且提供場所去控制他們的sockets給他們捂贿。當(dāng)輸入被檢測到索抓,系統(tǒng)會喚醒VoIP應(yīng)用去返回到socket控制它衫哥。
配置VoIP應(yīng)用温算,需要以下操作:
(1)支持ViOP在后臺模式下博播放,需要在info.plist中設(shè)置UIBackgroundModes 關(guān)鍵字
(2)配置app套接字中對VoIP是可用的
(3)在移到后臺之前胆绊,調(diào)用setKeepAliveTimeout:handler: 這個方法去安裝一個處理去周期性執(zhí)行,你的應(yīng)用能夠使用這個處理去支持它的服務(wù)連接颜屠。
(4)配置你的音頻會話去出里轉(zhuǎn)換和用戶啟動辰妙。
包括voip 值在UIBackgroundModes 關(guān)鍵字匯總讓系統(tǒng)知道它應(yīng)該允許程序去運(yùn)行在后臺當(dāng)需要去管理網(wǎng)絡(luò)套接字的時候。帶有和這個key的應(yīng)用也可以重新啟動在后臺當(dāng)系統(tǒng)boot去確定VoIP 服務(wù)是有效的甫窟。
大多的VoIP也需喲啊去配置作為后臺音頻應(yīng)用去傳遞音頻當(dāng)在后臺的時候密浑。所以,你應(yīng)該包括音頻和voip值設(shè)置到UIBackgroundModes 關(guān)鍵字匯總粗井。如果你沒有處理這個尔破,你的應(yīng)用不能夠播放或者記錄音頻當(dāng)在后臺。對于更多信心關(guān)于 UIBackgroundModes key, see Information Property List Key Reference.
執(zhí)行信息關(guān)于步驟背传,你必須實(shí)現(xiàn)VoIP應(yīng)用:see Tips for Developing a VoIP App.
Fetching Small Amounts of Content Opportunistically (取少量內(nèi)容的機(jī)會)
應(yīng)用需要周期性檢查好新內(nèi)容然后請求系統(tǒng)去喚醒他們呆瞻,所以他們能夠開始獲取操作內(nèi)容。要啟動這個功能需要在info.plist 文件中進(jìn)行設(shè)置径玖。
啟動了這個模式不是一個保證,系統(tǒng)將會提供給你的應(yīng)用一些時間去在后臺執(zhí)行颤介。系統(tǒng)必須平衡你的應(yīng)用需要去獲取應(yīng)用需要的內(nèi)容和系統(tǒng)本身梳星。獲取到信息之后,系統(tǒng)給供給應(yīng)用一些時間當(dāng)他們有更好的機(jī)會去處理滚朵。當(dāng)一個好的應(yīng)用產(chǎn)生冤灾,系統(tǒng)會換新或者啟動你的應(yīng)用到后臺并且調(diào)用應(yīng)用代理
application:performFetchWithCompletionHandler: 這個方法。使用方法去檢查新的內(nèi)容和開始下載操作辕近。當(dāng)你完成下載新內(nèi)容韵吨,你必須執(zhí)行提供完成的處理塊,傳遞結(jié)果去只是內(nèi)容是否合理移宅。 執(zhí)行這個快去告訴系統(tǒng)它能夠移動你的應(yīng)用到懸掛狀態(tài)并且評估它的電量的使用归粉。應(yīng)用下載小數(shù)目的內(nèi)容很快椿疗,并且能夠快速響應(yīng)當(dāng)他們有內(nèi)容下載合理的時候,更像是執(zhí)行時間在接下來花費(fèi)很多時間去下載他們的內(nèi)容或者聲明內(nèi)容是有效的然后沒有下載內(nèi)容糠悼。當(dāng)下載內(nèi)容届榄,推薦使用NSURLSession類去初始化和管理你的下載。關(guān)于怎么使用使用這個類倔喂,管理上傳和下載任務(wù)铝条。查看 URL Session Programming Guide
Using Push Notifications to Initiate a Download (使用通知去初始化下載)
如果服務(wù)器發(fā)送通知到用戶的設(shè)備當(dāng)新的內(nèi)容是有效的對于你的應(yīng)用,你能夠循環(huán)系統(tǒng)去運(yùn)行你的應(yīng)用在后臺席噩,所以班缰,你能夠馬山開始下載新的內(nèi)容。
后臺模式計劃去最小化消耗的時間流逝在當(dāng)用戶看到通知和當(dāng)用戶能夠展示內(nèi)容之間悼枢。應(yīng)用能夠典型地喚醒在粗略相同的花四濺埠忘,用戶看到通知當(dāng)時仍然給你很多時間你可能有。支持后臺運(yùn)行 萧芙,需要在info.plist 中設(shè)置给梅。
對于發(fā)送通知去觸發(fā)下載,通知的負(fù)載必須包括內(nèi)容有效關(guān)鍵字和它的值是1.當(dāng)關(guān)鍵字顯示双揪,系統(tǒng)會喚醒后臺程序并且調(diào)用app delegte中的application:didReceiveRemoteNotification:fetchCompletionHandler: 方法动羽。你應(yīng)該下載相關(guān)的內(nèi)容去集合到你的應(yīng)用中。
當(dāng)下載內(nèi)容渔期,推薦你使NSURLSession類去開始和管理下載运吓。更多信息關(guān)于上傳和下載看: URL Session Programming Guide.
Downloading Newsstand Content in the Background (在后臺下載新的內(nèi)容)
一個新聞報刊引用下載新的雜志或者報紙問題能夠注冊去執(zhí)行這些下載在后臺。你能夠支持newstands下載從后臺模式在你的xcode項(xiàng)目中設(shè)置疯趟。當(dāng)你的key有的時候拘哨,系統(tǒng)啟動你的應(yīng)用,如果沒有準(zhǔn)備運(yùn)行信峻,這樣她能夠開始下載對于新的事件倦青。當(dāng)你使用Newstand kit 庫區(qū)開始一個下載。系統(tǒng)處理下載的進(jìn)度對于你的應(yīng)用盹舞。系統(tǒng)能夠繼續(xù)下載文件甚至如果你爹應(yīng)用被懸掛或者終止产镐。當(dāng)下載操作完成,系統(tǒng)將你的文件傳輸?shù)缴澈兄胁⑶彝ㄖ愕膽?yīng)用踢步。如果應(yīng)用沒有運(yùn)行癣亚,通知喚醒應(yīng)用給機(jī)會它進(jìn)入新的下載文件。如果他們有錯誤在下載的過程中获印,你的應(yīng)用類似喚醒處理他們述雾。
newstand 可關(guān)注: see Newsstand Kit Framework Reference.
Communicating with an External Accessory 與外部附件通信
應(yīng)用和外部附件通訊能夠喚醒如果需要傳輸更新的時候當(dāng)應(yīng)用被懸掛。支持重要的類型對于外圍設(shè)備傳送數(shù)據(jù)在已給有規(guī)律的間隔,例如心率控制玻孟。你能夠支持額外附件交流從后臺模式(需要在xcode中進(jìn)行配置)唆缴。當(dāng)你啟動這個模式,內(nèi)外設(shè)備庫不會關(guān)閉活動的會話(ios 4之后取募,這些會話自動關(guān)閉當(dāng)應(yīng)用懸掛)琐谤。當(dāng)新的數(shù)據(jù)從外圍設(shè)備中到來,庫會喚醒你的應(yīng)用所以它能夠處理數(shù)據(jù)玩敏。系統(tǒng)也能夠喚醒應(yīng)用去促進(jìn)外圍設(shè)備的鏈接和斷開連接斗忌。
應(yīng)用支持后臺外圍設(shè)備的更新必須跟蹤幾個基礎(chǔ)指導(dǎo):
(1)應(yīng)用必須提供一個界面允許用于去開始或者停止外圍更新事件的傳輸。這個接口應(yīng)該打開或者關(guān)閉外圍設(shè)備會話旺聚。
(2)被喚醒织阳,應(yīng)用有大概10秒鐘事件去處理數(shù)據(jù)。確切的砰粹,它應(yīng)該盡可能快的處理數(shù)據(jù)并且允許它本身被再次懸掛唧躲。然而,如果需要更多的事件就使用beginBackgroundTaskWithExpirationHandler: 這個方法(這種方式大概有150秒左右碱璃,由系統(tǒng)決定的)弄痹。
Communicating with a Bluetooth Accessory (和藍(lán)牙外圍設(shè)備進(jìn)行交流)
應(yīng)用在和藍(lán)牙外圍設(shè)備進(jìn)行工作的時候,如果藍(lán)牙更新信息發(fā)過來嵌器,程序應(yīng)該會被喚醒肛真。這個支持對Bluetooth-LE在間斷時間傳遞數(shù)據(jù)很重要,例如:藍(lán)牙檢測心率等(可以在xcode的info.plist 中進(jìn)行配置)爽航。當(dāng)你啟動這個模式蚓让,Core Bluetooth framework保持繪話響應(yīng)外圍設(shè)備。額外的讥珍,新數(shù)據(jù)從外圍設(shè)備到達(dá)區(qū)喚醒陳旭历极,因此它能夠處理數(shù)據(jù)。系統(tǒng)也能夠喚醒應(yīng)用去處理外圍設(shè)備的連接和斷開連接衷佃。在iOS 6 趟卸,一個應(yīng)用也能夠操作在外圍模式下和藍(lán)牙外圍設(shè)備。藍(lán)牙設(shè)備(在xocde的info.plist中進(jìn)行設(shè)置)氏义,啟動和這個模式衰腌, Core Bluetooth framework 能剪短喚醒后臺程序處理接受的關(guān)聯(lián)請求。程序被喚醒應(yīng)該處理這些時間然后盡可能的返回因?yàn)槌绦蚰軌虮辉俅螒覓烀偕蕖H我鈶?yīng)用支持后臺進(jìn)程對于藍(lán)牙數(shù)據(jù)必須在會話基礎(chǔ)上遵循以下指導(dǎo):
(1)應(yīng)用必須提供一個界面允許用戶去開啟和停止藍(lán)牙傳輸事件。接口應(yīng)該開啟和關(guān)閉會話在合適的時候琼稻。
(2)別喚醒吮螺,應(yīng)用大概有10秒中去處理數(shù)據(jù)。確切的,它應(yīng)該盡可能快的處理數(shù)據(jù)允許它自己被懸掛鸠补。然而萝风,就如果需要更多時間就必須使用beginBackgroundTaskWithExpirationHandler: 方法去請求更多的時間。
Getting the User’s Attention While in the Background (在后臺獲取用戶的關(guān)注)
通知對于被懸掛的應(yīng)用是一種方式紫岩,它是在后臺而不是運(yùn)行當(dāng)獲取到用戶的關(guān)注(提醒规惰;通知)。應(yīng)用能夠使用本地通知去展示警告泉蝌,播放聲音歇万,應(yīng)用的icon微章或者三個綜合。例如:一個警告時鐘能夠用本地通知去播放警告聲音和顯示一個警告勋陪。當(dāng)一個通知被傳遞給用戶贪磺,用戶必須決定返回前臺。(如果應(yīng)用已經(jīng)在前臺運(yùn)行诅愚,本地通知默認(rèn)是傳遞給應(yīng)用而不是用戶)
計劃的傳輸本地通知寒锚,創(chuàng)建一個UILocalNotificaiton對象,配置通知參數(shù)和觸發(fā)使用應(yīng)用方法违孝。本地通知對象信息包括信息傳遞(聲音刹前,警告,badge)和時間(適當(dāng))在傳遞給它雌桑。UIApplication類方法提供了選擇去立即傳輸通知或者計劃時間喇喉。
下面真實(shí)了一個例子;
這個例子只是配置一個一次性鬧鐘并且取消以前的鬧鐘(你自己的應(yīng)用不能夠有128個本地通知活動在一個時間和取消過去的鬧鐘在這個新的之前)筹燕。
鬧鐘自己包括了警告箱和一個聲音文件被播放如果一個應(yīng)用不運(yùn)行或者在后臺運(yùn)行當(dāng)警告開始轧飞。如果應(yīng)用是活動的并且運(yùn)行在前臺,app delegate application:didReceiveLocalNotification: 方法收到信息撒踪。
本地通知使用聲音文件有相同的請求當(dāng)這些用在推送通知上过咬。自定義聲音文件必須定位在應(yīng)用main bundle和支持如下格式中的一個:Linear PCM, MA4, μ-Law, or a-Law.你可以指定 UILocalNotificationDefaultSoundName 常量指定去播放默認(rèn)的警告信息對于設(shè)備。當(dāng)通知被發(fā)送的聲音播放制妄,系統(tǒng)也觸發(fā)顫動掸绞。你可以取消計劃的通知或者獲取通知列表使用應(yīng)用類的方法。更多信息是關(guān)于這些方法耕捞,查看 UIApplication Class Reference衔掸。額外的信息配置本地通知,查看:Local and Remote Notification Programming Guide.
Understanding When Your App Gets Launched into the Background(明白程序從啟動到后臺)
程序支持后臺執(zhí)行可能會被啟動通過系統(tǒng)處理輸入事件俺抽。如果一個被終止由于已卸載原因而不是強(qiáng)迫退出敞映,系統(tǒng)啟動應(yīng)用當(dāng)下面的一個事件發(fā)生。
(1)對于位置的應(yīng)用
1)系統(tǒng)接收到一個位置更新(遇到程序配置標(biāo)準(zhǔn)對于傳遞)
2)設(shè)備進(jìn)入或者退出一個注冊區(qū)域(預(yù)備是被位置地理化區(qū)域或者地理柵欄)
(2)對于音頻的而程序磷斧,音頻庫需要程序處理一些數(shù)據(jù)(音頻程序包括播放音頻和使用麥克分)
(3)藍(lán)牙應(yīng)用
1)一個應(yīng)用作為中間的角色獲取數(shù)據(jù)從連接的外圍設(shè)備上
2)一個外圍設(shè)備從中間設(shè)備中接收到命令振愿。
(4)后臺下載應(yīng)用
1)一個通知到達(dá)和通知的payload中的值是1(有用)
2)系統(tǒng)喚醒應(yīng)用在一個隨機(jī)的時刻去開始下載新的內(nèi)容捷犹。
3)對于使用NSURLSession類去下載內(nèi)容,所有的任務(wù)連接到會話對象成功或者失敗冕末。
4)一個下載的被初始化通過一個新聞報刊完成萍歉。
很多情況下,系統(tǒng)不會重新啟動在用戶強(qiáng)制退出。一個例外是位置應(yīng)用档桃,在iOS 8 或者之后被啟動在用戶強(qiáng)制退出的時候枪孩。其他案例,雖然藻肄,用戶必須顯示啟動程序或者重啟設(shè)備在應(yīng)用被自動啟動進(jìn)入后臺通過系統(tǒng)蔑舞。當(dāng)設(shè)備的密碼保護(hù)開啟,系統(tǒng)不會啟動一個應(yīng)用在后臺當(dāng)用戶第一個解鎖設(shè)備的時候仅炊。
Being a Responsible Background App (成為一個可靠的后臺應(yīng)用)
前臺程序比后臺程序性使用硬件和系統(tǒng)資源的優(yōu)先權(quán)高斗幼,后臺運(yùn)行的應(yīng)用程序需要為這種差異做好準(zhǔn)備,并在后臺運(yùn)行時調(diào)整它們的行為.
尤其是程序移到后臺的時候需要遵循下面的指導(dǎo):
(1)Do not make any OpenGL ES calls from your code. (不要有opengl處理調(diào)用的代碼)
在后臺的程序是不能夠創(chuàng)建EAGLContext 對象或者使用OpenGL ES繪畫的一些命令在后臺程序抚垄,應(yīng)用調(diào)用這些命令立即會被殺掉蜕窿。程序必須確定前面提到的這些命令被殺掉在進(jìn)入后臺之前,關(guān)于如何處理當(dāng)從進(jìn)入后臺或者從后臺出來查看: Implementing a Multitasking-aware OpenGL ES Application in OpenGL ES Programming Guide for iOS (在直播的時候應(yīng)該也是需要處理圖像的)
(2)Cancel any Bonjour-related services before being suspended. (移除bonjour的關(guān)聯(lián))
當(dāng)你移到后臺程序時在被懸掛之前呆馁,需要移除bonjour的注冊和關(guān)閉socket鏈接網(wǎng)絡(luò)服務(wù)桐经。一個懸掛的應(yīng)用不能夠響應(yīng)任何服務(wù)進(jìn)來的請求。關(guān)閉這些服務(wù)阻住它們顯示是可用的當(dāng)實(shí)際上是不可用的(也就是顯示和實(shí)際發(fā)生的錯亂)浙滤。如果你沒有關(guān)閉Bonjour服務(wù)阴挣,系統(tǒng)將會自動關(guān)閉當(dāng)程序被懸掛的時候.
(3) Be prepared to handle connection failures in your network-based sockets. (準(zhǔn)備好處理基于網(wǎng)絡(luò)套接字的連接故障)
系統(tǒng)可能會拆毀套接字的鏈接你的應(yīng)用匯懸掛(由于一些原因),例如當(dāng)一個丟失的信號或者網(wǎng)絡(luò)轉(zhuǎn)變纺腊,都可能造成不常見的問題畔咧。當(dāng)你的應(yīng)用重啟的時候,可能會遇到錯誤使用socket揖膜,簡單的方式就是重新連接誓沸。
(4)Save your app state before moving to the background. (保存程序的狀態(tài)在移到后臺程序之前)
在低內(nèi)存中環(huán)境下,后臺程序可能會被清洗掉從空閑的地方壹粟。懸掛的程序首先會被清洗掉和在清洗掉之前沒有任何通知拜隧。結(jié)果,應(yīng)用程序會使用ios6以及后面的系統(tǒng)版本去保存它們接口的裝填到硬盤上趁仙。關(guān)于怎么樣支持這個特點(diǎn)洪添,查看:Preserving Your App’s Visual Appearance Across Launches.
(5)Remove strong references to unneeded objects when moving to the background。(移除沒有需要的強(qiáng)引用對象)
如果你的應(yīng)用有大量的緩存對象(尤其是圖片)雀费,會移除所有的強(qiáng)引用緩存對象在移到后臺之前干奢。更多信息查看:Reduce Your Memory Footprint
(6)Stop using shared system resources before being suspended (停止使用分享系統(tǒng)資源在懸掛之前)
與程序有交互的分享系統(tǒng)資源,例如: 相冊或者日歷數(shù)據(jù)庫應(yīng)該停止使用這些資源在懸掛之前盏袄。這些資源的訪問權(quán)限都是前臺程序律胀。當(dāng)你的程序懸掛了宋光,如果你的程序被發(fā)現(xiàn)在使用分享資源,就會被kill掉炭菌。
(7)Avoid updating your windows and views. (避免更新你的windows和views)
因?yàn)槌绦虻膚indow和views 是不可見的當(dāng)你的程序在后臺,你應(yīng)該免費(fèi)更新他們逛漫。異常會出現(xiàn)當(dāng)你需要更新window的內(nèi)容和window的等級給程序鏡像黑低。
(8)Respond to connect and disconnect notifications for external accessories (響應(yīng)鏈接和不連接通知對于額外的附件)
當(dāng)程序在和額外的資源交流的時候,系統(tǒng)自然發(fā)送一個斷開連接的通知當(dāng)應(yīng)用移到后臺的時候酌毡。應(yīng)用必須注冊這個通知和使用它去關(guān)閉當(dāng)前的附件回話克握。更多信息是處理附件連接和斷開通知。查看External Accessory Programming Topics.
(9)Clean up resources for active alerts when moving to the background. (清除資源對于激活的而警告當(dāng)移到后臺)
為了保存上下文當(dāng)交換程序的時候枷踏,系統(tǒng)沒有自動解除sheets(UIActionSheet) 或者alert 視圖(UIAlertView)但你的程序移到后臺菩暗。會提供一個寫清楚的行為權(quán)限去移到后臺。例如:你可能想取消action sheet或者alert view 或者保存足夠的上下文信息去存儲視圖(后來)【在這個用例中你的程序會被中斷】旭蠕。
(10)Remove sensitive information from views before moving to the background. 從view上移除敏感信息
當(dāng)程序轉(zhuǎn)化為后臺的時候停团,,系統(tǒng)會鏡像當(dāng)前主要的window掏熬,會有簡單的系那是當(dāng)程序返回到前臺佑稠。在返回你的applicationDidEnterBackground: 這個方法之前,你應(yīng)該隱藏或者使密碼復(fù)雜化和其他敏感的個人細(xì)膩可能被獲取在鏡像的時候旗芬。
(11)**Do minimal work while running in the background. **(做一些最小的工作在后臺)
執(zhí)行時間對于后臺程序來說會有更多的限制對于前臺程序舌胶。程序花費(fèi)很多時間去執(zhí)行在后臺可能被減速或者終止。
如果你的是后臺音頻程序疮丛,或者其他類型的程序允許運(yùn)行在后臺幔嫂,你的程序應(yīng)該響應(yīng)輸入信息在任何方式。換句話誊薄,系統(tǒng)可能通知你的程序低內(nèi)存警告當(dāng)他們發(fā)生的時候履恩。系統(tǒng)需要去終止程序去釋放更多的內(nèi)存,程序會調(diào)用它的代理方法applicationWillTerminate: 去執(zhí)行最后的任務(wù)在退出之前暇屋。
Opting Out of Background Execution (選擇退出后臺執(zhí)行)
如果你根本就不想程序在后臺執(zhí)行似袁,直接明確在info.plist 文件中設(shè)置UIApplicationExitsOnSuspend (key)的值為yes;
當(dāng)我們選擇了退出后臺執(zhí)行的這種設(shè)置咐刨,在not-running昙衅、inactive、active states 從來不會進(jìn)入到后臺或者暫投瘢或者懸掛狀態(tài)而涉。
這個時候,當(dāng)用戶點(diǎn)擊home鍵的退出應(yīng)用時联予,applicationWillTerminate: (app delegate方法)被調(diào)用啼县,應(yīng)用大概有5s的時候去清除和退出再程序終止和移到?jīng)]有運(yùn)行的狀態(tài)之前材原。
選擇退出后臺執(zhí)行不推薦使用,但是可能在特定條件下選擇季眷。尤其是如果在后臺執(zhí)行中添加重要復(fù)雜的代碼余蟹,終止應(yīng)用可能是一個解決方法。同樣子刮,如果你的小號很多內(nèi)存和不能夠很容易釋放威酒,系統(tǒng)可能會殺掉當(dāng)期的應(yīng)用將空間讓給其他應(yīng)用。所以挺峡,選擇終止而不是到后臺可能會產(chǎn)生相同的結(jié)果和保存你的開發(fā)和努力葵孤。
Information Property List Key Reference info.plist 設(shè)置