8

我正在尝试使用 Apple 的“ BTLE Transfer ”示例项目来了解 CoreBluetooth 编程。如果我使用 iOS 6 设备作为 Central,该应用程序运行良好,但如果我使用 iOS 7 设备作为 Central 运行相同的应用程序,则它不起作用。外设在两个数据包后停止发送,而中央没有收到其中任何一个。

唯一的线索是我只有在 iOS 7 上运行时才会收到的警告:

CoreBluetooth[WARNING] <CBCentralManager: 0x15654540> is disabling duplicate filtering, but is using the default queue (main thread) for delegate events

谁能告诉我需要改变什么才能使这个应用程序与 iOS 7 兼容?

编辑:当两个设备都是 iOS7 时没有问题。这仅在 iOS7 中心与 iOS6 外围设备通信时才会中断。

4

2 回答 2

8

好的,我只是在 iOS 7 中央到 iOS 6 外围设备上运行它。如果您想让关于禁用重复过滤的警告消失,只需在不同的线程上运行它。做这样的事情:

dispatch_queue_t centralQueue = dispatch_queue_create("com.yo.mycentral", DISPATCH_QUEUE_SERIAL);// or however you want to create your dispatch_queue_t
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueue];

现在它将允许您在启用重复项的情况下进行扫描。但是,您必须在主线程上调用 textView 设置器才能设置文本而不会崩溃:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.textview setText:[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]];
        });

顺便说一句,您可能还想采用新的 iOS 7 委托初始化:

_centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:centralQueue options:nil];//set the restoration options if you want

(只需检查iOS版本并调用相应的初始化方法即可)

于 2013-09-24T17:18:40.737 回答
5

scanForPeripheralsWithServices:options:中,如果您设置CBCentralManagerScanOptionAllowDuplicatesKey:@YES然后将其更改为 CBCentralManagerScanOptionAllowDuplicatesKey:@NO这意味着扫描应该运行而没有重复过滤。

对我来说,它也适用于 iOS7。

于 2014-02-26T07:12:07.913 回答