ios - 从 CBCentralManagerDelegate 回调以在 IOS8 上检索 CBPeripheral

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

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

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

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

我可以毫无问题地找到我的外围设备之一。但是当我调用“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 有一个很好的委托(delegate)和我的外围设备。

我做错了什么?

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

谢谢,

编辑

好吧,那更奇怪

我在 iOS7 和 Objective-C 上尝试使用我的旧应用程序中的以下代码,我在连接时保存了 UUIDString,并尝试检索外围设备。它运作良好: 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 和 Swift 上的新应用程序中的代码相同:

    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 和 Swift 上运行。

最佳答案

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

来自CBCentralManager Class Reference - connectPeripheral :

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

关于ios - 从 CBCentralManagerDelegate 回调以在 IOS8 上检索 CBPeripheral,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25240895/

相关文章:

ios - 以编程方式创建的按钮不响应用户的点击

iOS8 UISplitViewController 始终在滑动手势时打开主 Controller

swift - 视频下载完成后如何停止jsqmessagesviewcontroller指示器旋转

ios - UIImageView 螺旋动画

ios - UIView 中的 UIBezierPath 动画

swift - RxSwift asDriver 图和强自

ios - 如何使用 XCode 在 iOS 中的媒体播放器应用程序中制作一个正在播放的栏?

ios - ITMS-90809:不推荐使用的API使用情况(UIWebView)

ios - 知道应用程序是否从网站下载

objective-c - NSTableView/NSOutlineView 顶部和底部淡入淡出效果