はじめに
初投稿です。
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側がサポートされるのが楽しみですね。