同时广告,扫描和监控iBeacon和CBPeripheral

时间:2016-02-02 20:01:23

标签: ios objective-c ibeacon bluetooth-lowenergy cbperipheral

我同时在一个NSDictionary中宣传一个BLE外设和一个信标,并由同一个CBPeripheralManager做广告。在同一个应用程序中,我正在扫描BLE外设并监控信标。

它不起作用 - 同时宣传外围设备和信标似乎会引起一场奇怪的冲突。在前景中,将检测到信标(区域条目),但是CBPeripheral的回叫不会被激活。当设备A为应用程序提供背景时,外围设备回调将在设备B上运行的应用程序上触发,服务和特征查询将按预期运行。

行为表明信标的广告在前台时会阻止外围设备的广告,但是当应用在后台时,外围广告会生效。

广告代码如下:

    NSDictionary *adUUIDs = [[NSDictionary alloc] initWithObjectsAndKeys:@"CNT100A", @"kCBAdvDataLocalName", _serviceUUIDs, @"kCBAdvDataServiceUUIDs", nil];

    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"328204DB-5128-40B4-9C73-65DF66899945"];
    CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:1 minor:1 identifier:@"com.aurl.id"];
    NSDictionary *beaconData = [beaconRegion peripheralDataWithMeasuredPower:nil];

    NSMutableDictionary *advert = [NSMutableDictionary dictionaryWithDictionary:beaconData];
    [advert addEntriesFromDictionary:adUUIDs];

    [_adManager startAdvertising:advert];

产生这个:

(lldb) po advert
{
    kCBAdvDataAppleBeaconKey = <328204db 512840b4 9c7365df 66899945 00010001 c8>;
    kCBAdvDataLocalName = CNT100A;
    kCBAdvDataServiceUUIDs =     (
        "5351CAD0-B1CE-4E38-8673-76D05124E915",
        "E7A48922-5D43-4237-821D-D710E69EE1CD"
    );
}

如果我在调用startAdvertising之前从字典中删除了外围设备或信标广告项目,则该应用程序会正常运行。

我的CBCentralManager扫描调用如下:

[_searchManager scanForPeripheralsWithServices:serviceUUIDs options:@{CBCentralManagerScanOptionSolicitedServiceUUIDsKey: serviceUUIDs, CBCentralManagerScanOptionAllowDuplicatesKey:continuousSearch}];

我的地区监测是标准的:

    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"328204DB-5128-40B4-9C73-65DF66899945"];
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:1 minor:1 identifier:@"com.aurl.id"];
    self.beaconRegion.notifyEntryStateOnDisplay = YES;

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;

    [self.locationManager requestAlwaysAuthorization];
    [self.locationManager startMonitoringForRegion:self.beaconRegion];

我一直试图让这个工作的时间超过我承认的时间......我误解了一些简单的事情吗? Apple是否限制了该领域的某些功能?

1 个答案:

答案 0 :(得分:0)

不幸的是,从您的描述中可以看出,您无法同时在iOS上宣传iBeacon和其他外围服务。

这并不令人惊讶。信标以10Hz通告,虽然大多数蓝牙芯片允许更频繁的传输,但它们通常不支持芯片级的交错。这意味着如果iOS想要支持在所有芯片(所有iPhone和iPad型号)上同时广播两种广告类型,则必须包含特殊代码才能使芯片这样做。听起来像我没有。

很明显,我没有关于在iOS上同时广播多种广告类型的内部实施的特殊信息。但我从经验中知道,做你想做的事情需要在低级别跳过特殊的篮球,所以iOS很可能根本不允许它。