iOS 7核心蓝牙外围设备在后台运行

时间:2013-10-07 20:59:09

标签: objective-c bluetooth ios7 core-bluetooth bluetooth-lowenergy

我想要的是我的iOS设备一直在宣传蓝牙LE服务,即使应用程序没有运行,这样我就可以对其进行另一次iOS设备扫描并找到它。我在这里遵循了Apple的背景说明:

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonPeripheralRoleTasks/PerformingCommonPeripheralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH4-SW1

我可以让它在前景中做广告,有时在后台做广告,但它不会一直保持广告。如果您将其设置为在后台运行,即使设备重启后它也不应该开始做广告,就像后台位置服务在重启后自动开始工作一样?他们在Apple的文档中没有列出(或很难找到)的后台限制吗?有没有人在后台正确地拥有Core Bluetooth Peripheral广告的例子?

...谢谢

2 个答案:

答案 0 :(得分:8)

如果您将bluetooth-peripheral后台模式添加到应用程序的plist,则可以进行后台广告。一旦你这样做,你的应用程序将继续接收回调,即使背景。

该广告是一个棘手的野兽,因为Apple实施了几项优化以降低功耗,并且一旦应用程序落后,这些就会降低广告的质量。即:费率严重下降,不包括广告服务,也不包括本地名称。一旦应用程序回到前台,这些限制就会失效。

在一般情况下,这种后台运行需要应用程序运行。在iOS 7中,已经实施了恢复过程,允许操作系统在终止时代表应用程序执行操作,并在某些传输或其他操作即将来临时恢复应用程序。这要求您将恢复密钥添加到CBPeripheralManager / CBCentralManager的初始化选项中。仍然需要启动一次应用程序,但在此之后,iOS将继续充当中央/外围设备的BLE外观。

更新:我在Apple bluetooth-dev列表上运行了一个循环以及此问题,发现Core Bluetooth管理器是declared to be not able to restore after reboot。这没有在任何文档中描述,但可能在WWDC视频中提到过。我们应该提交一个错误并复制它以提高Apple的意识。

答案 1 :(得分:0)

可以在此处建立实施: https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonPeripheralRoleTasks/PerformingCommonPeripheralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH4-SW5

实际上非常简单。

<CBPeripheralManagerDelegate>

@property (strong, nonatomic) CBPeripheralManager *peripheralManager;

...

- (NSDictionary*) advertiseNotBeacon {
    CBUUID *myCustomServiceUUID = [CBUUID UUIDWithString:@"MY_UUID"];

    CBMutableCharacteristic *myCharacteristic = [[CBMutableCharacteristic alloc] initWithType:myCustomServiceUUID
                                                                                   properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify
                                                                                        value:nil permissions:CBAttributePermissionsReadable];

    CBMutableService *myService = [[CBMutableService alloc] initWithType:myCustomServiceUUID primary:YES];
    myService.characteristics = @[myCharacteristic];

    self.peripheralManager.delegate = self;
    [self.peripheralManager addService:myService];

    return @{CBAdvertisementDataServiceUUIDsKey : @[myService.UUID],
             CBAdvertisementDataLocalNameKey: @"MY_NAME"
             };
}

...

[self.peripheralManager startAdvertising:[self advertiseNotBeacon]];

这样做,您将开始宣传外围服务。

现在,如果您想让服务在后台运行,请阅读以下链接中的文档:https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html#//apple_ref/doc/uid/TP40013257-CH7-SW1

快速步骤: 打开info.plist 添加新的par键/值

Required background modes
      App shares data using CoreBluetooth

Apple说要按住Ctrl键并单击任何键/值并添加以下内容,但与之前解释的完全相同。

UIBackgroundModes
      bluetooth-peripheral 

不要忘记在后台运行服务的限制:

  • 忽略CBCentralManagerScanOptionAllowDuplicatesKey扫描选项键,并将广告外围设备的多个发现合并为单个发现事件。 如果扫描外围设备的所有应用都在后台,则中央设备扫描广告数据包的时间间隔会增加。因此,发现广告外围设备可能需要更长时间。
  • 这些更改有助于最大限度地减少无线电使用并延长iOS设备的电池寿命。