我尽力尝试将我的代码从1.0开始编写3.0语法,但在运行以下代码时,Playground中没有返回任何内容:
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
解决方法
以下代码在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!,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所述:
Important Note: DO NOT perform remote name requests on devices from delegate methods or while this object is in use. If you wish to do your own remote name requests on devices,do them after you have stopped this object. If you do not heed this warning,you could potentially deadlock your process.
这完全解释了我的问题.而不是直接从sender.foundDevices()方法请求IOBluetoothDevice信息(我相信可能没有更新..?)我只是使用函数内置的参数来提及它确实是一个IOBluetoothDevice对象,而且只是要求打印这些信息.
最后的说明
我希望在Swift中使用IOBluetooth时,我创建的这个Q / A可以帮助其他有需要的人.缺乏任何教程和大量过时的Objective-C代码使得查找此信息非常具有挑战性.我要感谢@RobNapier在一开始就试图找到这个谜题的答案的支持.我还要感谢NotMyName在Apple Developer论坛上对我的post的回复.
我将在iOS设备中更早地探索这种用法!