默認情況下,普通的CoreBluetooth 任務中的大多數,無論是Central還是peripheral ,在后台或者掛起狀況下都是無法進行的。也就是說,你可以通過宣布你的應用程序支持后台處理模式來允許你的一個應用程序把你從一個掛起狀態中喚醒來執行某些藍牙相關的事件。
即使你的應用程序支持一種或者兩種CoreBluetooth后台執行模式,那么他也不會永遠運行。在某些時候,系統也許由於當前的前台應用程序而終止你的應用程序來釋放內存,這將會導致任何活躍的或者掛起的連接會丟失。在iOS7中,CoreBluetooth 支持為Central 和 Peripheral 儲存狀態信息並且在程序啟動的時候,恢復這些狀態信息。你可以使用這種技術來支持藍牙設備的長期運行。
-
- Foreground-only Apps
像大多數的iOS app一樣,如果你沒有請求執行后台任務的權限,那么在app 進入后台模式之后會立刻進入到掛起狀態。在掛起狀態時,你的app將不能執行藍牙相關的任務。在它恢復進入到前台模式之前,他也不會意識到並響應藍牙相關的事件
在Central端,沒有宣稱支持任何一種藍牙后台模式的只支持前台的APP當他在后台時,或者進入掛起狀態時,它都不能進行掃描,發現正在廣播的Peripheral設備的任務。在Peripheral端,廣播將會停止,並且任何Central嘗試訪問app已經發布的Service的動態Characteristic數據的時候,都會收到一個錯誤。
取決於用例,這些默認的行為將會在各方面影響你的app。舉個例子,想象你正在和你剛剛連接到的Peripheral上的數據進行交互。假設你的APP進入到了掛起狀態(可能原因,如用戶切換到了另一個app),如果連接到Peripheral的連接在你的APP掛起的時候丟失了,那么當你恢復到前台模式的時候你講不會意識到任何斷開連接的事件發生。
-
- Take advantage of Peripheral Connection Options
當前台app進入到掛起狀態時候發生的所有的藍牙相關的事件都會被系統放到隊列中,當APP回到前台的時候傳遞給APP。也就是說,當某個Central 事件發生的時候,Core Bluetooth 提供了一種提醒用戶的方式。 用戶可以使用這些警告來決定是否要將應用程序帶回到前台。
你可以使用這些alerts,通過CBCentralManager在調用 connectionperipheral:options方法連接CBPeripheral的時候傳入以下參數:
-
-
- CBConnectionPeripheralOptionNotifyOnConnectionKey---當你想要你的系統在掛起狀態時候,正好有一個連接成功執行,系統拋出一個連接警告
- CBConnectionPeripheralOptionNotifyOnDisconnectKey---當你想要你的系統在你的APP掛起狀態收到任何斷開連接事件的時候拋出一個斷開連接警告
- CBConnectionPeripheralOptionNotifyOnNotifycationKey---當你想要你的系統在你的APP處於掛起狀態時候,收到的任何notification都爆出一個警告的時候使用
- Core Bluetooth Background Execution Modes
-
如果你的APP需要在后台運行執行某些藍牙相關的任務,那么它必須宣布他支持一種藍牙后台執行模式在它的Info.plist文件中。當你的app宣稱這個之后,系統將會把它從掛起狀態中喚醒來處理藍牙相關的事件。這種支持對那些與BLE設備按照固定的時間間隔來交互的app來說是十分重要的,比如一個心率監測器。
一個app可以支持的藍牙后台運行模式有兩種,一種是給實現了Central角色的app,另一種是給實現了Peripheral角色的appl.如果你的app兩者都實現了,那么它也可以宣布它支持兩種藍牙后台執行模式。藍牙后台模式可以通過在Info.plist添加UIBackgroundModes key,鍵值設置為一個包含以下字符串的數組:
-
-
- bluetooth-central,
- bluetooth-peripheral
- The bluetooth-Central Background Execution Mode
-
該模式下允許你的APP在后台執行某些藍牙相關的工作。在后台也可以掃描連接到Peripheral,發現並且和Peripheral數據進行交互。除此之外當有任何CBCenralManagerDelegate 和CBPeripheralDelegate方法被調用的時候系統將會喚醒你的APP。
但是值得注意的是,scan 在前台和后台兩種模式下是不一樣的。在后台模式下的scan:
-
-
- CBCenralManagerScanOptionAllowDuplicatsKey 會被匯率,一個advertsing Peripheral 被兩次發現那么也只會合並成一個發現事件
- 如果所有掃描peripheral的程序都運行在后台,那么發現Peripheral的時間間隔就會增加。
- The bluetooth-Peripheral Background Execution Mode
-
該模式下系統會喚醒你的APP來處理read,write,subscription事件。后台模式下也允許你的APP進行廣播。但是后台廣播不同於前台:
-
-
- CBAdvertisementDataLocalNameKey 會被忽略,並且Peripheral的local name 不會被廣播
- 所有包含在CBAdvertismentDataServiceUUIDsKey 中的Services UUIDs 將會被放在overflow”區域;他們只被那些明確的掃描他們的設備發現。
- 如果所有廣播的APP都在后台,那么發送廣播的頻率將會降低
- Use Background Execution Modes Wisely
-
后台模式很有用,但是請你慎用,因為后台模式要經常使用無線電,這是很費電的。 需要遵循以下幾條規范:
-
-
- app 應該基於會話,並且提供界面給用戶,允許他們控制開關藍牙相關的事件
- app 被喚醒后有10秒鍾處理事件,保證盡可能快,以便再次切換到掛起狀態。在后台中花費太多的時間將會被系統拒絕或者殺掉。
- 被喚醒后APP不要執行與喚醒原因無關的事情
-
