iBeacon: didRangeBeacons deja de recibir llamadas, debe reiniciar el dispositivo para que funcione nuevamente

Estoy usando un delegado de BeaconManager personalizado para que el scope de la señal no esté determinado por el ciclo de vida del controlador de vista. Todo funciona muy bien, pero de vez en cuando (1-2 días) el scope de la baliza dejará de funcionar y didRangeBeacons nunca será llamado. La única forma de arreglar esto es reiniciar mi iPhone, una vez que lo hago, funciona perfectamente. A continuación está el código que estoy usando. El flujo básico es que cuando mi ViewController llama a ViewDidLoad envía una notificación a AppDelegate para indicarle que comience a rastrear para las balizas, nunca digo que se detenga porque quiero que continúe el rango para las balizas sin importar dónde navega el usuario a en la aplicación. Me pregunto si mi código está causando esto o si esto es solo un error con Bluetooth. ¡Gracias por tu ayuda!

BeaconManager.m

#import "BeaconManager.h" #import "AppDelegate.h" @interface BeaconManager() @property (nonatomic, strong) CLLocationManager *locationManager; @property (nonatomic, strong) CLBeaconRegion *beaconRegion; @end @implementation BeaconManager + (id)sharedManager { static BeaconManager *sharedBeaconManager = nil; static dispatch_once_t once; dispatch_once(&once, ^{ sharedBeaconManager = [[self alloc] init]; }); return sharedBeaconManager; } - (id)init { self = [super init]; if(self) { self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; } return self; } - (void)startBeaconMonitoring:(NSString*)forUUID { NSUUID * uuid = [[NSUUID alloc] initWithUUIDString:forUUID]; self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.beacons.publicRegion"]; [self.locationManager startMonitoringForRegion:self.beaconRegion]; [self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; } - (void)stopBeaconMonitoring { //Stop the region monitoring if(self.locationManager != nil && self.beaconRegion != nil) { [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion]; } } #pragma mark - CLLocationManagerDelegate - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { self.beacons = beacons; if(self.delegate != nil) { [self.delegate beaconManager:self didRangeBeacons:self.beacons]; } } @end 

ViewController.m

 @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] postNotificationName:@"startRanging" object:nil userInfo:nil]; } 

AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startRangingForZombies) name:@"startRanging" object: nil]; return YES; } - (void)startRanging { //Start the beacon region monitoring when the controller loads BeaconManager *beaconManager = [BeaconManager sharedManager]; beaconManager.delegate = self; [beaconManager startBeaconMonitoring:@"1234-54324-34242-34242-43243"]; } 

Hemos recibido muchos informes en Radius Networks de teléfonos que detienen la detección de iBeacons y requieren reiniciar o desactivar Bluetooth y volver a encenderlo para resolver la situación. La gente ha informado esto en iPhone 4S, iPhone 5s, iPhone 5c y iPads.

No tengo ninguna evidencia sólida de que esto sea algo que se rompió a partir de iOS 7.1, pero la frecuencia del informe ha aumentado desde su lanzamiento. La evidencia circunstancial es por lo tanto bastante fuerte.

Cuando este teléfono entra en este estado, el teléfono aún puede buscar dispositivos bluetooth y aún puede transmitir como iBeacon. Por lo tanto, no es un problema de hardware con Bluetooth. Según la evidencia disponible, es muy probable que se trate de un error recientemente introducido en CoreLocation.

En realidad, es un error conocido en iOS 7.1. Es estrictamente un problema de software con la stack Bluetooth para la última versión de iOS. La detección de dispositivos Bluetooth a veces simplemente deja de funcionar; desafortunadamente, es el caso de todos los dispositivos compatibles con iOS 7.1. El error ya ha sido informado a Apple, pero siempre que no emitan una solución para eso, la mejor solución es simplemente reiniciar el dispositivo.

Si reiniciar no ayuda, hay una guía práctica en SmartRobotic sobre cómo resolverlo: http://www.smartbotics.com/#!4-Tips-to-Fix-Bluetooth-Problems- After-iOS-71 -Upgrade / c118r / 031A86F6-C8E8-4768-B4FD-E6F83D9E4317

Si tiene problemas de conectividad Bluetooth después de actualizar a iOS 7.1, pruebe estos 4 consejos.

  1. Apagar y reiniciar : algunas personas han informado de que esto es todo lo que se necesitaba para reparar su dispositivo después de la actualización de iOS 7.1.
  2. Desconecte y vuelva a encender Bluetooth : deslice hacia arriba para acceder al Centro de control y toque el icono de Bluetooth, espere al menos 30 segundos y vuelva a encenderlo. Esto a menudo puede reparar un dispositivo que está experimentando problemas de conexión.
  3. Kill (force quit) la aplicación ofensiva : comience haciendo doble clic en Inicio para abrir la interfaz de tarjetas multitarea. Toca y mantén presionada la tarjeta para la aplicación, luego agítala y retírala. Esto obligará a la aplicación a cerrar y se volverá a cargar por completo la próxima vez que se abra la aplicación.
  4. Borre y restablezca el emparejamiento de su dispositivo Bluetooth – Vaya a Configuración> Bluetooth y toque el ícono (i) para el dispositivo infractor. Toca Olvidar este dispositivo. Ahora debería poder volver a agregar y volver a emparejar el hardware Bluetooth con su dispositivo. Para borrar todos los dispositivos emparejados, vaya a Configuración> General> Restablecer> Restablecer configuración de red y luego configure sus emparejamientos Bluetooth nuevamente.

Esperamos que estas sugerencias resuelvan sus problemas de conectividad Bluetooth.

Aclamaciones.

Apple introdujo cambios importantes en Bluetooth LE en 7.1 pero también rompió algo adentro.

De mis experimentos:

  • iPhone 4S 7.x – iBeacons funciona como un encanto

  • 2 x iPhone 4S 7.1, 2 x iPhone 5 7.1 – funciona bien pero requiere reiniciar de vez en cuando (indeterminado).

Parece un problema del sistema: uno grande. Me he puesto en contacto con Estimote, lo saben.

Dato interesante: no se pueden encontrar balizas, ni siquiera se puede estimar la aplicación de demostración, no se llaman los métodos de delegado, pero se puede convertir el dispositivo (roto) en una baliza y otros dispositivos lo descubrirán.

Descargo de responsabilidad: actualmente trabajo para sensorberg, estamos vendiendo beacons y un SDK.

También tenemos numerosos informes de este error. Pedimos a todos nuestros clientes que presenten un informe de error con Apple. Aquí hay una plantilla que puede usar: https://gist.github.com/anonymous/5283b6941e1f7d4e4461

Personalmente tuve el comportamiento dos veces, una vez que pude grabarlo: https://www.youtube.com/watch?v=6a6IJzaxxJg Solo fue útil reiniciar el dispositivo.

¡Continúa archivando los informes de errores de rdar de Apple!

Tuve el problema similar, pero después de un tiempo de investigación, me di cuenta de que no es correcto llamar a startMonitoringForRegion (region) y startRangingBeaconsInRegion (region) uno después del otro. Eso es lo que tú (Patrick) haces:

 - (void)startBeaconMonitoring:(NSString*)forUUID { NSUUID * uuid = [[NSUUID alloc] initWithUUIDString:forUUID]; self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.beacons.publicRegion"]; [self.locationManager startMonitoringForRegion:self.beaconRegion]; [self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; } 

En su lugar, debe llamarse a startRangingBeaconsInRegion (region) en el método locationManagerDelegate locationManager (manager: CLLocationManager !, didDetermineState state: CLRegionState, forRegion region: CLRegion!) (En este caso, el código Swift). Esta fue mi solución.

Tiene sentido, porque el primer paso es encontrar cualquier baliza en la región, el segundo es obtener información específica de la baliza ya monitoreada.