跟蹤用戶的位置
這里有幾種方式在后臺跟蹤用戶的位置,其中大部分都不會要求你的應用在后臺繼續運行。
- 位置重大改變(significant-change)服務(推薦)
- 前臺專用(Foreground-only)位置服務
- 后臺(Background)位置服務
位置重大改變服務強烈推薦給那些不需要高精度位置數據的應用。使用此服務,位置更新旨在用戶的位置重大改變的時候才發生;這樣,對于社交應用或者提供非關鍵相關位置信息的應用特別理想。如果更新發生時應用被掛起,系統會在后臺喚醒它來處理這個更新。如果應用啟動了這個服務然后終止,系統會在新位置可用的時候自動重啟這個應用。這個服務在iOS及更高版本中可用,并且它僅在包含有蜂窩無線電(cellular radio)的設備上可用。
前臺專用和后臺位置服務兩者都使用 Core Location標準位置服務來取得位置數據。唯一的區別是,如果應用被掛起,前臺專用位置服務停止傳遞更新,如果應用不支持其它后臺服務或任務它就會發生。前臺專用位置服務適用于只在前臺時需要位置數據的應用。
你在Xcode項目的Capabilities選項卡中的Background Modes部分啟用位置支持。(你也能通過設置應用的Info.plist文件的UIBackgroundModes鍵的值為location來啟用這個支持。)啟用這個模式不會阻止系統掛起應用,但是它告訴系統每當有新位置數據傳送的時候系統應該喚醒應用。這樣,這個有效的鍵讓應用在有位置更新發生時會在后臺處理它們。
重要:建議你謹慎地使用標準服務,或者使用位置重大改變服務來替代。位置服務要求積極shyingiOS設備的板載無線電硬件。持續運行這個硬件會消耗大量的電量。如果你的應用不需要向用戶提供精確且持續的位置信息,最好最小化使用位置服務。
關于如何在你的應用中使用每種不同的位置服務,參見Location and Maps Programming Guide。
播放和錄制后臺音頻
連續播放或錄制音頻的應用(甚至應用在后臺運行的時候)可以通過注冊以便在后臺執行這些任務。你可以在Xcode項目的Capabilities選項卡的Background Modes部分啟用支持。(你也能通過設置應用的Info.plist文件的UIBackgroundModes鍵的值為audio來啟用這個支持。)應用在后臺播放音頻內容必須是有聲內容而不能是靜音。
后臺音頻應用的典型例子包括:
- 音樂播放應用
- 音頻錄制應用
- 支持通過AirPlay播放音頻或視頻的應用
- VoIP應用
當UIBackgroundModes鍵包含了audio值,當相關應用進入后臺的時候系統的媒體框架自動地阻止它被掛起。只要應用在播放視頻內容或錄制音頻內容,應用就會在后臺持續運行。但是,如果錄制或播放停止,系統就掛起該應用。
你能使用任何系統的音頻框架來處理后臺音頻內容,并且使用這些框架的過程不變。(要通過AirPlay播放視頻,你能使用Media Player或AV Foundation框架來呈現你的視頻。)因為當播放媒體文件的時候應用不會被掛起,所以應用在后臺時可以正常地回調操作。在你的回調中,你只需要提供播放所需的數據即可。例如,流音頻應用將需用從它的服務器下載音樂流數據,并將當前音頻樣本推出以進行播放。應用不應該執行與播放無關的任何任務。
因為可能有多個應用支持音頻,系統會在任何一個給定時間決定哪個應用是被允許播放或錄制音頻的。前臺應用總是優先進行音頻操作。多個后臺應用被允許播放音頻的情況是有可能的,這樣只能基于每個應用音頻會話對象的配置來決定優先級。你應該總干事恰當地配置應用的音頻會話對象,并與系統框架一起小心地處理中斷以及其它類型的音頻相關通知。關于如何為后臺執行配置音頻會話對象的信息,參見Audio Session Programming Guide。
實現一個VoIP應用
互聯網音頻協議(VoIP)應用允許用戶使用一個互聯網連接代替設備的蜂窩服務來撥打電話。這樣的應用要求維持一個持續的與它的相關服務連接的網絡連接,以便它能接收到呼入電話以及其它相關的數據。比起全天候的保持VoIP應用清醒,系統允許它們被掛起并且對它們的sockets(套接字)提供監控會更好。當檢測到傳入流量是,系統喚醒VoIP應用并將sockets的控制權返還給它,
要配置VoIP應用,你必須做到下面幾步:
- 在Xcode項目的Capabilities選項卡的Background mode部分,啟用支持VoIP。(你也能通過在應用的Info.plist文件中包含值為voip 的UIBackgroundModes鍵來啟用支持。)
- 為VoIP使用配置一個應用的sockets。
- 在進入后臺之前,調用setKeepAliveTimeout:handler:方法來安裝一個需要定期執行的處理程序。應用使用這個處理程序來維持它的服務器連接。
- 配置你的音頻會話來處理來自活躍用途的收發轉換。
在UIBackgroundModes鍵中包含voip值,讓系統知道它將允許應用在后臺運行來管理它的網絡sockets。系統啟動后,擁有這個鍵的應用立即在后臺重啟,以確保VoIP服務始終可用。
大多數VoIP應用還需要被配置為后臺音頻應用,以便在后臺的時候可以傳遞音頻。因此,你應該在UIBackgroundModes鍵中包含audio和voip兩個值。如果不這樣做,應用不能在后臺的時候播放或錄制音頻。更多關于UIBackgroundModes鍵的信息,參見 Information Property List Key Reference。
關于實現一個VoIP應用必須要做的步驟的具體信息,參見Tips for Developing a VoIP App.。
有機會就獲取少量內容
需要周期性的檢查新內容的應用,可以請求系統喚醒它們,以便它們可以啟動一個該內容的獲取操作。為了支持這種模式,在Xcode項目的Capabilities選項卡的Background modes部分啟用Background fetch選項。(你也可以通過給應用的Info.plist文件的UIBackgroundModes鍵包含fetch值來啟用這項支持。)啟用了這項支持并不保證系統讓你隨時在后臺執行獲取操作。系統必須平衡應用的需要,以便根據其它應用和系統自身的需要來獲取內容。在評估信息后,當有好的機會時,系統就會給應用時間。
當好的機會出現的時候,系統在后臺喚醒或者重啟你的應用,并調用應用的application:performFetchWithCompletionHandler:委托方法。使用這個方法來檢查新內容,并在內容可用的時候啟動下載操作。一旦你完成新內容的下載,你必須執行提供的完成處理代碼塊(block),傳遞表示是否內容可用的結果。執行這個代碼塊,告訴系統它能將應用移回到掛起狀態,并評估電量的使用情況。那些快速下載少量內容、并準確反映何時有可供下載的內容的應用,與那些花很長時間下載它們的內容或者聲明內容可用但又不下載的應用相比,更有可能在將來得到更多的執行時間。
當下載任何內容時,推薦你使用NSURLSession類來啟動和管理你的下載。有關如何使用這個類來管理上傳和下載任務的信息,參見URL Session Programming Guide。
使用推送通知啟動下載
如果當新內容已經可用時,你的服務器發送推送通知到用戶的設備,你可以在后臺請求系統運行你的應用,以便它立即開始下載新的內容。這個后臺模式的目的是最小化用戶看到推送通知到應用能夠顯示相關內容之間經過的總時間。應用通常在用戶看到通知大致相同的時間被喚醒,但是它仍然會比其它可能的方式給你更多的時間。
為了支持這個后臺模式,在Xcode項目的Capabilities選項卡的 Background modes部分啟用Remote notifications選項。(你也可以通過設置Info.plist文件的UIBackgroundModes鍵包含remote-notification值來啟用這個支持。)
為了推送通知觸發一個下載操作,通知的有效載荷必須包含值為1的content-available鍵。當該鍵存在時,系統在后臺喚醒應用(或將其啟動到后臺)并調用應用委托的application:didReceiveRemoteNotification:fetchCompletionHandler:方法。執行這個方法下載相關的內容并將其融入到你的應用中。
當下載任何內容時,建議你使用NSURLSession類來啟動和管理你的下載。有關如何使用這個類來管理上傳和下載任務的信息,參見URL Session Programming Guide。
在后臺下載Newsstand內容
下載新發行雜志或報紙的Newsstand應用能在后臺注冊,用來執行這些下載。你在Xcode項目的Capabilities選項卡的Background modes部分啟用 newsstand downloads支持。(你也可以通過設置Info.plist文件的UIBackgroundModes鍵包含 newsstand-content值來啟用這個支持。)當此鍵存在的時候,系統啟動應用,如果它還沒有運行,以便它能開始下載新發行的。
當你使用 Newsstand Kit框架來開始一個下載,系統為你的應用處理下載過程。即便應用被掛起或者被終止,系統仍然會繼續下載這些文件。當下載操作完成的時候,系統會傳輸這個文件到你的應用沙盒,并通知你的應用。如果應用沒有運行,這個通知會喚醒它,并給它一個機會來處理新下載的文件。如果在下載過程中有錯誤,你的應用也會用類似的方式被喚醒處理。
關于如何使用Newsstand Kit 框架下載內容的信息,參見Newsstand Kit Framework Reference。
與外部配件通信
使用外部配件的應用,如果配件在應用被掛起的時候傳遞了一個更新,應用可以請求被喚醒。這個支持對于一些以固定時間間隔傳遞數據的配件類型特別重要,例如心率監測器。你在Xcode項目的Capabilities選項卡的Background modes部分啟用 external accessory communication支持。(你也可以通過設置Info.plist文件的UIBackgroundModes鍵包含 external-accessory 值來啟用這個支持。)當你啟用這個模式,外部配件模塊不能使用配件關閉活動會話。(在iOS4及更早版本,這些會話會在應用被掛起的時候自動關閉。)當新數據從配件到達的時候,這個框架喚醒你的應用以便它能處理此數據。系統也喚醒應用來處理配件連接并斷開通知。
任何支持配件更新后臺處理的應用,都必須遵循以下基本指南:
- 應用必須提供一個接口來允許用戶開始和停止配件更新事件的發送。這個接口應該能在合適的時候打開或者關閉配件會話。
- 被喚醒后,應用有大概10秒鐘來處理數據。理想情況下,它應該盡可能塊的處理數據,并允許自己被再次掛起。但是,如果需要更多的時間,應用可以使用beginBackgroundTaskWithExpirationHandler:方法來請求額外的時間;只有當絕對需要的時候才這樣做。
使用藍牙(Bluetooth)配件連接
使用藍牙外設的應用,如果當應用被掛起時外設傳遞一個更新,那么應用可以請求被喚醒。此支持對于在固定間隔傳遞數據的 Bluetooth-LE外設來說很重要,例如藍牙心率傳輸帶。你在Xcode項目的Capabilities選項卡的Background modes部分啟用 bluetooth accessories支持。(你也可以通過設置Info.plist文件的UIBackgroundModes鍵包含 bluetooth-central 值來啟用這個支持。)當你啟用此支持,Core Bluetooth框架會讓相應的外設的任何活動會話保持打開狀態。此外,從外設來的新數據使系統喚醒應用以便它處理這些數據。系統也喚醒應用來處理配件連接以及斷開通知。
在iOS 6,應用也能使用藍牙配件在外設模式下運行。為了如藍牙配件般行為,你必須在Xcode項目的Capabilities選項卡的Background modes部分啟用支持此模式。(你也可以通過設置Info.plist文件的UIBackgroundModes鍵包含 bluetooth-peripheral 值來啟用這個支持。)啟用這個模式讓 Core Bluetooth框架在后臺短暫地喚醒應用,以便它能處理配件相關的請求。為這些時間而被喚醒的應用應該處理它們,并盡可能快的返回以便它能在此被掛起。
任何支持后臺處理藍牙數據的應用,都必須基于會話,并遵循下面幾條基本的指導:
- 應用必須提供接口來允許應用開始及停止藍牙時間的傳送。這個接口應該在合適地時候打開或關閉會話。
- 被喚醒后,應用有大概10秒鐘來處理數據。理想情況下,它應該盡可能塊的處理數據,并允許自己被再次掛起。但是,如果需要更多的時間,應用可以使用beginBackgroundTaskWithExpirationHandler:方法來請求額外的時間;只有當絕對需要的時候才這樣做。
(未完待續......)