iOS進入后臺的以及可以后臺執(zhí)行的應用的了解

蘋果官網(wǎng)地址

Background Execution (后臺執(zhí)行)
當用于沒有-啟動應用,系統(tǒng)移到后臺狀態(tài)。對于很多應用,后臺狀態(tài)只是一個簡短的停留方式。懸掛程序是一個種方式去提高電池壽命,它同樣允許系統(tǒng)去專注于重要系統(tǒng)資源用于一個新的前臺程序當用于關注的時候(觸發(fā)的時候)。

大多的應用可以很容易移動到懸掛狀態(tài)但是同樣也有很合適的理由去繼續(xù)運行在后臺。一個徒步的應用可能想去跟蹤用戶的位置所以它嫩鞏固顯示具體的位置在地圖上面。一個音頻的應用可能需要繼續(xù)播放音樂在鎖頻的時候。其他應用可能需要下載內容在后臺,所以它能夠
最小的言辭顯示內容給用戶。當你發(fā)現(xiàn)你需要保持你的應用在后臺運行,iOS幫助你有效和不需要系統(tǒng)資源或者用戶的電池。技術提供iOS 進入下面三個范疇:
(1)應用安康市一個簡短的任務在前端能夠詢問時間去完成任務當應用移到后臺。
(2)應用提示下載在前段能夠退卡管理這些下載到系統(tǒng),因此允許你應用被懸掛或者終止當下載繼續(xù)。
(3)應用需要運行在后后臺去支持指定任務類型能夠聲明他們支持一個或者多個后臺執(zhí)行模式。
總是嘗試去避免做一些后臺的工作除非提供用戶的提亞。一個應用可能移到后臺因為用戶啟動不同的應用應為用戶鎖定設備并且沒有使用它現(xiàn)在。在兩種狀態(tài)下,用戶顯示你的應用不需要做一些有意思工作現(xiàn)在。繼續(xù)運行這些環(huán)境將不會使用設備的電池并且可能導致用戶強制退出應用。這么有意思的工作你可以在后臺處理和避免它當你能夠。

Executing Finite-Length Tasks (執(zhí)行一個有限的任務)
應用移到后臺被執(zhí)行是將它們進入到不活躍的狀態(tài)(盡可能),所以,它們能夠被系統(tǒng)懸掛。如果你的應用在中心任務和需要一些額外的時間去完成任務,你可以調用beginBackgroundTaskWithName:expirationHandler: 或 beginBackgroundTaskWithExpirationHandler:應用方法去請求額外的時間。調用這些方法中的一個去暫時延長你的應用,給一些維阿的時間去完成它的工作。在完成工作,你的應用必須調用endBackgroudTask: 方法去讓系統(tǒng)知道它完成能夠被懸掛。
沒個調用 beginBackgroundTaskWithName:expirationHandler: or beginBackgroundTaskWithExpirationHandler: 方法都會產(chǎn)生一個唯一標示去聯(lián)系對應的響應任務。當你完成了任務,你必須調用endBackgroundTask: 相應標識(token) 去讓系統(tǒng)知道任務已經(jīng)完成了。調用endBackgroundTask:方法失敗將導致應用終端。如果你提供了截止處理當你開始任務,系統(tǒng)調用處理和給你最后一個機會去結束任務和避免終止。
你不需要去等待知道你的的應用移到后臺去指定后臺任務。已給更有意思的設備就是去調用beginBackgroundTaskWithName:expirationHandler: 或 beginBackgroundTaskWithExpirationHandler: 在開始任務并且調用endBackgroundTask: 盡可能在你結束的時候。
你甚至可以遵循這個模式當你的應用程序是在前臺執(zhí)行。
下面的代碼就是展示了怎么開始一個long-running 任務但你的應用轉到后臺。在這個例子中,
Listing 3-1 shows how to start a long-running task when your app transitions to the background. In this example,請求去開啟后臺任務包括截止處理因為任務太長了。任務它本身提供發(fā)送隊列異步操作,所以pplicationDidEnterBackground: 方法能夠返回正常。使用block簡單的代碼需要支持應用其他重要變量。例如:后臺任務標識(background task identifier)。 后臺變量是一個類白能量,嫩鞏固存儲指針指向當前后臺任務標識并且初始化權限是用這個方法。


