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

这个话题真的是这么说的。 就其存在的文档而言,build议针对在iOS设备上运行的CoreBluetooth框架编写的应用程序可以将“蓝牙中央”添加到其后台特权列表,并且在不活动时处理某种types的蓝牙事件,不交付?

例如:

  1. 我可以与已经build立配对的设备进行通信吗?
  2. 我可以定期发现请求来查找超出范围/我从未见过的设备吗? (例如,如果我想在遇到新的感兴趣的设备时能够发出通知)
  3. 如果一个设备超出范围,然后回来? 我是否会在没有用户干预的情况下断开连接和连接的事件,还是需要预先安排并让用户明确要求重新连接?

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

在前台运行时,可以使用CBCentralManager :: scanForPeripheralsWithServices开始扫描。 您的扫描可以限制在广告特定服务的设备上,也可以不受限制 (对于该电话的参数,通过零)。 它也可以允许禁止重复 ; 在前一种情况下,每次iPhone收到广告数据包时都会收到didDiscoverPeripheralcallback; 在后者中,每个设备只能find一个callback。

当您进入后台时,规则如下所示:

  • 如果您正在运行无限制的扫描,它将被默认取消。 你将不会得到任何didDiscovercallback。
  • 如果您的扫描受到限制 (即您指定了一个或多个您正在查找的服务UUID),则扫描将继续运行,但允许重复标志将被忽略 。 这意味着你现在只能得到设备的didDiscoverPeripheralcallback。 如果在前台看到所有设备,则根本没有callback。
  • 开始和停止扫描不会重置哪些设备被视为新的。 如果有一个设备存在,你将只会得到一个callback,即使在多个扫描,除非…
  • 如果你连接到一个设备,然后断开连接 ,然后再次扫描 ,设备将被重新枚举(例如,你会得到一个更多的电话didDiscoverPeripheral)。 我猜想iOS认为这是在设备中显示“兴趣”。

我不知道是否尝试连接到不可连接的设备(例如,BLE广告客户,如实现接近configuration文件的设备)是否足够好,因为我的示例设备是可连接的。 但是至less对于可连接的设备来说,这个扫描/连接/断开/扫描过程足以在设备背景中轮询设备。

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

除了克里斯的回答:

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

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

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

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

我在iPhone5,iOS6.1.4上testing了这个


苹果终于发布了“ 核心蓝牙编程指南” ,这里是官方的说明

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

尽pipe苹果喜欢将其视为CoreLocationfunction,但也注意到与iBacons有关的后台操作和CoreBluetooth的行为。

  1. 当iBeacon区域的通知被打开时,他们将通知用户区域进入或退出。 这些通知可以取决于显示是打开还是closures。 即使请求通知的应用在后台,这些通知也可以正常工作。 (这在文档中很清楚)。

  2. 不那么明显:如果您使用iBeacon范围API,那么您的应用程序必须在前台。 它并没有在文档中明确地说出这一点 – 事实上,人们可能会误以为范围应该在文档背景下工作。 不过,苹果工程师在苹果开发者论坛上的一篇post里把这个post澄清了,我也看到了这个失败。 测距只能在前台工作。

  3. 人们可以发现其他服务被广告iBeacons的外设广告。 但是这只会在前台工作。 所以,如果你想让中央通知使用iBeacons的距离,然后使用其他基于BLE的服务进行一些其他的交易,这将起作用,但只能在前台。 它不会在后台工作。 对于在后台与基于BLE的服务交易,广告必须是常规的BLE广告,而不是iBeacon。 您不能使用iBeacon广告在后台帮助查找过程,然后在后台切换到使用BLE服务。 (我会非常喜欢这个工作,但没有骰子)。

我刚刚在iOS8.3和8.4上学习了BLE设备的背景模式,并发现了与上述不同之处:

  1. 如果我开始

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

 - (void)applicationDidEnterBackground:(UIApplication *)application 

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

  1. 如果应用程序处于前台,它会以秒为单位发现BLE设备50次。 如果应用程序在后台,但手机屏幕是活动应用程序发现BLE设备6倍秒。 如果手机屏幕被阻止,应用程序发现BLE设备1秒钟。