概要
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としてはできるだけ控えたい動作。
使用するサービスに絞ってスキャンを行うことで、最低限のスキャン動作に抑え、電力消費を抑えたい狙いがあるのでは?と考えられる。
コメント