CoreBluetooth应用程序在后台可以做什么?


78

主题确实说明了一切。从根本上说,文档表明,针对在iOS设备上运行的CoreBluetooth框架编写的应用程序可以在其后台特权列表中添加“ bluetooth-central”,从而可以在不活动时处理某种Bluetooth事件,但是确切的事件是不送达?

例如:

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

Answers:


120

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

在前台运行时,可以使用CBCentralManager :: scanForPeripheralsWithServices开始扫描。您的扫描可以仅限于宣传特定服务的设备,也可以不受限制(将nil作为调用参数传递)。它还可以允许禁止重复项;在前一种情况下,每当iPhone收到广告数据包时,您都会收到didDiscoverPeripheral回调;在后者中,每个设备只会得到一个回调。

当您进入背景时,规则如下所示:

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

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

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


2
嘿克里斯。有趣!我不明白一件事。如果进程正在与Bluetooth设计通信,该进程可以在后台继续运行吗?(例如,我可以连接心率监测器,然后将应用程序移至后台并期望其继续运行吗?)
2012年

2
嗨,本 它不会像在前台那样继续运行,但是当发生上述我描述的蓝牙事件时,它将继续执行。我遇到的一个问题是,即使在这种情况下,当一段时间没有用户交互时,手机将进入睡眠状态,并且该应用程序将停止被调用。我已经通过(错误地)注册为音频应用程序来解决此问题,这可以防止暂停;但是对于应用商店来说,这显然是不允许的。
克里斯·史莫顿

克里斯,你好 很棒的帖子。您的最后一条评论否定了本文中的声明:lists.apple.com/archives/bluetooth-dev/2011/Dec/msg00007.html这不是一个好消息。您是否认为这是实施过程中的实际错误?您是否已建立与设备的连接?您可以确认价值更新通知也停止吗?谢谢。
allprog

1
@ChrisSmowton我知道您不再有iOS设备。但是您有一个想法,如何区分忽略重复的iOS和找不到外围设备的iOS?
shreyashirday

3
如果您自从上次连接它以来没有看到它,那么它就不存在。如果您已看到它,那么我知道在后台再次发现它的唯一方法就是尝试建立连接。
克里斯·斯莫顿

9

除了克里斯的答案:

  • 如果您的应用具有“蓝牙中心”背景模式并且已连接到外围设备,则peripheral:didUpdateValueForCharacteristic:error:即使在10分钟之后,您也可以在后台从外围设备接收通知()。

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

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

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

我在iPhone5,iOS6.1.4上测试过


苹果终于发布了《核心蓝牙编程指南》,这是关于

适用于iOS应用的核心蓝牙后台处理


7

还应注意与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]] options:@ {CBCentralManagerScanOptionAllowDuplicatesKey:@YES}];

- (void)applicationDidEnterBackground:(UIApplication *)application

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

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

1
很高兴知道,自从我在2012年使用它以来,听起来好像它们已经改善了堆栈:)
Chris Smowton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.