2013-10-14 7 views
15

Я пишу приложение для iOS, которое требует, чтобы приложение рекламировало iOS iBeacon, а также одновременно рекламировало периферийную услугу. Необходимо, чтобы услуга рекламировалась скорее, а просто обнаруживалась на периферии, потому что для использования используется центральный (на языке BLE) подключаться к периферийному устройству после того, как iOS (но все еще в фоновом режиме) пробуждается из-за близости к iBeacon. Приложения, работающие в фоновом режиме в центрах, могут обнаруживать периферию только доступным сервисом, а не открывать все периферийные устройства []; Мой код работает, чтобы рекламировать сервис или iBeacon, но я не понял, как сделать это одновременно. Возможно, что iBeacon использует 21 байт из 38 байт доступного пространства и просто недостаточно места для рекламы маяка, а также услуги?iOS CoreBluetooth/iBeacon: Рекламировать iBeacon и периферийную службу одновременно

Это работает (маяк):

self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
    major:1 
    minor:1 
    identifier:@"bentboolean"]; 
NSMutableDictionary *dict = [[self.beaconRegion peripheralDataWithMeasuredPower:nil] mutableCopy];  
[self.peripheralManager startAdvertising:dict ]; 

Это работает (услуга):

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
[dict setValue:@[serviceUUID] forKey:CBAdvertisementDataServiceUUIDsKey]; 
[self.peripheralManager startAdvertising:dict ]; 

Добавление двух вместе, пытаясь рекламировать обе службы в то же время не работает. Он рекламирует только Beacon, а не услугу:

self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
    major:1 
    minor:1 
    identifier:@"bentboolean"]; 
NSMutableDictionary *dict = [[self.beaconRegion peripheralDataWithMeasuredPower:nil] mutableCopy]; 
[dict setValue:@[serviceUUID] forKey:CBAdvertisementDataServiceUUIDsKey]; 
[self.peripheralManager startAdvertising:dict ]; 

Спасибо, что посмотрели!

+0

Привет, вы когда-нибудь это исправили? Я не думал, что это возможно из-за возможностей Bluetooth ... – CW0007007

ответ

-1

Я был в состоянии получить это происходит с отдельным CLLocationManager и CLBeaconRegion для обоих и приемником радиомаяка отдельно:

#import "GRBothViewController.h" 

@interface GRBothViewController() 

@end 

@implementation GRBothViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


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

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

    [self initBeacon]; 
    [self initRegion]; 
    [self locationManager:self.locationManager didStartMonitoringForRegion:self.scannerRegion]; 
} 

- (void)initBeacon { 
    NSLog(@"Starting beacon"); 

    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString: @"23542266-18D1-4FE4-B4A1-23F8195B9D39"]; 
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
                   major:1 
                   minor:1 
                  identifier:@"com.thisisgrow.Grow"]; 
    [self transmitBeacon:self]; 
} 

- (IBAction)transmitBeacon:(id)sender { 
    self.beaconPeripheralData = [self.beaconRegion peripheralDataWithMeasuredPower:nil]; 
    self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self 
                    queue:nil 
                    options:nil]; 
} 

-(void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { 
    if (peripheral.state == CBPeripheralManagerStatePoweredOn) { 
     NSLog(@"Powered On"); 
     [self.peripheralManager startAdvertising:self.beaconPeripheralData]; 
    } else if (peripheral.state == CBPeripheralManagerStatePoweredOff) { 
     NSLog(@"Powered Off"); 
     [self.peripheralManager stopAdvertising]; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { 
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; 
} 

- (void)initRegion { 
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"23542266-18D1-4FE4-B4A1-23F8195B9D39"]; 
    _scannerRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.thisisgrow.Grow"]; 
    _scannerRegion.notifyEntryStateOnDisplay = YES; 
    [_locationScanner startMonitoringForRegion:self.scannerRegion]; 
} 

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { 
    //SCANNER 
    [self.locationScanner startRangingBeaconsInRegion:self.scannerRegion]; 
} 

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
    //SCANNER HAS LEFT THE AREA 
    [self.locationScanner stopRangingBeaconsInRegion:self.scannerRegion]; 
} 

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { 
    CLBeacon *beacon = [[CLBeacon alloc] init]; 
    NSLog(@"Beacons: %d", [beacons count]); 
    if(beacons && [beacons count]>0){ 
     beacon = [beacons firstObject]; 
    } 
    else{ 

    } 
} 

Единственным ограничением здесь является то, что устройство не может обнаружить себя.

+0

Еще одно интересное замечание, которое я видел: даже если * другое приложение объявлено как iBeacon, ваше приложение не сможет его обнаружить. Более того, если внешний iBeacon существует, рекламируя одни и те же идентификаторы, ваше приложение все еще не может его обнаружить. Другими словами, реклама идентификатора iBeacon ID блокирует любые обнаружения одного и того же набора идентификаторов. – davidgyoung

+0

Правда, однако, при использовании устройства в качестве iBeacon достаточно просто автогенерировать уникальный UUID для устройства (даже при запуске при желании), если вы хотите использовать их для этой цели. Для меня наиболее ограничивающими факторами являются тот факт, что 1) устройство, используемое в качестве iBeacon, не будет транслироваться в фоновом режиме AT ALL, а 2) приложения не могут располагаться для отдельных iBeacon в фоновом режиме, кроме тех случаев, когда они разбужены onEnter и onLeave, которые срабатывают только при входе или выходе из регионов UUID. – d2burke

+0

@ d2burke Вы упомянули, что устройство, используемое в качестве iBeacon, вообще не будет транслироваться в фоновом режиме. Вы знаете, если это так, даже если приложение использует фоновый режим bluetooth-периферии? – darrinm

0

В моей практике iBeacon & Служба BLE не может рекламировать в одно и то же время.

Служба BLE не может размещать рекламу на переднем плане, если реклама размещена в iBeacon. iBeacon не может рекламировать в фоновом режиме.

iBeacon & Служба BLE может рекламировать один за другим, например. iBeacon рекламирует 0,5 секунды, затем Услуга BLE рекламирует 30,0 секунд.

Надеюсь, это будет полезно

Смежные вопросы