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

时间:2012-03-27 19:44:39

标签: ios core-bluetooth

主题说明了一切,真的。文档,就其本身而言,表明针对在iOS设备上运行的CoreBluetooth框架编写的应用程序可以添加" bluetooth-central"到他们的后台特权列表,因此在处于非活动状态时处理某种蓝牙事件,但确切的事件是否会被传递?

例如:

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

4 个答案:

答案 0 :(得分:119)

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

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

当您输入背景时,规则显示如下:

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

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

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

答案 1 :(得分:9)

除了克里斯的回答:

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

因此,当您想要在后台持续运行时,您有两个选择:

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

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

我在iPhone5,iOS6.1.4

上测试了这个

Apple最终发布了Core Bluetooth Programming Guide,这是关于

的官方说明

Core Bluetooth Background Processing for iOS Apps

答案 2 :(得分:7)

同样值得注意的是背景和CoreBluetooth与iBeacons相关的行为,尽管Apple喜欢将其视为CoreLocation功能:

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

  2. 不太明显:如果您使用iBeacon测距API,那么您的应用必须位于前台。它没有在文档中明确说明这一点 - 实际上,人们可能误以为范围应该在文档的后台工作。然而,一位苹果工程师在Apple开发者论坛的长篇帖子中隐藏了这个帖子,我也看到了这个失败。测距仅适用于前景。

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

答案 3 :(得分:4)

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

  1. 如果我开始

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

  2. - (void)applicationDidEnterBackground:(UIApplication *)application
    

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

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