使用Swift 3.0附近的蓝牙设备

时间:2016-11-16 16:03:11

标签: ios swift macos bluetooth iobluetooth

我正在寻找一种以编程方式列出我的设备找到的任何附近蓝牙设备(可发现的)的方法。我无法在Swift 3.0中找到有关执行此调用的任何信息或教程。这个Q-A post讨论了使用Swift 1.0查找这些设备并使用Xcode 6构建,而不是最新的版本8.

我尽力尝试将代码从1.0开始编写3.0语法,但在运行以下代码时,Playground中没有返回任何内容:

i

1 个答案:

答案 0 :(得分:6)

以正确的方式使用IOBluetooth

以下代码在Xcode版本8.2.1(8C1002),Swift 3.0中完美运行。有几行不是必需的,例如deviceInquiryStarted的整个方法。

更新:从Xcode 9.2(9B55)和Swift 4开始,这些用法仍然有用。

游乐场

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

项目 - 应用程序使用

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.

说明

我最初面临的问题是尝试访问信息,因为调查仍在进行中。

当我访问它时,在很多不同的场合,我的游乐场会挂起,我将被迫强制退出活动监视器中的Xcode.app和com.apple.CoreSimulator.CoreSimulatorService。我让自己相信这只是一个Playground错误,只是为了得知我的应用程序在调查完成后会崩溃。

正如Apple的API Reference所述:

  

重要说明:请勿在委托方法或使用此对象时在设备上执行远程名称请求。如果您希望在设备上执行自己的远程名称请求,请在停止此对象后执行这些请求。如果你不注意这个警告,你可能会使你的过程陷入僵局。

这完全解释了我的问题。而不是直接询问IOBluetoothDevice方法中的sender.foundDevices()信息(我认为可能没有更新...?),我只是使用函数中内置的参数来提及它确实是{ {1}}对象,只是要求打印该信息。

最后的注释

我希望在Swift中使用IOBluetoothDevice时,我创建的此Q / A可以帮助其他有需要的人。缺乏任何教程和大量过时的Objective-C代码使得查找此信息非常具有挑战性。我要感谢@RobNapier在开始时试图找到这个谜语的答案的支持。我还要感谢NotMyName在Apple Developer论坛上post上的回复。

我将在iOS设备中更早地探索这种用法!