我同时在一个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是否限制了该领域的某些功能?
答案 0 :(得分:0)
不幸的是,从您的描述中可以看出,您无法同时在iOS上宣传iBeacon和其他外围服务。
这并不令人惊讶。信标以10Hz通告,虽然大多数蓝牙芯片允许更频繁的传输,但它们通常不支持芯片级的交错。这意味着如果iOS想要支持在所有芯片(所有iPhone和iPad型号)上同时广播两种广告类型,则必须包含特殊代码才能使芯片这样做。听起来像我没有。
很明显,我没有关于在iOS上同时广播多种广告类型的内部实施的特殊信息。但我从经验中知道,做你想做的事情需要在低级别跳过特殊的篮球,所以iOS很可能根本不允许它。