后台模式

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];
    }

更多介绍

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.