从CBCentralManagerDelegate回调以在IOS8上检索CBPeripheral

时间:2014-08-11 10:13:50

标签: ios objective-c swift bluetooth-lowenergy core-bluetooth

我有一个管理BTLE通信的BluetoothManager类。我可以扫描并连接到CBPeripheral并发现服务或特征。我有来自CBCentralManagerDelegate和CBPeripheralDelegate

的良好回调

当我连接到CBPeripheral时,我在CoreData中保存UUIDS字符串以在我重新启动应用程序时检索此外围设备。

这是我在重新启动应用程序时检索外围设备的Swift代码:

func retrievePeripheralsWithIdentifiers(identifiers: [AnyObject]!){
    let data = self.centralManager.retrievePeripheralsWithIdentifiers(identifiers)

    println("Data retrieved: \(data)")

    for peripheral in data as [CBPeripheral] {

        println("Peripheral : \(peripheral)")
        peripheral.delegate = self
        centralManager.connectPeripheral(peripheral, options: nil)
    }
}

这就是我所拥有的:

Data retrieved: [<CBPeripheral: 0x1669fcd0, identifier = XXXXX, name = Peripheral1, state = disconnected>]
Peripheral : <CBPeripheral: 0x1669fcd0, identifier = XXXXX, name = Peripheral1, state = disconnected>

我可以找到一个没有任何问题的外围设备。但是,当我拨打电话&#34; centralManager.connectPeripheral(peripheral,options:nil)&#34;时,我没有任何回复。

这些方法

func centralManager(central: CBCentralManager!, didRetrievePeripherals peripherals: [AnyObject]!)
func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!)
func centralManager(central: CBCentralManager!, didFailToConnectPeripheral peripheral: CBPeripheral!, error: NSError!)

没有回电让我知道什么是错的。所以我可以找到好的外围设备,但我无法连接它。

但是,当我扫描并且它工作时,我有相同的代码连接到某些外围设备;我自己的CBCentralManager也有一个好的代表和我的外围设备。

我做错了什么?

我使用iPod-Touch iOS8-Beta5使用Xcode-Beta5。

谢谢,

修改

好的,这更奇怪

我尝试使用iOS7及其上的旧应用程序中的以下代码Objective-C,我在连接时保存了UUIDS字符串,并尝试检索外围设备。效果很好: NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

if ([defaults objectForKey:@"UUIDString"]) {
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:[defaults objectForKey:@"UUIDString"]];
    NSArray * data = [self.centralManager retrievePeripheralsWithIdentifiers:@[uuid]];

    if ( [data count] > 0 ){
        self.currentPeripheral = [data objectAtIndex:0];
        [self.currentPeripheral setDelegate:self];

        [self.centralManager connectPeripheral:self.currentPeripheral options:nil];
    }
} else {

    NSLog(@"Scanning started");
    /*...*/
}

这与iOS8和我的新应用程序中的代码相同夫特:

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey("UUIDString") != nil {

        let uuid = NSUUID(UUIDString: userDefaults.objectForKey("UUIDString") as String)
        let data = self.centralManager.retrievePeripheralsWithIdentifiers([uuid]) as [CBPeripheral]

        if data.count > 0 {

            self.currentPeripheral = data[0]

            println("Current peripheral \(self.currentPeripheral)")
            self.currentPeripheral!.delegate = self
            self.centralManager.connectPeripheral(self.currentPeripheral!, options: nil)
        }
    } else {

        println("Start Scanning")
        /*...*/
    }

我在iPod Touch iOS7上试用我的旧应用程序,效果很好。 我在iPod Touch iOS8上试用我的旧应用程序,它的工作原理也很好。 我在iPod Touch iOS8上试用了我的新应用,但它无法正常工作。

我没有发现两个代码之间有任何差异。我可以扫描,发现和连接外围设备,但连接到检索到的外围设备似乎无法在iOS8&amp;迅速的。

4 个答案:

答案 0 :(得分:7)

在原始示例中,您似乎没有保存CBPeripheral的本地副本。

来自CBCentralManager Class Reference - connectPeripheral

  

当取消分配外围设备时,也会自动取消挂起连接尝试。

答案 1 :(得分:1)

请检查是否保存了CBPeripheral对象的本地副本。

完成回叫功能后,必须保存外设的本地副本以避免dealloc。

如果在调用didConnect外设回调之前外围对象解除分配,则核心蓝牙会自动取消挂起的连接请求。

答案 2 :(得分:0)

在我的情况下(iphone4s / ios8.2),我的问题是因为我尝试在控制器的viewDidLoad()中进行重新连接,但是将其移至viewDidAppear()修复它。

答案 3 :(得分:0)

即使有上次连接的外围设备的参考,我也遇到了问题。有效的技巧是首先通过调用使用标识符获取先前连接的外围设备

<块引用>

retrievePeripheralsWithIdentifiers

.

  • 现在连接它并尝试发现服务。然后放一个 NSTimer 和 等待 3-4 秒。
  • 在 didDiscoverServices 委托回调上。使计时器无效。
  • 现在,即使在 4 秒后也未发现服务,只需断开它并重新连接即可。
  • 这次肯定会发现服务。很长一段时间以来,我一直在使用这个技巧并且它对我有用。