Edited at

RxBluetoothKit 5.0.0 (was 4.0.2) 変更点

More than 1 year has passed since last update.


はじめに

初投稿です。

RxBluetoothKit のバージョンが5.0.0にアップデートされました。

その際,RxBluetoothKitに大きな変更がありましたので,動かせる程度の変更点をメモしておこうと思います。


RxBluetoothKit とは

RxSwiftのようなRx記法にて,Bluetooth (CoreBluetooth)の機能を扱うことが可能なライブラリです。

現在(2018/03/17, version 5.0.0)では,Central側のみサポートされています。


変更点 (4.0.2 -> 5.0.0)


Managerクラス名の変更

BluetoothManager -> CentralManager

// Before ver_4.0.2

private let state: BluetoothManager

// After ver_5.0.0
private let state: CentralManager

RxBluetoothKitで扱うCBCentralManagerに当たるクラスです。

クラス名が変更されました。対応としては,そのまま置換で問題ありません。


state名の変更

rx_state.asObservable() -> observeState().startWith(manager.state)

// Before ver_4.0.2

self.manager.rx_state.asObservable()
.subscribe(onNext: { [weak self] state in
/* 以下略 */

// After ver_5.0.0
self.manager.observeState().startWith(self.manager.state)
.subscribe(onNext: { [weak self] state in
/* 以下略 */

Bluetoothの接続状態をObservableで渡すことができる,Observable<BluetoothState>の名前が変更されました。

observeState()で取得し,新たに開始のメソッドを呼ぶ必要が出てきました。


接続メソッド名の変更

connect(_ peripheral: Peripheral) -> establishConnection(_ peripheral: Peripheral)

// Before ver_4.0.2

self.manager.connect(scannedPeripheral.peripheral)

// After ver_5.0.0
self.manager.establishConnection(scannedPeripheral.peripheral)

接続の際のメソッド名が変更されました。

返り値はObservable<Peripheral>で,変更はありません。


サービス発見メソッドの返り値の変更

discoverServices(_ serviceUUIDs: [CBUUID]?): Observable<[Service]> -> PrimitiveSequence<SingleTrait, [Service]>

// Before ver_4.0.2

peripheral.discoverServices(_ serviceUUIDs: [CBUUID]?) // return Observable<[Service]>

// After ver_5.0.0
peripheral.discoverServices(_ serviceUUIDs: [CBUUID]?) // return PrimitiveSequence<SingleTrait, [Service]>
peripheral.discoverServices(_ serviceUUIDs: [CBUUID]?).asObservable() // return Observable<[Service]>

接続後のPeripheralクラスからサービスを読み込む,.discoverServices()の返り値が変更されました。

これまでのObservable<[Service]>へは,.asObservable()の追加にて対応可能です。


書き込みメソッドの返り値の変更

writeValue(_ data: Data, for identifier: CharacteristicIdentifier,

type: CBCharacteristicWriteType): Observable<Charateristic> -> PrimitiveSequence<SingleTrait, Characteristic>

// Before ver_4.0.2

peripheral.writeValue(_ data: Data, for identifier: CharacteristicIdentifier,
type: CBCharacteristicWriteType) -> Observable<Characteristic>

// After ver_5.0.0
peripheral.writeValue(_ data: Data, for identifier: CharacteristicIdentifier,
type: CBCharacteristicWriteType) -> Single<Characteristic>
peripheral.writeValue(_ data: Data, for identifier: CharacteristicIdentifier,
type: CBCharacteristicWriteType).asObservable() -> Observable<Characteristic>

接続後のPeripheralクラスからデータを書き込む,.writeValue()の返り値が変更されました。

これまでのObservable<Characteristic>へは,.asObservable()の追加にて対応可能です。


読み込みメソッドの返り値の変更

Observable<Charateristic> -> PrimitiveSequence<SingleTrait, Characteristic>

// Before ver_4.0.2

characteristic.readValue() -> Observable<Characteristic>

// After ver_5.0.0
characteristic.readValue() -> Single<Characteristic>
characteristic.readValue().asObservable() -> Observable<Characteristic>

接続後のCharacteristicクラスからデータを読み込む,.readValue()の返り値が変更されました。

これまでのObservable<Characteristic>へは,.asObservable()の追加にて対応可能です。


値の変更を通知するメソッドの返り値の変更

setNotificationAndMonitorUpdates() -> observeValueUpdateAndSetNotification()

// Before ver_4.0.2

characteristic.setNotificationAndMonitorUpdates()
peripheral.setNotificationAndMonitorUpdates(for: characteristic)

// After ver_5.0.0
characteristic.observeValueUpdateAndSetNotification()
peripheral.observeValueUpdateAndSetNotification(for: characteristic)

Characteristicの値の変更を通知するメソッド名が変更されました。

返り値はObservable<Characteristic>で,変更はありません。


切断を通知するメソッド名の変更

monitorDisconnection(for: Peripheral) -> observeDisconnect(for: Peripheral)

// Before ver_4.0.2

self.manager.monitorDisconnection(for: Peripheral)

// After ver_5.0.0
self.manager.observeDisconnect(for: Peripheral)

Peripheralの切断を通知するメソッド名が変更されました。

返り値も変更されます。対応は下に分けました。


切断を通知するメソッドの返り値の変更

Observable<Peripheral> -> Observable<(Peripheral, DisconnectionReason?)>

// Before ver_4.0.2

self.manager.monitorDisconnection(for: Peripheral) // return Observable<Peripheral>

// After ver_5.0.0
self.manager.observeDisconnect(for: Peripheral) // Observable<(Peripheral, DisconnectionReason?)>
self.manager.observeDisconnect(for: Peripheral).map { $0.0 } // return Observable<Peripheral>

Peripheralの切断を通知するメソッドの返り値が変更されました。

返り値にError型のtypealias,DisconnectionReason?が追加されました。これまで通り不要であればmapしましょう。


切断メソッドの削除

cancelPeripheralConnection(_ peripheral: RxPeripheralType) -> (deleted)

// Before ver_4.0.2

self.manager.cancelPeripheralConnection(_ peripheral: Peripheral)

// After ver_5.0.0
// Removed

Peripheralを切断するメソッドが削除されました。

centralManager.cancelPeripheralConnection()commit履歴を追っていくと,Dispose時に実行されるようでした。

対応としては,CompositeDisposableなどで保持したものを,切断時にremove()する等で解決できます。


まとめ

個人的には,切断に関するメソッドが削除されたことで,大きく変更しなければならない部分が大きいのかな,と思います。

Peripheral側も(Rxではありませんが)サポートされているBlueCapも,メソッドを呼んで切断することはできなかったと思います(間違っていたらすみません)。

いずれにしても,RxBluetoothKitでPeripheral側がサポートされるのが楽しみですね。