標籤:
預設情況下,普通的CoreBluetooth 任務中的大多數,無論是Central還是peripheral ,在後台或者掛起狀況下都是無法進行的。也就是說,你可以通過宣布你的應用程式支援幕後處理模式來允許你的一個應用程式把你從一個掛起狀態中喚醒來執行某些藍芽相關的事件。
即使你的應用程式支援一種或者兩種CoreBluetooth後台執行模式,那麼他也不會永遠運行。在某些時候,系統也許由於當前的前台應用程式而終止你的應用程式來釋放記憶體,這將會導致任何活躍的或者掛起的串連會丟失。在iOS7中,CoreBluetooth 支援為Central 和 Peripheral 儲存狀態資訊並且在程式啟動的時候,恢複這些狀態資訊。你可以使用這種技術來支援藍牙裝置的長期運行。
像大多數的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不要執行與喚醒原因無關的事情
原創翻譯:iOS 應用程式 藍芽後台運行