0

设置、情况的唯一性和前台成功扫描

我正在尝试从CBPeripheral设备中获取蓝牙读数。这个特定设备的有趣之处在于它发出的 UUID 直接将信息嵌入其中。(这看起来很奇怪,但我对 BLE 的了解还不够,无法知道这是否是典型的。最终没有发生实际的连接 - 只发送了广告。)

在前台,我能够确定哪些读数是我的,因为[peripheral name]保持不变。因此,我可以通过在内部进行以下检查来获取相关的读数didDiscoverPeripheral

if ([[peripheral name] isEqualToString:@"UNIQUE_IDENTIFIER"]) {
    NSLog(@"*** Got a reading ***");
}

这在前台运行良好 - 我正在运行

[self.centralManager scanForPeripheralsWithServices:nil options:nil];

在一个循环中(细节似乎无关紧要)并且代码能够打印出我希望它打印的所有读数。

后台扫描问题并尝试解决

我的应用程序的 Info.plist 包含以下条目:

我还检查了(我认为是)XCode 的 Capabilities 选项卡中的相应字段:

这些东西都没有被证明是有用的。didDiscoverPeripheral被完美调用,直到我关闭我的应用程序,此时它立即停止。

scanForPeripheralsWithServices我在互联网上读到的另一件事是,当使用 调用时,后台处理仍然不会发生nil,但是如果传递了一个非空的服务数组,那么它应该会成功。我不确定这是否正确。问题是,我只能找到调用scanForPeripheralsWithServices由它们UUID的 s 标识的服务的示例,例如

NSArray *services = @[[CBUUID UUIDWithString: @"2456f1b9-26e2-8f83-e744-f34f01e9d701"]];
[self.centralManager scanForPeripheralsWithServices:services options:nil];

但不是他们的name财产。

问题

所以我想我的问题是:提供一组name过滤器(而不是UUIDs)是否有助于应用程序在后台运行,如果是,我将如何在代码中编写它?如果没有,我错过了什么以使我的应用程序仍然只能在前台运行?

编辑:当我认为我的意思是说“名字”时,我以前使用过术语“标识符”,所以我回去改变了那些。从文档中,这是我想在后台扫描的名称值https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519029-name?language=objc

4

1 回答 1

1

为了在后台扫描新设备,您必须指定您感兴趣的服务的 UUID。文档对此非常清楚。

设备的identifier是由 iOS 本地确定的值,而不是设备本身,并且会因连接到同一外围设备的不同 iOS 设备而异。如果您知道之前发现的设备的标识符,则可以将该标识符用于connect该设备,但您无法扫描标识符。

外围设备可以在其服务广告中包含数据,也许这就是您的外围设备正在做的事情。如果是这样,那么您将无法在后台获取读数,因为当您的应用程序在后台时不会传递重复的设备发现事件。

只要您知道它正在宣传的服务,您就可以在后台发现并连接到新设备,但是任何后续数据传输都需要设备发出有关更改特征的通知。它不能使用广告框架的制造商数据部分。

于 2018-02-13T17:32:57.353 回答