在退出程序的時候執(zhí)行的一些任務

注意:總是提供額外的處理當啟動一個任務的時候,但是如果你想知道多長時間程序剩下能夠運行,通過backgroundTimeRemaining (UIApplication)這個屬性。
在你的自己的額外處理中,你能夠包括額外的代碼需要去關閉你的任務。然而,其他代碼你包括必須不能夠花費太長時間去執(zhí)行因為通過額外的處理時間被調用,你的應用已經(jīng)非常接近時間限制了。對于這個原因,最小清除你的狀態(tài)信息并且結束任務。

Downloading Content in the Background (在后臺下載內容)【下面的內容轉化或者傳輸都是transfers】
當下載文件的時候,應用應該使用NSURLSession 對象去開啟下載,因此系統(tǒng)能夠控制下載的進程在應用被懸掛或者終止的案例中。當你配置NSURLSession對象對于后臺轉化,系統(tǒng)管理這些轉化在區(qū)分進程和報告狀態(tài)到你的應用使用普通的方式。如果你爹應用終止當轉化還在持續(xù),系統(tǒng)繼續(xù)轉化在后臺并且合適的啟動你的應用當轉化【傳輸】完成或者當一個或者更多的任務需要的你應用關注。 去支持傳輸,你必須配置NSURLSession 合適,去配置回話,你必須第一個是創(chuàng)建NSURLSessionConfigurationobject 配置對象和設置幾個屬性為合適的值。你然后傳遞配置對象到合適的初始化方法(NSURLSession的)當創(chuàng)建你的會話。
創(chuàng)建配置對象支持后臺下載步驟如下:
(1)創(chuàng)建配置對象使用 backgroundSessionConfigurationWithIdentifier: (NSURLSessionConfiguration)方法
(2)設置配置對象的值通過sessionSendsLaunchEvents 這個屬性為yes;
(3)如果你的應用工開始傳輸當在前臺,它推薦你也設置任意屬性去配置為yes;
(4)配置其他屬性去創(chuàng)建NSURLSession對象。
(5)使用配置對象去創(chuàng)建NSURLSession對象
一旦皮遏制,你的NSURLSession對象無間隙的處理上傳和下載任務到系統(tǒng)在合適的時間。如果任務完成黨你的應用仍然在運行(在前端或者后端),回話對象通知它的代理用一般的方式。如果用戶終止你的應用,系統(tǒng)取消任意的其他的待解決的任務。
當所有的任務連接到后臺會話完成,系統(tǒng)重新啟動一個終止應用(估計sessionSendsLaunchEvents 屬性設置為yes,用戶不會強迫退出應用)并且調用代理的application:handleEventsForBackgroundURLSession:completionHandler: 這個方法。(系統(tǒng)可能也重啟應用去處理驗證挑戰(zhàn)或者其他關聯(lián)時間要求應用關注)。在你實現(xiàn)的代理方法中,使用提供的表示去創(chuàng)建一個新的NSURLSessionConfiguration 和NSURLSession 對象帶有相同的配置。系統(tǒng)重新連接你新的會話對象到先前的任務和去報告他們的狀態(tài)到會話的對象代理中國。

Implementing Long-Running Tasks (實現(xiàn)長運行任務)
對于需求
對于需要更多執(zhí)行時間的實現(xiàn),必須制定允許運行他們不被懸掛,在iOS 中,只有制定appo類型運行在后臺運行;
(1)播放的內容能夠聽得見的類型應用云心在后臺運行
(2)錄制音頻內容的應用在后臺
(3)保吃用戶的位置信息實時,例如導航應用
(4)Voice over Internet Protocol (VoIP) 支持(網(wǎng)絡語音)
(5)應用需要下載和通話層的新內容的進程。
(6)應用接受合理的更新從額外的附件
應用實現(xiàn)這些服務必須宣告服務系統(tǒng)支持用戶的系統(tǒng)庫區(qū)實現(xiàn)關聯(lián)他們服務的方面。宣告這些服務讓系統(tǒng)知道哪些服務可以使用,但是在一些案例中在系統(tǒng)庫阻住你的應用被懸掛。

