【iOS】BLEセントラルとしてバックグラウンドで動かすにはServiceUUIDの指定が必要

概要

iOSデバイスをCoreBluetoothを使用してBLEセントラルとしてバックグラウンドで動かすには、scanForPeripherals()でServiceUUIDの指定が必要

scanForPeripherals()でServiceUUIDにnilを指定すると、バックグラウンドではパケットをスキャンできない

環境

Xcode: 14.3

詳細

プロジェクトのCapabilityで「Background Modes」→「Uses Bluetooth LE accessories」をONにすることで、設定上、バックグラウンドでのBLE Centralの動作を可能にした。

サービスUUIDを指定

let services: [CBUUID] = [CBUUID(string: “0000")]
centralManager.scanForPeripherals(withServices: services, options: nil)

上記コードを実装し、バックグラウンドにした状態で、アドバタイズパケットに「ServiceUUID:0x0000」を付加してアドバタイズさせると、スキャンでひっかかった。

サービスUUIDを指定しない

centralManager.scanForPeripherals(withServices: nil, options: nil)

上記コードを実装し、バックグラウンドにした状態で、アドバタイズパケットに「ServiceUUID:0x0000」を付加してアドバタイズさせても、スキャンでひっかからなかった。

フォアグラウンドなら引っかかる。
アドバタイズパケットにServiceUUIDがないパケットもフォアグラウンドでは引っかかる。

そもそも

アドバタイズパケットにServiceUUIDが付加されていない場合、バックグラウンドでの通信は無理っぽい。

なぜこの仕様に?

CoreBluetoothでこの仕様になっているのは、電力消費を抑えるためっぽい。

スキャンは定常的に電力を消費するため、iOSとしてはできるだけ控えたい動作。

使用するサービスに絞ってスキャンを行うことで、最低限のスキャン動作に抑え、電力消費を抑えたい狙いがあるのでは?と考えられる。

コメント

タイトルとURLをコピーしました