Swift
RxSwift
BluetoothLE
swift4
RxBluetoothKit

RxBluetoothKit 5.0.0 (was 4.0.2) 変更点

はじめに

初投稿です。

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側がサポートされるのが楽しみですね。