从CBCentralManagerDelegate回调以在IOS8上检索CBPeripheral

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

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

这是我重新启动应用程序时检索外围设备的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,state = disconnected>

我可以找到我的一个外围没有任何问题.但是当我调用“centralManager.connectPeripheral(peripheral,options:nil)”这一行时,我没有任何回复.

这些方法

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

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

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

我究竟做错了什么?

我在Xcode-Beta5上使用iPod-Touch iOS8-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&迅速.

解决方法

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

CBCentralManager Class Reference – connectPeripheral

Pending connection attempts are also canceled automatically when peripheral is deallocated.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...