iOS 未调用蓝牙委托连接功能
iOS Bluetooth delegate connect function not being called
我正在尝试监听所有蓝牙 connect/disconnect 事件。即使调用了委托的 centralManagerDidUpdateState
函数,当我连接或断开蓝牙设备时也没有任何反应。
我对出了什么问题感到困惑。我这样初始化 Central Manager/delegate:
var btDelegate: CBCentralManagerDelegate = BluetoothDelegate()
var btManager = CBCentralManager(delegate: btDelegate, queue: nil)
BluetoothDelegate 的定义如下:
import Foundation
import CoreBluetooth
class BluetoothDelegate : NSObject, CBCentralManagerDelegate {
func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
println("connect") //this line is not called
}
func centralManager(central: CBCentralManager!, didDisconnectPeripheral peripheral: CBPeripheral!, error: NSError!) {
println("disconnect") //this line is not called
}
func centralManagerDidUpdateState(central: CBCentralManager!) {
println("state update") //this line is called
}
}
注意:我可以连续接收更多状态更新事件,例如当我切换蓝牙时,即使没有调用连接和断开连接。
从你的代码看来你还没有开始扫描外围设备。一旦您通过 centralManagerDidUpdateState
方法确认您的中央处理器处于开机状态,您应该开始扫描您的外围设备。
(您从蓝牙设置面板连接的蓝牙设备无关紧要。您无法访问它们。(据我所知)如果您想扫描和自行找出您的设备,下面的代码会有所帮助)
func centralManagerDidUpdateState(central: CBCentralManager!) {
switch (central.state) {
case CBCentralManagerState.PoweredOff:
break
case CBCentralManagerState.PoweredOn:
startScan() // start scanning once the bluetooth is On
break
default:
break
}
}
而您的 startScan 方法将是(您可以提供服务 UUID,如果您想要全部,请使用 nil
)
func startScan(){
if let central = btManager {
central.scanForPeripheralsWithServices(nil, options: nil)
println("started Scanning")
}
}
之后,每当你发现一个外设时,didDiscoverPeripheral
方法将首先被调用。
func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
println(peripheral)
// btManager.connectPeripheral(peripheral, options: nil)
}
从那里收集外围设备,然后调用 CBCentralManager
的 connectPeripheral
方法。如果连接成功 didConnectPeripheral
方法将被调用。
您应该阅读 this documentation 以获得完整的详细信息
我正在尝试监听所有蓝牙 connect/disconnect 事件。即使调用了委托的 centralManagerDidUpdateState
函数,当我连接或断开蓝牙设备时也没有任何反应。
我对出了什么问题感到困惑。我这样初始化 Central Manager/delegate:
var btDelegate: CBCentralManagerDelegate = BluetoothDelegate()
var btManager = CBCentralManager(delegate: btDelegate, queue: nil)
BluetoothDelegate 的定义如下:
import Foundation
import CoreBluetooth
class BluetoothDelegate : NSObject, CBCentralManagerDelegate {
func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
println("connect") //this line is not called
}
func centralManager(central: CBCentralManager!, didDisconnectPeripheral peripheral: CBPeripheral!, error: NSError!) {
println("disconnect") //this line is not called
}
func centralManagerDidUpdateState(central: CBCentralManager!) {
println("state update") //this line is called
}
}
注意:我可以连续接收更多状态更新事件,例如当我切换蓝牙时,即使没有调用连接和断开连接。
从你的代码看来你还没有开始扫描外围设备。一旦您通过 centralManagerDidUpdateState
方法确认您的中央处理器处于开机状态,您应该开始扫描您的外围设备。
(您从蓝牙设置面板连接的蓝牙设备无关紧要。您无法访问它们。(据我所知)如果您想扫描和自行找出您的设备,下面的代码会有所帮助)
func centralManagerDidUpdateState(central: CBCentralManager!) {
switch (central.state) {
case CBCentralManagerState.PoweredOff:
break
case CBCentralManagerState.PoweredOn:
startScan() // start scanning once the bluetooth is On
break
default:
break
}
}
而您的 startScan 方法将是(您可以提供服务 UUID,如果您想要全部,请使用 nil
)
func startScan(){
if let central = btManager {
central.scanForPeripheralsWithServices(nil, options: nil)
println("started Scanning")
}
}
之后,每当你发现一个外设时,didDiscoverPeripheral
方法将首先被调用。
func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
println(peripheral)
// btManager.connectPeripheral(peripheral, options: nil)
}
从那里收集外围设备,然后调用 CBCentralManager
的 connectPeripheral
方法。如果连接成功 didConnectPeripheral
方法将被调用。
您应该阅读 this documentation 以获得完整的详细信息