Declaring Your App’s Supported Background Tasks (聲明你的應用支持后臺任務)
支持后臺執(zhí)行的一些類型,必須設置高級聲明在應用上。在xcode5以及之后,在應用設置中聲明你的的應用具有后臺支持運行的能力。UIBackgroundModes 關鍵字在info.plist中設置為啟動。選擇一個或者復選框匯總增加響應后臺模式的值到關鍵字匯總。下面的后臺模式你可以指定和xcode中設置對應的關鍵字值在info.plist文件中。


可以在后臺執(zhí)行的應用列表

每一個在前面的系統(tǒng)中讓系統(tǒng)知道你的應用應該被喚醒或者啟動在一個合適的時間去相應關聯(lián)的事件。例如:應用開始播放音樂并且然后渠道后臺仍舊需喲啊執(zhí)行時間去前沖輸出緩存。audio模型啟動告訴系統(tǒng)庫他們應該繼續(xù)回調到應用在合適的間隔時間。如果應用沒有選擇這個模式,音頻可能被播放或者錄制通過應用停止當應用移到后臺的時候。

Tracking the User’s Location (跟蹤用戶的位置)
有幾種方式去最終用戶的位置在后臺,實際上并不是要求你的應用在后臺繼續(xù)運行:
(1)重要改變位置服務(推薦)
(2)只是前臺定位服務
(3)后臺定位服務
重要改變位置服務被強烈推薦不要高精確的位置數(shù)據(jù)。通過這個服務,位置更新被產(chǎn)生只是在位置發(fā)生了重大的改變。所以,對于本地應用或者應用提供給用戶本地關聯(lián)的非關鍵的。如果應用被懸掛當更新發(fā)生的時候,系統(tǒng)將會喚醒它然后處理更新。如果應用啟動這個服務并且它然后終止,系統(tǒng)將會自動重啟當一個新的位置是有效的。服務有效是在ios 4 之后,這個只是在設備上有效包括窩蜂音頻。
只是前臺和后臺位置服務都可以用在標準的位置核心定位服務去獲取位置數(shù)據(jù)。只是在前臺的定位服務停止傳遞更新如果應用曾經(jīng)被懸掛,有可能會發(fā)生如果應用沒有支持其他后臺服務或者任務。只是前臺定位服務計劃就是用于在程序在前臺的時候只需要的定位數(shù)據(jù)。你啟動定位支持從后臺模型選擇中的能力在xcode項目中(你同樣也能夠使它支持包括后臺模式 的key去設置定位的值)。
啟動模式不會阻住系統(tǒng)懸掛引用,但是它能夠告訴系統(tǒng)它可以喚醒應用當新的位置數(shù)據(jù)傳遞過里。所以,這個關鍵字嫩鞏固有效的讓應用在后臺運行去更新位置當他們發(fā)生的時候。
重點:建議盡量少用標準服務,或者使用重點位置地址服務替代。位置服務要求啟動用戶的iOS設備在radio硬件上。在硬件上繼續(xù)運行能夠消費一系列能量。如果你的應用不需要提供精確和吃持續(xù)的位置信息給用戶,最好是最小化使用位置服務。
關于怎么使用每個不同的位置服務在你的應用上,看:Location and Maps Programming Guide.

