iOS蓝牙代理连接函数未被调用

7

我正在尝试监听所有蓝牙连接/断开事件。尽管调用了委托的centralManagerDidUpdateState函数,但当我连接或断开蓝牙设备时什么都不会发生。

我对出现的问题感到困惑。我是这样初始化中央管理器/委托的:

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
    }
}

注意:即使未调用连接和断开连接,我仍然可以持续接收更多的状态更新事件,例如当我切换蓝牙时。


我还不熟悉Swift在你有一个基类的引用但将派生类对象分配给它时的行为 - 因此,如果btDelegate应该是BluttoothDelegate类型而不是CBCentralManagerDelegate,我无法确定。但是,如果你没有其他答案,这是值得尝试的。 - Gruntcakes
我刚试了一下使用BluetoothDelegate代替CBCentralManagerDelegate,但行为并没有改变。但还是值得尝试的。感谢你的帮助! - pimlu
这是我们使用的类中的一个字段;我认为它从未超出作用域。虽然我不知道那是一个弱引用-但现在知道了,这很好。 - pimlu
你连接外设的位置在哪里?如何确定它们已经连接成功了? - shim
1
我们在蓝牙设置面板中进行了配对。需要注意的重要事项是,我们试图对连接事件本身做出反应,而不是扫描/通信。 - pimlu
它们不是nil,因为即使没有连接和断开连接,我们仍然可以继续接收状态更新事件。原来iOS有一个单独的概念,即与您的应用程序“本地”连接,而连接/断开连接仅在本地连接时调用。但我不确定如何监听蓝牙配对本身,这是目标。 - pimlu
1个回答

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
  }
}

你的 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)
}

从那里开始,您收集外围设备,然后调用CBCentralManagerconnectPeripheral方法。如果连接成功,则会调用didConnectPeripheral方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接