CoreBluetooth 应用程序在后台究竟能做什么?

实验对象说明了一切,真的。文档显示,在 iOS 设备上运行的基于 CoreBluetooth 框架编写的应用程序可以将“蓝牙中心”添加到它们的后台权限列表中,因此可以在不活动的情况下处理某些类型的蓝牙事件,但是哪些 一模一样事件可以发送,哪些不能发送?

例如:

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

似乎没有人知道,所以我买了一个 iOS 开发者的账户并做了一些实验:

当在前台运行时,您可以使用 CBCentralManager: : ScanForperipheralsWithServices 启动扫描。您的扫描可以是对特定服务广告的设备的 受限制,或者是 不受限制(对于该呼叫的参数传递 nil)。它也可以是 允许或者 禁止复制; 在前一种情况下,每次 iPhone 收到广告信息包时,你都会得到一个 idDiscover 外围回调; 在后一种情况下,每次发现一个设备,你只会得到一个回调。

当你输入背景时,规则如下:

  • 如果你正在运行 不受限制扫描,它将被悄悄地取消。你将不会得到任何确实发现回调。
  • 如果您的扫描是 受限制(即您指定了一个或多个正在查找的服务 UUID) ,那么您的扫描将继续运行,但是 允许重复标志将被忽略。这意味着您现在只能获得针对 新的设备的 did Discover 外设回调。如果所有的设备都显示在前台,那么你将不会得到任何回调。
  • 启动和停止扫描 没有复位哪些设备被认为是新的。如果存在一个设备,您将只能得到一个回调,即使是在多个扫描中,除非..。
  • 如果你的 连接到一个设备,然后 断开连接,然后 再扫描一次,该设备将再次枚举(即,你将得到一个更多的调用 didDiscover 周边)。我想 iOS 认为这是对该设备“表现出了兴趣”。

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

上述结果是通过运行 iOS5.0.1的 iPhone4S 收集的

除了克里斯的回答:

  • 如果你的应用程序有“蓝牙中心”的背景模式,并连接到外设,你可以收到通知(peripheral:didUpdateValueForCharacteristic:error:)从外设在后台,即使10分钟后。

所以当你想在后台连续运行时,你有两个选择:

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

稍后应该是来自 WWDC 2012核心蓝牙视频的“事件背景”。 < a href = “ https://developer.apple.com/video/WWDC/2012/”rel = “ norefrer”> https://developer.apple.com/videos/WWDC/2012/ 但前者看起来像黑客,我不想依赖它。

我在 iPhone5,iOS6.1.4上测试过


苹果公司终于发布了 核心蓝牙编程指南,这里是关于

IOS 应用程序的核心蓝牙后台处理

同样值得一提的是 iBeacons 的背景和 CoreBluetooth 功能,尽管苹果喜欢将其视为 CoreLocation 功能:

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

  2. 不那么明显: 如果你使用 iBeacon 测距 API,那么你的应用程序必须在前台。文档中没有明确说明这一点——实际上,认为测量应该在文档的后台工作可能会误导人们。然而,一位苹果工程师在苹果开发者论坛的一篇长帖子中澄清了这一点,我也看到了这种做法的失败。测距只能在前台工作。

  3. 你可以通过外围广告 iBeacon 发现其他服务。但这只能在前景中起作用。因此,如果您希望使用 iBeacons 通知中心接近,然后使用其他基于 ABLE 的服务执行其他事务,那么这种方法可以工作,但只能在前台执行。它不会在后台工作。对于在后台使用基于 ABLE 的服务的事务,广告必须是普通的 ABLE 广告,而不是 iBeacon。不能使用 iBeacon 广告在后台帮助发现过程,然后切换到在后台使用 BLE-services。(我非常希望这个方法能够奏效,但是没有成功)。

我刚刚了解了 iOS8.3和8.4上 ABLE 设备的后台模式,并发现了一些与上面的不同之处:

  1. 如果我开始

    [ CentralManager ScanForperipheralsWithServices:@[[ CBUUID UUIDWithString: kServiceUUID ]]选项:@{ CBCentralManagerScanOptionAllowDuplicatesKey:@YES }] ;

来自

- (void)applicationDidEnterBackground:(UIApplication *)application

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

  1. 如果应用程序在前台,它发现了50倍,在秒。 如果应用程序是在后台,但手机屏幕是活动的应用程序发现水平设备6倍在秒。 如果手机屏幕被屏蔽,应用程序会在1秒内发现 LE 设备。