Playing and Recording Background Audio (播放和錄制后臺音頻)
一個應用持續(xù)播放或者錄制能夠注冊那些任務在后臺(甚至當應用在后臺運行)。在xcode項目上進行設置支持模式。你同樣能夠支持包括UIBackgroundModes 關鍵字在info.plist 文件中。應用可以播放音頻在后臺而不會靜音。
典型的后臺音頻引用包括:
(1)音樂播放應用
(2)音頻記錄應用
(3)應用支持音頻和在airPlay中重播
(4)VoIP 支持音頻和視頻在airPlay上。
當UIBackgroundModes 包括了audio的值,當程序進入后臺的時候,系統(tǒng)的媒體庫不會讓應用被懸掛。當程序播放音頻和視頻內容,應用將繼續(xù)運行到后臺。然而,如果錄制或者播放停止,系統(tǒng)就會懸掛程序。
你可以使用這些系統(tǒng)音頻庫區(qū)在后臺音頻內容工作和進程使用這些庫當庫沒有變化。因為你的應用不會被懸掛當播放媒體文件,調用正常處理當你的應用在后臺的時候。在你的回調中當你的只要提供數(shù)據(jù)給播放。例如,一個媒體音頻需要下載音樂流數(shù)據(jù)從服務器中或推送當前的音頻樣品到播放中。應用不應該執(zhí)行其他任何的無關任務和沒有關聯(lián)的的播放。
多余一個應用支持音頻,系統(tǒng)支持哪一個應用允許播放和音頻錄制在給定的時間。前臺應用同樣有權限操作音頻??赡懿恢挂粋€應用允許在后臺播放音頻,基于基礎配置決定每一個應用的音頻會話。你應該合適的皮遏制你的應用音頻回話和小心使用系統(tǒng)庫處理中斷和類型的音頻相關的通知。怎么配置音頻會話對象在后臺執(zhí)行。查看《Audio Session Programming Guide》

Implementing a VoIP App (是吸納VoIP應用)
語音網(wǎng)絡接口應用允許用于讓用戶去使用手機調用使用網(wǎng)絡連接體態(tài)設備中的窩蜂服務。例如已給應用需要支持持久的網(wǎng)絡連接到它關聯(lián)的服務中所以它能夠接收輸入的調用和其他關聯(lián)的數(shù)據(jù)。不是保持著VoIP應用的一直醒著,系統(tǒng)允許他們被懸掛并且提供場所去控制他們的sockets給他們。當輸入被檢測到,系統(tǒng)會喚醒VoIP應用去返回到socket控制它。
配置VoIP應用,需要以下操作:
(1)支持ViOP在后臺模式下博播放,需要在info.plist中設置UIBackgroundModes 關鍵字
(2)配置app套接字中對VoIP是可用的
(3)在移到后臺之前,調用setKeepAliveTimeout:handler: 這個方法去安裝一個處理去周期性執(zhí)行,你的應用能夠使用這個處理去支持它的服務連接。
(4)配置你的音頻會話去出里轉換和用戶啟動。
包括voip 值在UIBackgroundModes 關鍵字匯總讓系統(tǒng)知道它應該允許程序去運行在后臺當需要去管理網(wǎng)絡套接字的時候。帶有和這個key的應用也可以重新啟動在后臺當系統(tǒng)boot去確定VoIP 服務是有效的。
大多的VoIP也需喲啊去配置作為后臺音頻應用去傳遞音頻當在后臺的時候。所以,你應該包括音頻和voip值設置到UIBackgroundModes 關鍵字匯總。如果你沒有處理這個,你的應用不能夠播放或者記錄音頻當在后臺。對于更多信心關于 UIBackgroundModes key, see Information Property List Key Reference.
執(zhí)行信息關于步驟,你必須實現(xiàn)VoIP應用:see Tips for Developing a VoIP App.

