【问题标题】:What exactly can CoreBluetooth applications do whilst in the background?CoreBluetooth 应用程序到底能在后台做什么?
【发布时间】:2012-04-11 09:34:34
【问题描述】:

主题说明了一切,真的。就其存在的文档而言,它表明针对在 iOS 设备上运行的 CoreBluetooth 框架编写的应用程序可以将“bluetooth-central”添加到其后台权限列表中,从而在不活动时处理某种蓝牙事件,但 事件是否被传递?

例如:

  1. 我可以与已经建立配对的设备进行通信吗?
  2. 我能否发出定期发现请求以查找超出范围/我以前从未见过的设备? (例如,如果我希望能够在遇到新的有趣设备时发送通知)
  3. 如果设备超出范围然后又返回怎么办?我会在没有用户干预的情况下获得断开连接和连接事件,还是需要被置于前台并让用户明确请求重新连接?

【问题讨论】:

    标签: ios core-bluetooth


    【解决方案1】:

    似乎没人知道,所以我购买了一个 iOS 开发者帐户并进行了一些实验。这是我发现的:

    在前台运行时,您可以使用 CBCentralManager::scanForPeripheralsWithServices 启动扫描。您的扫描可以限制到宣传特定服务的设备,或不受限制(为该调用的参数传递 nil)。它还可以允许不允许重复;在前一种情况下,每次 iPhone 收到广告包时,您都会收到 didDiscoverPeripheral 回调;在后者中,每个找到的设备只会得到一个回调。

    进入后台后,出现如下规则:

    • 如果您正在运行无限制扫描,它将被静默取消。您不会收到任何 didDiscover 回调。
    • 如果您的扫描受到限制(即您指定了一个或多个要查找的服务 UUID),您的扫描将继续运行,但 允许重复标记将被忽略强>。这意味着您现在只会获得 new 设备的 didDiscoverPeripheral 回调。如果在前台看到所有设备,您将不会收到任何回调。
    • 开始和停止扫描不会重置哪些设备被视为新设备。如果存在一台设备,即使在多次扫描中,您也只会收到一次回调,除非...
    • 如果您连接到设备,然后断开连接,然后再次扫描,设备将再次被枚举(即您将获得一个更多调用 didDiscoverPeripheral)。我猜 iOS 认为这是对设备“表现出兴趣”。

    我不知道连接到不可连接设备(例如 BLE 广告商,如那些实施邻近配置文件的设备)的连接尝试是否足够好,因为我的示例设备是可连接的。然而,至少对于可连接的设备,此扫描/连接/断开/扫描过程足以轮询设备在后台的存在。

    以上结果是使用运行 iOS 5.0.1 的 iPhone 4S 收集的

    【讨论】:

    • 嗨,克里斯。有趣的!虽然我不明白一件事。如果进程正在与蓝牙设计进行通信,它能否在后台继续运行? (例如,我可以连接心率监测器,然后将应用程序移至后台并期望它继续运行吗?)
    • 嗨,本。它不会像在前台那样继续运行,但是当我在上面描述的那种蓝牙事件发生时,它将继续执行。我遇到的一个问题是,即使在这种情况下,当一段时间没有用户交互时,手机会进入睡眠状态并且应用程序将停止调用。我通过(错误地)注册为音频应用程序来解决这个问题,这可以防止暂停;然而,这对于应用商店来说显然是不可接受的。
    • 嗨,克里斯。很棒的帖子。您的最后一条评论否定了这篇文章中的声明:lists.apple.com/archives/bluetooth-dev/2011/Dec/msg00007.html 这不是好消息。您认为这是实施中的实际错误吗?您是否设置了与设备的连接?您能否确认值更新通知也停止了?谢谢。
    • @ChrisSmowton 我知道你已经没有 iOS 设备了。但是您是否知道如何区分 iOS 忽略重复项和 iOS 未找到外围设备?
    • 如果自上次连接后还没有看到它,则它不存在。如果你看过它,我知道在后台再次发现它的唯一方法是尝试连接。
    【解决方案2】:

    除了克里斯的回答:

    • 如果您的应用具有“bluetooth-central”后台模式并连接到外围设备,您可以在后台接收来自外围设备的通知 (peripheral:didUpdateValueForCharacteristic:error:),即使 10 分钟后也是如此。

    因此,当您想在后台连续运行时,您有两种选择:

    • 运行“连接、断开、再次扫描”循环
    • 让外围设备发送通知

    稍后应该是 WWDC 2012 Core 蓝牙视频中的“事件背景”https://developer.apple.com/videos/wwdc/2012/ 但前者看起来像个 hack,我不想依赖它。

    我在 iPhone5、iOS6.1.4 上测试过这个


    Apple 终于发布了Core Bluetooth Programming Guide,这是官方的说明

    Core Bluetooth Background Processing for iOS Apps

    【讨论】:

      【解决方案3】:

      注意与 iBeacons 相关的后台处理和 CoreBluetooth 的行为也很好,尽管 Apple 喜欢将其视为 CoreLocation 功能:

      1. 当 iBeacon 区域的通知打开时,它们将通知用户区域进入或退出。可以根据显示器是打开还是关闭来发出这些通知。即使请求通知的应用程序在后台,这些通知也会起作用。 (这在文档中很清楚)。

      2. 不太明显:如果您使用 iBeacon 测距 API,那么您的应用程序必须在前台。它没有在文档中明确说明这一点——事实上,人们可能会误以为测距应该在文档的后台工作。然而,一位 Apple 工程师在 Apple 开发者论坛上的一个长线程中某处的帖子中澄清了这一点,我也看到了这个失败。测距仅在前台工作。

      3. 可以发现外围广告 iBeacons 正在广告的其他服务。但这仅适用于前台。因此,如果您希望使用 iBeacons 通知中心接近,然后使用其他基于 BLE 的服务执行一些其他事务,这将起作用,但仅在前台。它不会在后台工作。对于在后台使用基于 BLE 的服务的交易,广告必须是常规的 BLE 广告,而不是 iBeacon。您不能在后台使用 iBeacon 广告来帮助发现过程,然后切换到在后台使用 BLE 服务。 (我非常喜欢这个工作,但没有骰子)。

      【讨论】:

        【解决方案4】:

        我刚刚在 iOS8.3 和 8.4 上学习了 BLE 设备的后台模式,并发现了与上面的一些差异:

        1. 如果我开始

          [centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] 选项:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];

        来自

        - (void)applicationDidEnterBackground:(UIApplication *)application
        

        我发现枚举每次调用都返回相同的设备,但 RSSI 不同, 所以 CBCentralManagerScanOptionAllowDuplicatesKey 不会被忽略。

        1. 如果应用程序在前台,它会在 1 秒内发现 50 次 BLE 设备。 如果应用程序在后台,但手机屏幕处于活动状态,应用程序在 6 秒内发现了 BLE 设备。 如果手机屏幕被阻止,应用在 1 秒内发现 BLE 设备。

        【讨论】:

        • 很高兴知道,自从我在 2012 年使用它以来,他们似乎已经改进了堆栈:)
        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 2013-06-27
        • 1970-01-01
        • 2012-10-16
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多