Ios 同时播发、扫描和监控iBeacon和CBP外围设备

Ios 同时播发、扫描和监控iBeacon和CBP外围设备,ios,objective-c,ibeacon,bluetooth-lowenergy,cbperipheral,Ios,Objective C,Ibeacon,Bluetooth Lowenergy,Cbperipheral,我同时在为一个NSDictionary中的一个BLE外设和一个信标做广告,并由同一个CBPeripheralManager做广告。在同一个应用程序中,我正在扫描BLE外围设备并监视信标 它不起作用——同时为外围设备和灯塔做广告似乎会引起奇怪的冲突。在前台,将检测到信标(区域输入),但CBP外围设备的回调不会触发。当设备A启动应用程序时,在设备B上运行的应用程序上触发外围回调,服务和特征查询按预期运行 该行为表明,当应用程序位于前台时,信标广告会阻止外围设备广告,但当应用程序位于后台时,外围设备广

我同时在为一个NSDictionary中的一个BLE外设和一个信标做广告,并由同一个CBPeripheralManager做广告。在同一个应用程序中,我正在扫描BLE外围设备并监视信标

它不起作用——同时为外围设备和灯塔做广告似乎会引起奇怪的冲突。在前台,将检测到信标(区域输入),但CBP外围设备的回调不会触发。当设备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];
[_searchManager scanForPeripheralsWithServices:serviceUUIDs options:@{CBCentralManagerScanOptionSolicitedServiceUUIDsKey: serviceUUIDs, CBCentralManagerScanOptionAllowDuplicatesKey:continuousSearch}];
这就产生了:

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

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

我一直在努力让它发挥作用,但我不愿意承认。。。我是否误解了一些简单的事情?苹果是否限制了该领域的某些功能?

不幸的是,从您的描述中可以看出,您无法同时为iBeacon和其他外围服务做广告

这并不出人意料。信标以10 Hz的频率发布广告,虽然大多数蓝牙芯片允许更频繁的传输,但它们通常不支持芯片级的交织。这意味着,如果iOS想要在所有芯片(所有iPhone和iPad机型)上同时播放这两种广告类型,它就必须包含特殊代码才能让芯片做到这一点。听起来像我,其实不然


明确地说,我没有关于在iOS上同时播放多种广告类型的内部实施的特殊信息。但我从经验中确实知道,做你想做的事情需要在低水平上跳过特殊的障碍,因此很可能iOS根本不允许这样做。

iOS应用程序不能在后台充当灯塔,这可能是你看到外围设备在后台正确运行的原因。为什么你想成为一个灯塔和外围设备?外设就足够了,特别是当你在后台做广告和连接时。我想利用iOS信标功能,让应用程序在进入某个区域时,即使没有运行(刚刚安装),也能获得回调。在这种情况下,该区域将靠近另一台设备上运行的应用程序副本(在前台)。如果你知道你正在寻找的服务的UUID(因为它是你的服务,所以你会知道),那么你可以在后台扫描这些外围设备。更重要的是,你的应用程序可以在后台宣传这项服务。使用信标的广告应用程序将需要在前台与手机解锁。当然-我有中央/外围工作在前台和后台。我只是想在功能上扩展一点,这样我就可以在一个甚至没有运行应用程序的设备上采取一些行动,当它靠近一个在前台的设备时。如前所述,问题似乎是在前台同时发布信标和外设广告。但如果使用蓝牙状态恢复,当应用程序未运行时,您可以收到外设发现的通知