Dispositivos Bluetooth cercanos usando Swift 3.0

Estoy buscando una manera de progtwigr una list de dispositivos Bluetooth cercanos (detectables) que encuentre mi dispositivo. No he podido encontrar ninguna información o tutoriales sobre la realización de esta llamada en Swift 3.0. Esta publicación de control de calidad trata de encontrar estos dispositivos utilizando Swift 1.0 y comstackr en Xcode 6, en lugar de la última versión 8.

Hice mi mejor esfuerzo para tratar de hacer que mi código en la Sintaxis 3.0 del 1.0, pero mientras se ejecuta el siguiente código, no se devuelve nada en el Patio de juegos:

import Cocoa import IOBluetooth import PlaygroundSupport class BlueDelegate : IOBluetoothDeviceInquiryDelegate { func deviceInquiryComplete(_ sender: IOBluetoothDeviceInquiry, error: IOReturn, aborted: Bool) { aborted print("called") let devices = sender.foundDevices() for device : Any? in devices! { if let thingy = device as? IOBluetoothDevice { thingy.getAddress() } } } } var delegate = BlueDelegate() var inquiry = IOBluetoothDeviceInquiry(delegate: delegate) inquiry?.start() PlaygroundPage.current.needsIndefiniteExecution = true 

Usando IOBluetooth la forma correcta

El siguiente código funciona impecablemente en Xcode Versión 8.2.1 (8C1002), Swift 3.0. Hay algunas líneas que no son necesarias, como todo el método de deviceInquiryStarted .

Actualización: estos usos siguen funcionando a partir de Xcode 9.0 (9A235) y Swift 4.

Patio de recreo

 import Cocoa import IOBluetooth import PlaygroundSupport class BlueDelegate : IOBluetoothDeviceInquiryDelegate { func deviceInquiryStarted(_ sender: IOBluetoothDeviceInquiry) { print("Inquiry Started...") //optional, but can notify you when the inquiry has started. } func deviceInquiryDeviceFound(_ sender: IOBluetoothDeviceInquiry, device: IOBluetoothDevice) { print("\(device.addressString!)") } func deviceInquiryComplete(_ sender: IOBluetoothDeviceInquiry!, error: IOReturn, aborted: Bool) { //optional, but can notify you once the inquiry is completed. } } var delegate = BlueDelegate() var ibdi = IOBluetoothDeviceInquiry(delegate: delegate) ibdi?.updateNewDeviceNames = true ibdi?.start() PlaygroundPage.current.needsIndefiniteExecution = true 

Proyecto-Uso de la aplicación

 import Cocoa import IOBluetooth import ... class BlueDelegate : IOBluetoothDeviceInquiryDelegate { func deviceInquiryStarted(_ sender: IOBluetoothDeviceInquiry) { print("Inquiry Started...") } func deviceInquiryDeviceFound(_ sender: IOBluetoothDeviceInquiry, device: IOBluetoothDevice) { print("\(device.addressString!)") } } //other classes here: //reference the following outside of any class: var delegate = BlueDelegate() var ibdi = IOBluetoothDeviceInquiry(delegate: delegate) //refer to these specifically inside of any class: ibdi?.updateNewDeviceNames = true ibdi?.start() //recommended under after an action-button press. 

Explicación

El problema al que originalmente me enfrentaba era tratar de acceder a la información ya que la investigación todavía estaba en process.

Cuando accedí a él, en muchas ocasiones diferentes, mi zona de juegos se bloqueaba y me veían obligados a forzar a salir tanto del Xcode.app como del com.apple.CoreSimulator.CoreSimulatorService del Monitor de actividad. Me llevo a creer que esto solo fue un error de Playground, solo para saber que mi aplicación se bloquearía una vez que la investigación terminara.

Como indica la API de reference de Apple:

Nota importante: NO realice requestes de nombres remotos en dispositivos desde methods delegates o mientras este object esté en uso. Si desea realizar sus propias requestes de nombres remotos en dispositivos, hágalas después de haber detenido este object. Si no hace caso a esta advertencia, podría potencialmente estancar su process.

Lo que explica completamente mi problema. En lugar de preguntar directamente por la información de IOBluetoothDevice desde el método sender.foundDevices() (que creo que no pudo haber estado actualizando …), simplemente utilicé los parameters incorporados a la function para mencionar que efectivamente era un object IOBluetoothDevice , y simplemente para solicitar que se imprima esa información.

Nota final

Espero que este Q / A que he creado ayuda a otros que lo necesitan al usar IOBluetooth en Swift. La falta de tutoriales y las altas cantidades de código obsoleto, Objective-C hicieron que encontrar esta información fuera un desafío. Me gustaría agradecer a @RobNapier por el apoyo en tratar de encontrar la respuesta a este acertijo al principio. También me gustaría agradecer a NotMyName por la respuesta en mi publicación en los foros de desarrolladores de Apple.

¡Voy a explorar el uso de esto en un dispositivo iOS más pronto que tarde!