Fetching Small Amounts of Content Opportunistically (取少量內容的機會)
應用需要周期性檢查好新內容然后請求系統(tǒng)去喚醒他們,所以他們能夠開始獲取操作內容。要啟動這個功能需要在info.plist 文件中進行設置。
啟動了這個模式不是一個保證,系統(tǒng)將會提供給你的應用一些時間去在后臺執(zhí)行。系統(tǒng)必須平衡你的應用需要去獲取應用需要的內容和系統(tǒng)本身。獲取到信息之后,系統(tǒng)給供給應用一些時間當他們有更好的機會去處理。當一個好的應用產(chǎn)生,系統(tǒng)會換新或者啟動你的應用到后臺并且調用應用代理
application:performFetchWithCompletionHandler: 這個方法。使用方法去檢查新的內容和開始下載操作。當你完成下載新內容,你必須執(zhí)行提供完成的處理塊,傳遞結果去只是內容是否合理。 執(zhí)行這個快去告訴系統(tǒng)它能夠移動你的應用到懸掛狀態(tài)并且評估它的電量的使用。應用下載小數(shù)目的內容很快,并且能夠快速響應當他們有內容下載合理的時候,更像是執(zhí)行時間在接下來花費很多時間去下載他們的內容或者聲明內容是有效的然后沒有下載內容。當下載內容,推薦使用NSURLSession類去初始化和管理你的下載。關于怎么使用使用這個類,管理上傳和下載任務。查看 URL Session Programming Guide

Using Push Notifications to Initiate a Download (使用通知去初始化下載)
如果服務器發(fā)送通知到用戶的設備當新的內容是有效的對于你的應用,你能夠循環(huán)系統(tǒng)去運行你的應用在后臺,所以,你能夠馬山開始下載新的內容。
后臺模式計劃去最小化消耗的時間流逝在當用戶看到通知和當用戶能夠展示內容之間。應用能夠典型地喚醒在粗略相同的花四濺,用戶看到通知當時仍然給你很多時間你可能有。支持后臺運行 ,需要在info.plist 中設置。
對于發(fā)送通知去觸發(fā)下載,通知的負載必須包括內容有效關鍵字和它的值是1.當關鍵字顯示,系統(tǒng)會喚醒后臺程序并且調用app delegte中的application:didReceiveRemoteNotification:fetchCompletionHandler: 方法。你應該下載相關的內容去集合到你的應用中。
當下載內容,推薦你使NSURLSession類去開始和管理下載。更多信息關于上傳和下載看: URL Session Programming Guide.

Downloading Newsstand Content in the Background (在后臺下載新的內容)
一個新聞報刊引用下載新的雜志或者報紙問題能夠注冊去執(zhí)行這些下載在后臺。你能夠支持newstands下載從后臺模式在你的xcode項目中設置。當你的key有的時候,系統(tǒng)啟動你的應用,如果沒有準備運行,這樣她能夠開始下載對于新的事件。當你使用Newstand kit 庫區(qū)開始一個下載。系統(tǒng)處理下載的進度對于你的應用。系統(tǒng)能夠繼續(xù)下載文件甚至如果你爹應用被懸掛或者終止。當下載操作完成,系統(tǒng)將你的文件傳輸?shù)缴澈兄胁⑶彝ㄖ愕膽?。如果應用沒有運行,通知喚醒應用給機會它進入新的下載文件。如果他們有錯誤在下載的過程中,你的應用類似喚醒處理他們。
newstand 可關注: see Newsstand Kit Framework Reference.

Communicating with an External Accessory 與外部附件通信
應用和外部附件通訊能夠喚醒如果需要傳輸更新的時候當應用被懸掛。支持重要的類型對于外圍設備傳送數(shù)據(jù)在已給有規(guī)律的間隔,例如心率控制。你能夠支持額外附件交流從后臺模式(需要在xcode中進行配置)。當你啟動這個模式,內外設備庫不會關閉活動的會話(ios 4之后,這些會話自動關閉當應用懸掛)。當新的數(shù)據(jù)從外圍設備中到來,庫會喚醒你的應用所以它能夠處理數(shù)據(jù)。系統(tǒng)也能夠喚醒應用去促進外圍設備的鏈接和斷開連接。
應用支持后臺外圍設備的更新必須跟蹤幾個基礎指導:
(1)應用必須提供一個界面允許用于去開始或者停止外圍更新事件的傳輸。這個接口應該打開或者關閉外圍設備會話。
(2)被喚醒,應用有大概10秒鐘事件去處理數(shù)據(jù)。確切的,它應該盡可能快的處理數(shù)據(jù)并且允許它本身被再次懸掛。然而,如果需要更多的事件就使用beginBackgroundTaskWithExpirationHandler: 這個方法(這種方式大概有150秒左右,由系統(tǒng)決定的)。

