如何在 OSX 应用程序中使用 Core Bluetooth?
How to use Core Bluetooth in an OSX app?
我尝试在我目前正在开发的 OS X 应用程序中使用核心蓝牙框架,这实际上会将您的 Mac 连接到您的 iphone 以通过蓝牙 LE 执行不同的操作.
问题是,当我简单地初始化 CBCentralManager 和它的委托方法时,我得到了一个奇怪的错误:
Undefined symbols for architecture x86_64:
"_CBAdvertisementDataLocalNameKey", referenced from:
__TFC5test311AppDelegate14centralManagerfS0_FTGSQCSo16CBCentralManager_21didDiscoverPeripheralGSQCSo12CBPeripheral_17advertisementDataGSQGVSs10DictionaryCSo8NSObjectPSs9AnyObject___4RSSIGSQCSo8NSNumber__T_ in AppDelegate.o
"_OBJC_CLASS_$_CBCentralManager", referenced from:
__TMaCSo16CBCentralManager in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
下面是我的代码:
import Cocoa
import CoreBluetooth
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, CBCentralManagerDelegate {
@IBOutlet weak var window: NSWindow!
var centralManager: CBCentralManager!
func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
var localName: String = advertisementData[CBAdvertisementDataLocalNameKey] as String
if (countElements(localName) > 0) {
println("Found Mac: \(localName)")
self.centralManager.stopScan()
} else {
println("Not Found")
}
}
func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
println("1")
}
func centralManager(central: CBCentralManager!, didDisconnectPeripheral peripheral: CBPeripheral!, error: NSError!) {
println("2")
}
func centralManagerDidUpdateState(central: CBCentralManager!) {
switch (central.state) {
case .PoweredOff:
println("Powered Off")
case .PoweredOn:
println("Powered On")
self.centralManager.scanForPeripheralsWithServices(nil, options: nil)
case .Unauthorized:
println("Unauthorized")
case .Unknown:
println("Unknown")
case .Unsupported:
println("Unsupported")
default:
println("Default")
}
}
func applicationDidFinishLaunching(aNotification: NSNotification) {
self.centralManager = CBCentralManager(delegate: nil, queue: nil)
// Insert code here to initialize your application
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
}
我不确定为什么会出现该错误,或者我做错了什么
我能想到两个原因。
您尚未将 CoreBluetooth 添加为链接框架。
您正试图在模拟器中 运行 您的代码。然而,模拟器没有可以使用的蓝牙设备。因此,您必须 运行 设备上的所有蓝牙代码。我有 运行 一些关于如何使用蓝牙加密狗并让它与模拟器一起工作的教程,但我从未成功过。
我还注意到您还没有设置 CBCentralManager 的委托。
self.centralManager = CBCentralManager(delegate: nil, queue: nil)
那一行不应该是,
self.centralManager = CBCentralManager(delegate: self, queue: nil)
我在 MacOS 10.13 上遇到了同样的错误,
- 我首先将 隐私 - 蓝牙外设使用说明 添加到 info.plist。
- 接下来我发现必须在项目设置 -> 目标(你的应用程序) -> 功能 -> 应用程序沙盒 -> 蓝牙中进行检查。
Check Bluetooth
我尝试在我目前正在开发的 OS X 应用程序中使用核心蓝牙框架,这实际上会将您的 Mac 连接到您的 iphone 以通过蓝牙 LE 执行不同的操作.
问题是,当我简单地初始化 CBCentralManager 和它的委托方法时,我得到了一个奇怪的错误:
Undefined symbols for architecture x86_64:
"_CBAdvertisementDataLocalNameKey", referenced from:
__TFC5test311AppDelegate14centralManagerfS0_FTGSQCSo16CBCentralManager_21didDiscoverPeripheralGSQCSo12CBPeripheral_17advertisementDataGSQGVSs10DictionaryCSo8NSObjectPSs9AnyObject___4RSSIGSQCSo8NSNumber__T_ in AppDelegate.o
"_OBJC_CLASS_$_CBCentralManager", referenced from:
__TMaCSo16CBCentralManager in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
下面是我的代码:
import Cocoa
import CoreBluetooth
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, CBCentralManagerDelegate {
@IBOutlet weak var window: NSWindow!
var centralManager: CBCentralManager!
func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
var localName: String = advertisementData[CBAdvertisementDataLocalNameKey] as String
if (countElements(localName) > 0) {
println("Found Mac: \(localName)")
self.centralManager.stopScan()
} else {
println("Not Found")
}
}
func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
println("1")
}
func centralManager(central: CBCentralManager!, didDisconnectPeripheral peripheral: CBPeripheral!, error: NSError!) {
println("2")
}
func centralManagerDidUpdateState(central: CBCentralManager!) {
switch (central.state) {
case .PoweredOff:
println("Powered Off")
case .PoweredOn:
println("Powered On")
self.centralManager.scanForPeripheralsWithServices(nil, options: nil)
case .Unauthorized:
println("Unauthorized")
case .Unknown:
println("Unknown")
case .Unsupported:
println("Unsupported")
default:
println("Default")
}
}
func applicationDidFinishLaunching(aNotification: NSNotification) {
self.centralManager = CBCentralManager(delegate: nil, queue: nil)
// Insert code here to initialize your application
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
}
我不确定为什么会出现该错误,或者我做错了什么
我能想到两个原因。
您尚未将 CoreBluetooth 添加为链接框架。
您正试图在模拟器中 运行 您的代码。然而,模拟器没有可以使用的蓝牙设备。因此,您必须 运行 设备上的所有蓝牙代码。我有 运行 一些关于如何使用蓝牙加密狗并让它与模拟器一起工作的教程,但我从未成功过。
我还注意到您还没有设置 CBCentralManager 的委托。
self.centralManager = CBCentralManager(delegate: nil, queue: nil)
那一行不应该是,
self.centralManager = CBCentralManager(delegate: self, queue: nil)
我在 MacOS 10.13 上遇到了同样的错误,
- 我首先将 隐私 - 蓝牙外设使用说明 添加到 info.plist。
- 接下来我发现必须在项目设置 -> 目标(你的应用程序) -> 功能 -> 应用程序沙盒 -> 蓝牙中进行检查。
Check Bluetooth