List devices that are in range of Bluetooth device in Swift

12,903

To tell a Playground that your code does something in the background, you have to import XCPlayground and call XCPSetExecutionShouldContinueIndefinitely().
This will keep the IOBluetoothDeviceInquiry alive in the Playground and allow it to call the delegate method when finished.

import Cocoa
import IOBluetooth
import XCPlayground

class BlueDelegate : IOBluetoothDeviceInquiryDelegate {
    func deviceInquiryComplete(sender: IOBluetoothDeviceInquiry, error: IOReturn, aborted: Bool) {
        aborted
        println("called")
        var devices = sender.foundDevices()
        for device : AnyObject in devices {
            if let thingy = device as? IOBluetoothDevice {
                thingy.getAddress()
            }
        }
    }
}

var delegate = BlueDelegate()
var inquiry = IOBluetoothDeviceInquiry(delegate: delegate)
inquiry.start()
XCPSetExecutionShouldContinueIndefinitely()

While the above approach works, I find it easier to create simple, traditional test projects for tasks that need concepts like async-code, delegation, ...

Share:
12,903
David Padbury
Author by

David Padbury

Builds strange little websites for money.

Updated on July 07, 2022

Comments

  • David Padbury
    David Padbury almost 2 years

    I have the following code in a Xcode 6 playground:

    import Cocoa
    import IOBluetooth
    
    class BlueDelegate : IOBluetoothDeviceInquiryDelegate {
        func deviceInquiryComplete(sender: IOBluetoothDeviceInquiry, error: IOReturn, aborted: Bool) {
            aborted
            var devices = sender.foundDevices()
            for device : AnyObject in devices {
                if let thingy = device as? IOBluetoothDevice {
                    thingy.getAddress()
                }
            }
        }
    }
    
    var inquiry = IOBluetoothDeviceInquiry(delegate: BlueDelegate())
    inquiry.start()
    

    I'm just getting started with Bluetooth under OSX, and all I currently would like is a list of devices in range.

    It doesn't seem to be calling my delegate method at all.

    I'm new to OSX development and Swift, so be gentle. :)

  • cocoseis
    cocoseis over 8 years
    How exactly would you do this using a "traditional test projects"?
  • Thomas Zoechling
    Thomas Zoechling over 8 years
    Just create a new Xcode project (instead of using a Playground). While using XCPSetExecutionShouldContinueIndefinitely works, a compiled executable (with a runloop and the ability to attach a debugger) is easier to handle when the test project evolves.
  • Dylan
    Dylan over 6 years
    You can find an updated Swift 4.0 answer here (stackoverflow.com/questions/40636726/…)