LoginSignup
3
2

More than 5 years have passed since last update.

RxBluetoothKit 5.0.0 (was 4.0.2) 変更点

Last updated at Posted at 2018-03-17

はじめに

初投稿です。

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2