macOSでCoreBluetoothを使う際に注意しないといけないこと(Swift 3)

macOS

iOSと仕様が若干異なるので注意が必要。

CBCentralManagerにisScanningが無い

何故か無い。無いので自分で変数を用意して管理するしかない。

CBCentralManagerのdelegateの関数が呼ばれない

何故か初期化の際にdelegateを渡す必要があるみたい。 以下のようにするとdelegateの関数が呼ばれず動かない。

var centralManager = CBCentralManager()

override init() {
    super.init()
    centralManager.delegate = self //ここで渡しても呼ばれない
}

以下のようにイニシャライザでselfを渡すとちゃんと呼ばれる。

var centralManager:CBCentralManager!
override init() {
    super.init()
    centralManager = CBCentralManager(delegate: self, queue: nil)
}

didReadRSSIの関数が違う

以下のようにOSで処理を分けたりしないといけない。

#if os(OSX)
open func peripheralDidUpdateRSSI(_ peripheral: CBPeripheral, error: Error?) {
    if let orp = availableOrphe(peripheral: peripheral){
        orp.RSSI = peripheral.rssi!
        delegate?.didUpdateRSSI?(orphe: orp)
    }
}
#else
open func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?){
    if let orp = availableOrphe(peripheral: peripheral){
        orp.RSSI = RSSI
        delegate?.didUpdateRSSI?(orphe: orp)
        NotificationCenter.default.post(name: .OrpheDidUpdateRSSINotification, object: nil, userInfo: [OrpheDataUserInfoKey:orp])
    }
}
#endif
.