Communicating with a Bluetooth Accessory (和藍牙外圍設備進行交流)
應用在和藍牙外圍設備進行工作的時候,如果藍牙更新信息發(fā)過來,程序應該會被喚醒。這個支持對Bluetooth-LE在間斷時間傳遞數(shù)據(jù)很重要,例如:藍牙檢測心率等(可以在xcode的info.plist 中進行配置)。當你啟動這個模式,Core Bluetooth framework保持繪話響應外圍設備。額外的,新數(shù)據(jù)從外圍設備到達區(qū)喚醒陳旭,因此它能夠處理數(shù)據(jù)。系統(tǒng)也能夠喚醒應用去處理外圍設備的連接和斷開連接。在iOS 6 ,一個應用也能夠操作在外圍模式下和藍牙外圍設備。藍牙設備(在xocde的info.plist中進行設置),啟動和這個模式, Core Bluetooth framework 能剪短喚醒后臺程序處理接受的關聯(lián)請求。程序被喚醒應該處理這些時間然后盡可能的返回因為程序能夠被再次懸掛。任意應用支持后臺進程對于藍牙數(shù)據(jù)必須在會話基礎上遵循以下指導:
(1)應用必須提供一個界面允許用戶去開啟和停止藍牙傳輸事件。接口應該開啟和關閉會話在合適的時候。
(2)別喚醒,應用大概有10秒中去處理數(shù)據(jù)。確切的,它應該盡可能快的處理數(shù)據(jù)允許它自己被懸掛。然而,就如果需要更多時間就必須使用beginBackgroundTaskWithExpirationHandler: 方法去請求更多的時間。

Getting the User’s Attention While in the Background (在后臺獲取用戶的關注)
通知對于被懸掛的應用是一種方式,它是在后臺而不是運行當獲取到用戶的關注(提醒;通知)。應用能夠使用本地通知去展示警告,播放聲音,應用的icon微章或者三個綜合。例如:一個警告時鐘能夠用本地通知去播放警告聲音和顯示一個警告。當一個通知被傳遞給用戶,用戶必須決定返回前臺。(如果應用已經(jīng)在前臺運行,本地通知默認是傳遞給應用而不是用戶)
計劃的傳輸本地通知,創(chuàng)建一個UILocalNotificaiton對象,配置通知參數(shù)和觸發(fā)使用應用方法。本地通知對象信息包括信息傳遞(聲音,警告,badge)和時間(適當)在傳遞給它。UIApplication類方法提供了選擇去立即傳輸通知或者計劃時間。
下面真實了一個例子;
這個例子只是配置一個一次性鬧鐘并且取消以前的鬧鐘(你自己的應用不能夠有128個本地通知活動在一個時間和取消過去的鬧鐘在這個新的之前)。
鬧鐘自己包括了警告箱和一個聲音文件被播放如果一個應用不運行或者在后臺運行當警告開始。如果應用是活動的并且運行在前臺,app delegate application:didReceiveLocalNotification: 方法收到信息。

本地通知使用聲音文件有相同的請求當這些用在推送通知上。自定義聲音文件必須定位在應用main bundle和支持如下格式中的一個:Linear PCM, MA4, μ-Law, or a-Law.你可以指定 UILocalNotificationDefaultSoundName 常量指定去播放默認的警告信息對于設備。當通知被發(fā)送的聲音播放,系統(tǒng)也觸發(fā)顫動。你可以取消計劃的通知或者獲取通知列表使用應用類的方法。更多信息是關于這些方法,查看 UIApplication Class Reference。額外的信息配置本地通知,查看:Local and Remote Notification Programming Guide.

