蓝牙 LE iOS 无法在后台扫描
Bluetooth LE iOS unable to scan in background
设置、情况的独特性以及前台扫描成功
我正在尝试从 CBPeripheral
设备获取蓝牙读数。这个特定设备的有趣之处在于它发出直接在其中嵌入信息的 UUID。 (这看起来很奇怪,但我对 BLE 的了解还不够多,不知道这是否是典型的。最后没有发生实际连接 - 只发送了广告。)
在前台,我能够确定哪些读数是我的,因为 [peripheral name]
保持不变。所以我可以通过在 didDiscoverPeripheral
:
中进行以下检查来获取相关的读数
if ([[peripheral name] isEqualToString:@"UNIQUE_IDENTIFIER"]) {
NSLog(@"*** Got a reading ***");
}
这在前台运行良好 - 我正在 运行ning
[self.centralManager scanForPeripheralsWithServices:nil options:nil];
在一个循环中(那里的细节似乎无关紧要)并且代码能够打印出我希望它打印的所有读数。
后台扫描有问题,尝试解决
我的应用 Info.plist 包含以下条目:
我还检查了(我认为是)XCode 中“功能”选项卡中的适当字段:
这些东西都没有用。 didDiscoverPeripheral
被完美调用,直到我关闭我的应用程序,此时它立即停止。
我在互联网上读到的另一件事是,当使用 nil
调用 scanForPeripheralsWithServices
时,后台处理仍然不会发生,但是如果 non-empty 服务数组是相反,它应该成功。 我不确定这是否正确。问题是,我只能找到调用 scanForPeripheralsWithServices
的示例,其中服务由其 UUID
标识,例如
NSArray *services = @[[CBUUID UUIDWithString: @"2456f1b9-26e2-8f83-e744-f34f01e9d701"]];
[self.centralManager scanForPeripheralsWithServices:services options:nil];
但不是他们的 name
属性.
问题
所以我想我的问题,在这一切之后,将是:提供一个 name
过滤器数组(而不是 UUID
s)会帮助应用程序在 运行背景,如果是这样,我将如何在代码中编写它?如果不是,我错过了什么,以至于我的应用程序仍然只能在前台运行?
编辑:我以前用过术语"identifier",当时我想我想说"name",所以我回去修改了那些。从文档中,这是我想在后台扫描的名称值 https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519029-name?language=objc
为了在后台扫描新设备,您必须指定您感兴趣的服务的 UUID。文档对此非常清楚。
设备的 identifier
是由 iOS 在本地确定的值,而不是设备本身,并且会因连接到同一外围设备的不同 iOS 设备而异。如果您知道您之前发现的设备的标识符,那么您可以使用该标识符 connect
到该设备,但您不能扫描标识符。
外围设备可以在其服务广告中包含数据,也许这就是您的外围设备正在做的事情。如果是这样,那么您将无法在后台获取读数,因为当您的应用程序处于后台时不会传送重复的设备发现事件。
只要您知道新设备正在宣传的服务,您就可以在后台发现并连接到新设备,但任何后续数据传输都需要设备发出有关更改特征的通知。它不能使用广告框架的制造商数据部分。
设置、情况的独特性以及前台扫描成功
我正在尝试从 CBPeripheral
设备获取蓝牙读数。这个特定设备的有趣之处在于它发出直接在其中嵌入信息的 UUID。 (这看起来很奇怪,但我对 BLE 的了解还不够多,不知道这是否是典型的。最后没有发生实际连接 - 只发送了广告。)
在前台,我能够确定哪些读数是我的,因为 [peripheral name]
保持不变。所以我可以通过在 didDiscoverPeripheral
:
if ([[peripheral name] isEqualToString:@"UNIQUE_IDENTIFIER"]) {
NSLog(@"*** Got a reading ***");
}
这在前台运行良好 - 我正在 运行ning
[self.centralManager scanForPeripheralsWithServices:nil options:nil];
在一个循环中(那里的细节似乎无关紧要)并且代码能够打印出我希望它打印的所有读数。
后台扫描有问题,尝试解决
我的应用 Info.plist 包含以下条目:
我还检查了(我认为是)XCode 中“功能”选项卡中的适当字段:
这些东西都没有用。 didDiscoverPeripheral
被完美调用,直到我关闭我的应用程序,此时它立即停止。
我在互联网上读到的另一件事是,当使用 nil
调用 scanForPeripheralsWithServices
时,后台处理仍然不会发生,但是如果 non-empty 服务数组是相反,它应该成功。 我不确定这是否正确。问题是,我只能找到调用 scanForPeripheralsWithServices
的示例,其中服务由其 UUID
标识,例如
NSArray *services = @[[CBUUID UUIDWithString: @"2456f1b9-26e2-8f83-e744-f34f01e9d701"]];
[self.centralManager scanForPeripheralsWithServices:services options:nil];
但不是他们的 name
属性.
问题
所以我想我的问题,在这一切之后,将是:提供一个 name
过滤器数组(而不是 UUID
s)会帮助应用程序在 运行背景,如果是这样,我将如何在代码中编写它?如果不是,我错过了什么,以至于我的应用程序仍然只能在前台运行?
编辑:我以前用过术语"identifier",当时我想我想说"name",所以我回去修改了那些。从文档中,这是我想在后台扫描的名称值 https://developer.apple.com/documentation/corebluetooth/cbperipheral/1519029-name?language=objc
为了在后台扫描新设备,您必须指定您感兴趣的服务的 UUID。文档对此非常清楚。
设备的 identifier
是由 iOS 在本地确定的值,而不是设备本身,并且会因连接到同一外围设备的不同 iOS 设备而异。如果您知道您之前发现的设备的标识符,那么您可以使用该标识符 connect
到该设备,但您不能扫描标识符。
外围设备可以在其服务广告中包含数据,也许这就是您的外围设备正在做的事情。如果是这样,那么您将无法在后台获取读数,因为当您的应用程序处于后台时不会传送重复的设备发现事件。
只要您知道新设备正在宣传的服务,您就可以在后台发现并连接到新设备,但任何后续数据传输都需要设备发出有关更改特征的通知。它不能使用广告框架的制造商数据部分。