CoreBluetooth CBPeripheralを発見する3つの方法

iOSのCoreBluetoothを使ってPeriphralに接続するには、Peripheralのインスタンス、CBPeripheralを取得する必要があります。 一般には、CBCentralManagerのscanForPeripheralを使用して、Advertisement Packetを送信しているPeripheralをスキャンする方法がとられます。 しかし、そのほかにもマイナーな方法があるので、紹介します。

CBCentralManager -scanForPeripheralWithServices: options:を使用して、周囲のPeripheralをスキャンする。

CBCentralManagerを使用してPeripheralに接続する際、よく使われる方法です。 Peripheralを発見すると、CBCentralManagerDelegateの- centralManager: didDiscoverPeripheral: advertisementData: RSSI:が呼び出されるので、このメソッドの引数からCBPeripheralを取得できます。詳細は割愛します。

CBCentralManager -retrievePeripheralsWithIdentifiers: を使用して、Identifierに対応したCBPeripheralを取得する。

以前接続したことがあるPeripheralのIdentifier(NSUUID)を指定して、CBPeripheralを取得します。該当するPeripheralがあれば、CBPeripheralのインスタンスが格納されたNSArrayが返されます。以前接続したことがあるCBPeripheralのIdentifierをNSUserDefaultsなどに保存しておき、次回接続する、などの使い方ができます。ただし、CBPeripheralのIdentifierは同じPeripheralでも、iOSデバイスごとに違うIdentifierを返すことに気をつけて下さい。iOSデバイスAでPeriphralから取得したUUIDを使用して、iOSデバイスBで使用する、といった使い方はできません。

CBCentralManager -retrieveConnectedPeripheralsWithServices: を使用して、すでにiOSデバイスに接続されているCBPeripheralを取得する。

iOSデバイスとすでに接続されているPeripheralを取得します。例えば、ほかのアプリがすでにPeripheralを探索し接続した状態では、上記のscanForPeripheralWithServices: options:を使用しても、デバイスを発見することができません。すでにCentral(iOSデバイス)と接続されているPeripheralは、Advertisement Packetを送信しない状態になっているためです。そこで、iOSのシステムに対して、すでに接続済みのデバイスで、指定したServiceを持っているデバイスがないか問い合わせを行います。該当するPeripheralがあれば、CBPeripheralのインスタンスが格納されたNSArrayが返されます。

特定の条件下にあるPeripheral(Apple Notification Center Service, Current Time ServiceをSubsclibeしているGATTCを持っている、等)は、iOSが自動的に接続を行ってしまうため、この方法をとる必要があります。