Understanding When Your App Gets Launched into the Background(明白程序從啟動到后臺)
程序支持后臺執(zhí)行可能會被啟動通過系統(tǒng)處理輸入事件。如果一個被終止由于已卸載原因而不是強迫退出,系統(tǒng)啟動應用當下面的一個事件發(fā)生。
(1)對于位置的應用
1)系統(tǒng)接收到一個位置更新(遇到程序配置標準對于傳遞)
2)設備進入或者退出一個注冊區(qū)域(預備是被位置地理化區(qū)域或者地理柵欄)
(2)對于音頻的而程序,音頻庫需要程序處理一些數(shù)據(jù)(音頻程序包括播放音頻和使用麥克分)
(3)藍牙應用
1)一個應用作為中間的角色獲取數(shù)據(jù)從連接的外圍設備上
2)一個外圍設備從中間設備中接收到命令。
(4)后臺下載應用
1)一個通知到達和通知的payload中的值是1(有用)
2)系統(tǒng)喚醒應用在一個隨機的時刻去開始下載新的內容。
3)對于使用NSURLSession類去下載內容,所有的任務連接到會話對象成功或者失敗。
4)一個下載的被初始化通過一個新聞報刊完成。
很多情況下,系統(tǒng)不會重新啟動在用戶強制退出。一個例外是位置應用,在iOS 8 或者之后被啟動在用戶強制退出的時候。其他案例,雖然,用戶必須顯示啟動程序或者重啟設備在應用被自動啟動進入后臺通過系統(tǒng)。當設備的密碼保護開啟,系統(tǒng)不會啟動一個應用在后臺當用戶第一個解鎖設備的時候。

