代码之家  ›  专栏  ›  技术社区  ›  wheresmycookie

蓝牙LE iOS无法在后台扫描

  •  0
  • wheresmycookie  · 技术社区  · 7 年前

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

    我正试图从一个手机上获取蓝牙数据 CBPeripheral 装置这个特定设备的有趣之处在于,它发送的UUID直接将信息嵌入其中。(这似乎很奇怪,但我对BLE的了解还不够,不知道这是否是典型的。最终没有实际的联系——只有广告被发出。)

    在前景中,我能够识别哪些读数是我的,因为 [peripheral name] 保持不变。所以我可以通过在 didDiscoverPeripheral :

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

    这在前台工作得很好-我正在跑步

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

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

    后台扫描故障并尝试解决

    我的应用程序信息。plist包含以下条目:

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

    事实证明,这两样东西都没有用。 DidDiscoveryPeripheral 完全调用,直到我关闭应用程序时,它立即停止。

    我在网上读到的另一件事是,当 scanForPeripheralsWithServices 使用调用 nil 但是,如果传递了一个非空的服务数组,那么它应该会成功。 我不确定这是否正确 . 问题是,我只能找到打电话的例子 扫描外围设备和服务 服务由其 UUID s、 例如

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

    但不是他们的 name 所有物

    问题是

    所以我想我的问题是,在所有这些之后,是否会提供 名称 过滤器(而不是 UUID s) 帮助应用程序在后台运行,如果是,我将如何在代码中编写它?如果没有,我会错过什么,以至于我的应用程序仍然只能在前台工作?

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Paulw11    7 年前

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

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

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

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

    推荐文章