didReadRSSI llamó a iOS pero no a OS X

Estoy intentando escribir un cliente OS X que pueda get actualizaciones frecuentes sobre el valor RSSI para periféricos bluetooth.

Mi aplicación cliente está encontrando mi dispositivo iPhone en el que estoy ejecutando una aplicación de testing que publicita services de bluetooth. La aplicación cliente tiene un timer que hace que un peripheral.readRSSI() se ejecute cada 3 segundos.

No estoy teniendo éxito para que se llamase didReadRSSI cuando se ejecuta en OS X, pero cuando ejecuto exactamente el mismo código Swift en iOS funciona bien.

En iOS 9.3: didReadRSSI recibe llamadas como se esperaba con valores RSSI válidos.

En OS X 10.11.4 – didReadRSSI nunca se llama.

Estoy ejecutando el siguiente código Swift exactamente igual en iOS y OS X:

 import Foundation import CoreBluetooth class SampleClient:NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { var manager: CBCentralManager! var peripheral: CBPeripheral! var characteristic: CBCharacteristic! var readRSSITimer: NSTimer! override init() { super.init() self.manager = CBCentralManager(delegate: self, queue: nil) } func centralManagerDidUpdateState(central: CBCentralManager) { if self.manager.state == .PowenetworkingOn { self.manager.scanForPeripheralsWithServices(nil, options: nil) } } func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) { if let name = peripheral.name { print(name) self.peripheral = peripheral self.manager.connectPeripheral(self.peripheral, options: [CBConnectPeripheralOptionNotifyOnDisconnectionKey : true]) } } func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { peripheral.readRSSI() self.startReadRSSI() peripheral.delegate = self peripheral.discoverServices(nil) } func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) { self.stopReadRSSI() if self.peripheral != nil { self.peripheral.delegate = nil self.peripheral = nil } } func centralManager(central: CBCentralManager, didFailToConnectPeripheral aPeripheral: CBPeripheral, error: NSError?) { if self.peripheral != nil { self.peripheral.delegate = nil self.peripheral = nil } } func disconnect() { if self.characteristic != nil { self.peripheral.setNotifyValue(false, forCharacteristic: self.characteristic) } if self.peripheral != nil { self.manager.cancelPeripheralConnection(self.peripheral) } } func stopScan() { self.manager.stopScan() } func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) { for service: CBService in peripheral.services! { peripheral.discoverCharacteristics(nil, forService: service) } } func peripheral(peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: NSError?) { print("RSSI = \(RSSI)") } func readRSSI() { if (self.peripheral != nil) { self.peripheral.delegate = self print("RSSI Request - \(peripheral.name!)") self.peripheral.readRSSI() } else { print("peripheral = nil") } } func startReadRSSI() { if self.readRSSITimer == nil { self.readRSSITimer = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: #selector(SampleClient.readRSSI), userInfo: nil, repeats: true) } } func stopReadRSSI() { if (self.readRSSITimer != nil) { self.readRSSITimer.invalidate() self.readRSSITimer = nil } } } 

La salida cuando se ejecuta en iOS es:

 iPhone RSSI = -38 RSSI Request - iPhone RSSI = -44 RSSI Request - iPhone RSSI = -45 

El resultado cuando se ejecuta en OS X es:

 My iPhone 6 RSSI Request - My iPhone 6 RSSI Request - My iPhone 6 

Tenga en count que los nombres de periféricos devueltos son diferentes en las dos plataforms. No sé si eso es significativo.

¿Cómo hago que se llame a readReadRSSI en OS X?

OSX usa el estilo anterior, agregue esto a su class para el comportamiento esperado.

 func peripheralDidUpdateRSSI(peripheral: CBPeripheral!, error: NSError!) { print("peripheralDidUpdateRSSI \(peripheral.name!) = \(peripheral.RSSI)") }