使用Swift 3.0附近的蓝牙设备

[英]Nearby Bluetooth devices using Swift 3.0


I'm looking for a way to programmatically list any nearby Bluetooth devices (discoverable) that my device finds. I have not been able to find any information or tutorials regarding performing this call in Swift 3.0. This Q-A post discusses finding these devices using Swift 1.0 and building in Xcode 6, rather than the latest version 8.

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

I did my best to try to make my code into the 3.0 Syntax from the 1.0, but while running the following code, nothing is returned in the Playground:

我尽力尝试将我的代码从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

1 个解决方案

#1


5  

Using IOBluetooth the Correct Way

The following code works flawlessly in Xcode Version 8.2.1 (8C1002), Swift 3.0. There are a few lines that aren't required, such as the entire method of deviceInquiryStarted.

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

Update: These usages still work as of Xcode 9.2 (9B55) and Swift 4.

更新:这些用法仍然适用于Xcode 9.2(9B55)和Swift 4。

Playground

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

Project-Application Usage

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.

Explanation

The issue I was originally faced with was trying to access the information as the inquiry was still in process.

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

When I accessed it, under many different occasions my playground would hang and I would be forced to force quit both Xcode.app, and com.apple.CoreSimulator.CoreSimulatorService from the Activity Monitor. I lead myself to believe that this was just a Playground bug, only to learn that my application would crash once the inquiry finished.

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

As Apple's API Reference states:

正如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.

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

Which entirely explained my issue. Rather than directly asking for the IOBluetoothDevice information from the sender.foundDevices() method (which I believe may not have been updating..?) I simply used the parameters built into the function to mention that it was indeed an IOBluetoothDevice object, and simply to ask for that information to be printed.

这完全解释了我的问题。而不是直接从sender.foundDevices()方法请求IOBluetoothDevice信息(我相信可能没有更新..?)我只是使用函数内置的参数来提及它确实是一个IOBluetoothDevice对象,而且只是要求打印这些信息。

Final Note

I hope that this Q/A I've created helps others in need when using IOBluetooth in Swift. The lack of any tutorials and the high amounts of outdated, Objective-C code made finding this information very challenging. I'd like to thank @RobNapier for the support on trying to find the answer to this riddle in the beginning. I'd also like to thank NotMyName for the reply on my post on the Apple Developer Forums.

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

I will be exploring the usage of this in an iOS device more sooner than later!

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

智能推荐

注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:http://www.silva-art.net/blog/2016/11/16/4ca87d5e13aea0838dc41b07e860cec4.html



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告