tutorial setup programming how google eddystone beacons beacon ios bluetooth bluetooth-lowenergy ibeacon

ios - setup - Ejecute iPhone como un iBeacon en el fondo



how to setup beacon (4)

¿Es posible ejecutar un dispositivo iOS 7 como periférico Bluetooth LE (iBeacon) y hacer que se anuncie en segundo plano? Pude hacer que se publicitara en primer plano con el siguiente código y puedo verlo desde otro dispositivo iOS, pero tan pronto como regrese a la pantalla de inicio deja de anunciarse. Agregué el modo de fondo Bluetooth-periférico en el plist pero eso no pareció ayudar aunque recibo el mensaje que dice que el dispositivo quiere usar bluetooth en el fondo. ¿Estoy haciendo algo mal o esto simplemente no es posible en iOS 7?

peripManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil]; - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { if (peripheral.state != CBPeripheralManagerStatePoweredOn) { return; } NSString *identifier = @"MyBeacon"; //Construct the region CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:identifier]; //Passing nil will use the device default power NSDictionary *payload = [beaconRegion peripheralDataWithMeasuredPower:nil]; //Start advertising [peripManager startAdvertising:payload]; }

Aquí está el código que está en el extremo de recepción / escucha:

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { //Check if we have moved closer or farther away from the iBeacon… if (beacons.count > 0) { CLBeacon *beacon = [beacons objectAtIndex:0]; switch (beacon.proximity) { case CLProximityImmediate: [self log:[NSString stringWithFormat:@"You''re Sitting on it! %li", (long)beacon.rssi]]; break; case CLProximityNear: [self log:[NSString stringWithFormat:@"Getting Warmer! %li", (long)beacon.rssi]]; break; default: [self log:[NSString stringWithFormat:@"It''s around here somewhere! %li", (long)beacon.rssi]]; break; } } }


Los anuncios estándar de CoreBluetooth pueden emitirse mientras la aplicación está en segundo plano, pero no si se iniciaron con el diccionario CLBeaconRegion . La solución alternativa es deshacerse completamente del framework CoreLocation y crear su propio "framework" de proximidad usando solamente CoreBlueTooth.

Aún necesita utilizar los especificadores de fondo apropiados en el archivo Info.plist (por ejemplo, bluetooth-peripheral y bluetooth-central ).

El código se ve así:

1) crear un anuncio periférico estándar usando CBPeripheralManager

NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"my-peripheral", CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:identifier]]}; // Start advertising over BLE [peripheralManager startAdvertising:advertisingData];

2) use CBCentralManager para buscar ese servicio usando el UUID que especificó.

NSDictionary *scanOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey:@(YES)}; NSArray *services = @[[CBUUID UUIDWithString:identifier]]; [centralManager scanForPeripheralsWithServices:services options:scanOptions];

3) en el método didDiscoverPeripheral , lea el valor RSSI del anuncio.

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { NSLog(@"RSSI: %d", [RSSI intValue]); }

4) Traducir los valores de RSSI a una distancia.

- (INDetectorRange)convertRSSItoINProximity:(NSInteger)proximity { if (proximity < -70) return INDetectorRangeFar; if (proximity < -55) return INDetectorRangeNear; if (proximity < 0) return INDetectorRangeImmediate; return INDetectorRangeUnknown; }

Descubrí que necesitaba "facilitar" o "promediar" los valores de RSSI para que todo funcionara. Esto no es diferente de cuando está trabajando con cualquier dato de sensor (por ejemplo, datos de acelerómetro).

Tengo este concepto en pleno funcionamiento espero publicarlo en algún lugar en algún momento.

Además, use los docs (Core Core Programming Guide) si se queda atascado.

Actualización: una muestra de código completo está activa en Github . Trabajé en esto como parte de un proyecto relacionado con el trabajo .

Actualización n. ° 2: Apple presenta importantes mejoras en el comportamiento de fondo de iBeacon para iOS7.1


No, los dispositivos iOS solo anuncian iBeacon cuando la aplicación que hace la publicidad se ejecuta en primer plano. por lo tanto, si cambia a otra aplicación o si el dispositivo se queda dormido, el anuncio se detiene.

Por supuesto, si realmente desea que el anuncio continúe, desactive el temporizador inactivo y realice el Acceso guiado para que el dispositivo iOs no se quede dormido y nadie pueda cambiar a otra aplicación.


También espero poder configurar mi aplicación (prueba) para anunciar un iBeacon desde el fondo. Los documentos en la clave info.plist de UIBackgroundModes sugieren que la clave bluetooth-periférica podría funcionar, pero parece que no. (Acabo de probarlo hace unos minutos).

Lo que estoy haciendo por ahora es desactivar el temporizador inactivo, como sugiere RawMean, y luego configurar el brillo de la pantalla en 0. Finalmente, cuando mi aplicación de prueba está actuando como iBeacon, agrego un manejador de eventos shake que enciende la pantalla de nuevo por 30 segundos. Atenuar la pantalla lo más bajo posible ayuda a reducir el consumo de la batería.


¿Puedes oler el iBeacon? El artículo analiza tanto el uso de Estimotes como la publicidad desde Mac y dispositivos iOS. Debe verificar la capacidad "Actúa como accesorio Bluetooth LE" en el objetivo del proyecto.