iOS蓝牙委托连接功能未被调用

lak*_*ntu 8 bluetooth ios swift

我正在尝试收听所有蓝牙连接/断开事件.即使centralManagerDidUpdateState调用了委托的功能,当我连接或断开蓝牙设备时也没有任何反应.

我对于出了什么问题很困惑.我像这样初始化Central Manager/delegate:

var btDelegate: CBCentralManagerDelegate = BluetoothDelegate()
var btManager = CBCentralManager(delegate: btDelegate, queue: nil)
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我可以不断收到更多状态更新事件,例如我切换蓝牙时,即使没有调用连接和断开连接.

Pen*_*esh 6

从您的代码看来,您还没有开始扫描外围设备。一旦您从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
  }
}
Run Code Online (Sandbox Code Playgroud)

你的 startScan 方法将是(你可以提供服务 UUID,nil如果你想要全部使用)

func startScan(){
  if let central = btManager {
    central.scanForPeripheralsWithServices(nil, options: nil)
    println("started Scanning")
  }
}
Run Code Online (Sandbox Code Playgroud)

之后,每当您发现一个外围didDiscoverPeripheral方法时,都会首先调用它。

func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
  println(peripheral)
  // btManager.connectPeripheral(peripheral, options: nil)
}
Run Code Online (Sandbox Code Playgroud)

从那里,你收集的外围,然后调用connectPeripheral的方法CBCentralManager。如果连接成功,didConnectPeripheral方法将被调用。

您应该阅读此文档以获取完整的详细信息