iOS: comtesting si el bluetooth está activado sin una window emergente de alerta del sistema para el usuario

Este código permite determinar el estado actual del bluetooth:

CBCentralManager* testBluetooth = [[CBCentralManager alloc] initWithDelegate:nil queue: nil]; switch ([testBluetooth state]) {....} 

Pero, cuando [[CBCentralManager alloc] init …] sucede, el sistema despierta una alerta para el usuario, si el bluetooth está apagado.

¿Hay alguna forma de comprobar el estado del bluetooth sin molestar a mis usuarios?

Recibí la siguiente respuesta de un desarrollador de Apple: en iOS7, la opción CBCentralManagerOptionShowPowerAlertKey te permite deshabilitar esta alerta.

Si tiene un CBCentralManager cuando lo inicializa, puede usar el método initWithDelegate:queue:options

Ejemplo:

En mi file .h tengo un CBCentralManager * manager

En el file .m:

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerOptionShowPowerAlertKey, nil]; _manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options]; [_manager scanForPeripheralsWithServices:nil options:nil]; 

Con este código, la advertencia ya no aparece, ¡espero que eso ayude!

Rápidamente puede escribir estas dos líneas en el delegado de la aplicación dentro de la function: didFinishLaunchingWithOptions launchOptions

  self.bCentralManger = CBCentralManager(delegate: self, queue: dispatch_get_main_queue(), options: [CBCentralManagerOptionShowPowerAlertKey: false]) self.bCentralManger.scanForPeripheralsWithServices(nil, options: nil) 

donde su bCentralManger debe declararse como:

private var bCentralManger: CBCentralManager!

Actualmente no hay forma de desactivar esta alerta cuando su aplicación se ejecuta en un dispositivo iOS que admite Bluetooth LE y donde Bluetooth está deshabilitado. Sería una request de mejora proporcionar un medio para deshabilitar la alerta. Entonces, cuanto más solicite Apple sobre esta mejora, mejor.

He utilizado el siguiente código para deshabilitar la alerta para iOS 8 y la versión anterior.

 self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue() options:@{CBCentralManagerOptionShowPowerAlertKey: @(NO)}]; [self.bluetoothManager scanForPeripheralsWithServices:nil options:nil]; 

Solo he probado esto en iOS 9, así que tal vez alguien pueda probar este dispositivo OS más antiguo.

Hacemos todo normalmente excepto una cosa, en lugar de configurar el delegado de viewDidLoad en viewDidLoad lo dejamos hasta el momento en que lo necesitamos, en el caso de ejemplo a continuación, lo llamo una vez que mi WKWebView ha terminado de cargarse y porque cada página de mi web ve potencialmente requiere el uso de Bluetooth. Puse esto en WKWebView didFinishNavigation .

Rápido

 var managerBLE: CBCentralManager? func bluetoothStatus() { managerBLE = CBCentralManager(delegate: self, queue: nil, options: nil) } func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) { bluetoothStatus() } func centralManagerDidUpdateState(central: CBCentralManager) { switch managerBLE!.state { case CBCentralManagerState.PowenetworkingOff: print("Powenetworking Off") case CBCentralManagerState.PowenetworkingOn: print("Powenetworking On") case CBCentralManagerState.Unsupported: print("Unsupported") case CBCentralManagerState.Resetting: print("Resetting") fallthrough case CBCentralManagerState.Unauthorized: print("Unauthorized") case CBCentralManagerState.Unknown: print("Unknown") default: break; } } 

El momento en que se establece el delegado en bluetoothStatus() , verá que el estado cambia de estado.

La notificación para activar Bluetooth solo parece que se llama directamente a la carga inicial de la aplicación, de esta forma, significa que obtienes lo que deseas del centralManagerDidUpdateState

Combinando la respuesta de BadPirate y Anas , puede get el estado del bluetooth sin mostrar la alerta del sistema.

 #import <CoreBluetooth/CoreBluetooth.h> @interface ShopVC () <CBCentralManagerDelegate> @property (nonatomic, strong) CBCentralManager *bluetoothManager; @end @implementation ShopVC - (void)viewDidLoad { [super viewDidLoad]; if(!self.bluetoothManager) { NSDictionary *options = @{CBCentralManagerOptionShowPowerAlertKey: @NO}; self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options]; } } #pragma mark - CBCentralManagerDelegate - (void)centralManagerDidUpdateState:(CBCentralManager *)central { NSString *stateString = nil; switch(self.bluetoothManager.state) { case CBCentralManagerStateResetting: stateString = @"The connection with the system service was momentarily lost, update imminent."; break; case CBCentralManagerStateUnsupported: stateString = @"The platform doesn't support Bluetooth Low Energy."; break; case CBCentralManagerStateUnauthorized: stateString = @"The app is not authorized to use Bluetooth Low Energy."; break; case CBCentralManagerStatePowenetworkingOff: stateString = @"Bluetooth is currently powenetworking off."; break; case CBCentralManagerStatePowenetworkingOn: stateString = @"Bluetooth is currently powenetworking on and available to use."; break; default: stateString = @"State unknown, update imminent."; break; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Bluetooth state" message:stateString delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil]; [alert show]; }