Skip to content
TrusBe edited this page Aug 28, 2017 · 7 revisions

后台模式指的是,app进入后台,仍然可以扫描、连接和操作peripheral或者作为外设被操作。

设置程序支持后台模式

修改Info.plist文件,添加Required background modes键,并添加下面2个item

1. bluetooth-central
2. bluetooth-peripheral

这两个item的意义分别为:

  • App communicates using CoreBluetooth
  • App shares data using CoreBluetooth

虽然应用在后台时,我们可以执行很多蓝牙相关任务,但应用在前后台运行还是会有所区别

bluetooth-central区别

  1. CBCentralManagerScanOptionAllowDuplicatesKey扫描选项会被忽略,同一个 Peripheral 端的多个发现事件会被聚合成一个发现事件。
  2. 如果扫描 Peripheral 设备的多个应用都在后台,则Central设备扫描广告数据的时间间隔会增加。结果是发现一个广告的 Peripheral 设备可能需要很长时间。
  3. scanForPeripheralsWithServices 扫描时,必须指定 services,才能在后台模式中发现设备
  //CoreBluetooth中指定services
  NSMutableArray *servicesUUID = [NSMutableArray arrayWithObject:[CBUUID UUIDWithString:@"FFF0"]];
            [central scanForPeripheralsWithServices:servicesUUID options:nil];

  //BabyBluetooth中指定services
  NSMutableArray *servicedUUID = [NSMutableArray arrayWithObject:[CBUUID UUIDWithString:@"FFF0"]];
  //设置babybluetooth运行时参数
  [baby setBabyOptionsWithScanForPeripheralsWithOptions:nil connectPeripheralWithOptions:nil scanForPeripheralsWithServices:servicedUUID discoverWithServices:nil discoverWithCharacteristics:nil];

bluetooth-peripheral区别

  1. CBAdvertisementDataLocalNameKey广告key值会被忽略,Peripheral端的本地名不会被广告
  2. CBAdvertisementDataServiceUUIDsKey键的所有服务的UUID都被放在一个”overflow”区域中,它们只能被那些显示要扫描它们的网络设备发现。
  3. 如果多个应用在后台广告,则 Peripheral 设备发送广告包的时间间隔会变长。

CBCentralManager构造的区别。

根据程序是否在Info.babyBluetooth中的CBCentralManager的构造会有所区别。

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                 //蓝牙power没打开时alert提示框
                                 [NSNumber numberWithBool:YES],CBCentralManagerOptionShowPowerAlertKey,
                                 //重设centralManager恢复的IdentifierKey
                                 @"babyBluetoothRestore",CBCentralManagerOptionRestoreIdentifierKey,
                                 nil];

if ([backgroundModes containsObject:@"bluetooth-central"]) {
       //后台模式
       bleManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil options:options];
    }else{
       //非后台模式
       bleManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
    }

更多介绍

Clone this wiki locally