Being a Responsible Background App (成為一個可靠的后臺應用)
前臺程序比后臺程序性使用硬件和系統(tǒng)資源的優(yōu)先權高,后臺運行的應用程序需要為這種差異做好準備,并在后臺運行時調整它們的行為.
尤其是程序移到后臺的時候需要遵循下面的指導:
(1)Do not make any OpenGL ES calls from your code. (不要有opengl處理調用的代碼)
在后臺的程序是不能夠創(chuàng)建EAGLContext 對象或者使用OpenGL ES繪畫的一些命令在后臺程序,應用調用這些命令立即會被殺掉。程序必須確定前面提到的這些命令被殺掉在進入后臺之前,關于如何處理當從進入后臺或者從后臺出來查看: Implementing a Multitasking-aware OpenGL ES Application in OpenGL ES Programming Guide for iOS (在直播的時候應該也是需要處理圖像的)
(2)Cancel any Bonjour-related services before being suspended. (移除bonjour的關聯(lián))
當你移到后臺程序時在被懸掛之前,需要移除bonjour的注冊和關閉socket鏈接網(wǎng)絡服務。一個懸掛的應用不能夠響應任何服務進來的請求。關閉這些服務阻住它們顯示是可用的當實際上是不可用的(也就是顯示和實際發(fā)生的錯亂)。如果你沒有關閉Bonjour服務,系統(tǒng)將會自動關閉當程序被懸掛的時候.
(3) Be prepared to handle connection failures in your network-based sockets. (準備好處理基于網(wǎng)絡套接字的連接故障)
系統(tǒng)可能會拆毀套接字的鏈接你的應用匯懸掛(由于一些原因),例如當一個丟失的信號或者網(wǎng)絡轉變,都可能造成不常見的問題。當你的應用重啟的時候,可能會遇到錯誤使用socket,簡單的方式就是重新連接。
(4)Save your app state before moving to the background. (保存程序的狀態(tài)在移到后臺程序之前)
在低內存中環(huán)境下,后臺程序可能會被清洗掉從空閑的地方。懸掛的程序首先會被清洗掉和在清洗掉之前沒有任何通知。結果,應用程序會使用ios6以及后面的系統(tǒng)版本去保存它們接口的裝填到硬盤上。關于怎么樣支持這個特點,查看:Preserving Your App’s Visual Appearance Across Launches.
(5)Remove strong references to unneeded objects when moving to the background。(移除沒有需要的強引用對象)
如果你的應用有大量的緩存對象(尤其是圖片),會移除所有的強引用緩存對象在移到后臺之前。更多信息查看:Reduce Your Memory Footprint
(6)Stop using shared system resources before being suspended (停止使用分享系統(tǒng)資源在懸掛之前)
與程序有交互的分享系統(tǒng)資源,例如: 相冊或者日歷數(shù)據(jù)庫應該停止使用這些資源在懸掛之前。這些資源的訪問權限都是前臺程序。當你的程序懸掛了,如果你的程序被發(fā)現(xiàn)在使用分享資源,就會被kill掉。
(7)
Avoid updating your windows and views. (避免更新你的windows
views
因為程序的window和views 是不可見的當你的程序在后臺,你應該免費更新他們。異常會出現(xiàn)當你需要更新window的內容和window的等級給程序鏡像。
(8)Respond to connect and disconnect notifications for external accessories (響應鏈接和不連接通知對于額外的附件)
當程序在和額外的資源交流的時候,系統(tǒng)自然發(fā)送一個斷開連接的通知當應用移到后臺的時候。應用必須注冊這個通知和使用它去關閉當前的附件回話。更多信息是處理附件連接和斷開通知。查看External Accessory Programming Topics.
(9)
Clean up resources for active alerts when moving to the background.
(清除資源對于激活的而警告當移到后臺)
為了保存上下文當交換程序的時候,系統(tǒng)沒有自動解除sheets(UIActionSheet) 或者alert 視圖(UIAlertView)但你的程序移到后臺。會提供一個寫清楚的行為權限去移到后臺。例如:你可能想取消action sheet或者alert view 或者保存足夠的上下文信息去存儲視圖(后來)【在這個用例中你的程序會被中斷】。
(10)Remove sensitive information from views before moving to the background. view上移除敏感信息
當程序轉化為后臺的時候,,系統(tǒng)會鏡像當前主要的window,會有簡單的系那是當程序返回到前臺。在返回你的applicationDidEnterBackground: 這個方法之前,你應該隱藏或者使密碼復雜化和其他敏感的個人細膩可能被獲取在鏡像的時候。
(11)**Do minimal work while running in the background. **(做一些最小的工作在后臺)
執(zhí)行時間對于后臺程序來說會有更多的限制對于前臺程序。程序花費很多時間去執(zhí)行在后臺可能被減速或者終止。

如果你的是后臺音頻程序,或者其他類型的程序允許運行在后臺,你的程序應該響應輸入信息在任何方式。換句話,系統(tǒng)可能通知你的程序低內存警告當他們發(fā)生的時候。系統(tǒng)需要去終止程序去釋放更多的內存,程序會調用它的代理方法applicationWillTerminate: 去執(zhí)行最后的任務在退出之前。

Opting Out of Background Execution (選擇退出后臺執(zhí)行)
如果你根本就不想程序在后臺執(zhí)行,直接明確在info.plist 文件中設置UIApplicationExitsOnSuspend (key)的值為yes;
當我們選擇了退出后臺執(zhí)行的這種設置,在not-running、inactive、active states 從來不會進入到后臺或者暫停或者懸掛狀態(tài)。
這個時候,當用戶點擊home鍵的退出應用時,applicationWillTerminate: (app delegate方法)被調用,應用大概有5s的時候去清除和退出再程序終止和移到?jīng)]有運行的狀態(tài)之前。
選擇退出后臺執(zhí)行不推薦使用,但是可能在特定條件下選擇。尤其是如果在后臺執(zhí)行中添加重要復雜的代碼,終止應用可能是一個解決方法。同樣,如果你的小號很多內存和不能夠很容易釋放,系統(tǒng)可能會殺掉當期的應用將空間讓給其他應用。所以,選擇終止而不是到后臺可能會產(chǎn)生相同的結果和保存你的開發(fā)和努力。
Information Property List Key Reference info.plist 設置

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容