2011-02-10 18 views

Respuesta

0

Esta solución es poco viejo, antes de la introducción de la manzana central del bluetooth

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     // Override point for customization after application launch. 


     Class BluetoothManager = objc_getClass("BluetoothManager") ; 
     id btCont = [BluetoothManager sharedInstance] ; 
     [self performSelector:@selector(status:) withObject:btCont afterDelay:1.0f] ; 

     return YES ; 
    } 


    - (void)status:(id)btCont 
    { 
     BOOL currentState = [btCont enabled] ; 
     //check the value of currentState 

    } 
2

Hay una forma en IOS 5 y superiores utilizando CoreBluetooth. La clase que puede usar es CBCentralManager. Tiene un 'estado' de propiedad que puede verificar para ver si Bluetooth está activado o no. (la enumeración CBCentralManagerState tiene el valor (es) con el que desea verificar).

+0

Esto solo funcionará para dispositivos con BT LE, es decir, iPhone 4S +, iPad 3+ – domsom

41

Un poco de investigación en Sam's answer que yo pensé en compartir puede hacerlo sin utilizar la API privada, pero con algunas salvedades:

  • Sólo funcionará en iOS 5.0+
  • Sólo funcionará en dispositivos que apoyan el bluetooth lE especificación (iPhone 4S +, quinta generación de iPod +, iPad tercera generación +)
  • simple asignación de la clase hará que su aplicación a pedir permiso para usar la pila Bluetooth del usuario (no puede se desea), y si se niegan, lo único que verá es CBCentralManagerStateUnauthorized
  • La recuperación del estado de bluetooth es asincrónica y continua. Usted tendrá que configurar un delegado para conseguir cambios de estado, como comprobar el estado de un gestor de Bluetooth recién asignado volverá CBCentralManagerStateUnknown

Dicho esto, este método no parece proporcionar actualizaciones en tiempo real del estado de la pila Bluetooth.

Después incluido el marco CoreBluetooth,

#import <CoreBluetooth/CoreBluetooth.h> 

Estas pruebas eran fáciles de realizar usando:

- (void)detectBluetooth 
{ 
    if(!self.bluetoothManager) 
    { 
     // Put on main queue so we can call UIAlertView from delegate callbacks. 
     self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()]; 
    } 
    [self centralManagerDidUpdateState:self.bluetoothManager]; // Show initial state 
} 

- (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 CBCentralManagerStatePoweredOff: stateString = @"Bluetooth is currently powered off."; break; 
     case CBCentralManagerStatePoweredOn: stateString = @"Bluetooth is currently powered 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]; 
} 
+2

Mencionó eso implícitamente, pero para consistencia: declare la propiedad '@property (no atómica, fuerte) CBCentralManager * bluetoothManager;' y configure su clase conforme al protocolo 'CBCentralManagerDelegate' –

+1

Esto no funcionó para mí. ¿Alguien ha conseguido esto para trabajar para ellos? iOS7 + – achi

+1

Puede evitar el mensaje de alerta usando el inicializador designado en CBCentralManager, revise esta respuesta: http://stackoverflow.com/a/19367494/823483 – bompf

5

Algunos cambios en la respuesta de BadPirate, con iOS7 puede establecer el gestor central no mostrar la alerta cuando se asigna el objeto administrador dándole un NSDictionary que tiene la clave "CBCentralManagerOptionShowPowerAlertKey" establecida en 0.

self.cbManager = [[CBCentralManager alloc] initWithDelegate:self 
                  queue:nil 
                 options: 
         [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] 
                forKey:CBCentralManagerOptionShowPowerAlertKey]]; 
9

Esta respuesta se ha actualizado del Objective-C original a Swift 4.0.

Se supone que ya ha creado un gestor de bluetooth y ha asignado el delegado a la clase ViewController.

import CoreBluetooth 

extension ViewController : CBCentralManagerDelegate { 
    func centralManagerDidUpdateState(_ central: CBCentralManager) { 
     switch central.state { 
     case .poweredOn: 
      print("powered on") 
     case .poweredOff: 
      print("powered off") 
     case .resetting: 
      print("resetting") 
     case .unauthorized: 
      print("unauthorized") 
     case .unsupported: 
      print("unsupported") 
     case .unknown: 
      print("unknown") 
     } 
    } 
} 
21

Para desactivar el mensaje de alerta por defecto sólo tiene que pasar a través de un diccionario de opción cuando se instancia la CBPeripheralManager:

SWIFT probado en iOS8 +

import CoreBluetooth 

//Define class variable in your VC/AppDelegate 
var bluetoothPeripheralManager: CBPeripheralManager? 

//On viewDidLoad/didFinishLaunchingWithOptions 
let options = [CBCentralManagerOptionShowPowerAlertKey:0] //<-this is the magic bit! 
bluetoothPeripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: options) 

Obviamente también es necesario para implementar el CKManagerDelegate el método de delegado peripheralManagerDidUpdateState como se describe anteriormente:

func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager!) { 

    var statusMessage = "" 

    switch peripheral.state { 
    case .poweredOn: 
     statusMessage = "Bluetooth Status: Turned On" 

    case .poweredOff: 
     statusMessage = "Bluetooth Status: Turned Off" 

    case .resetting: 
     statusMessage = "Bluetooth Status: Resetting" 

    case .unauthorized: 
     statusMessage = "Bluetooth Status: Not Authorized" 

    case .unsupported: 
     statusMessage = "Bluetooth Status: Not Supported" 

    case .unknown: 
     statusMessage = "Bluetooth Status: Unknown" 
    } 

    print(statusMessage) 

    if peripheral.state == .poweredOff { 
     //TODO: Update this property in an App Manager class 
    } 
} 
+0

cómo agregar propiedad ** CBPeripheralManager ** en swift. Dice que no puede encontrar un inicializador para el tipo "CBPeripheralManager" –

+0

@ Aravind.A agregue 'import CoreBluetooth' a la parte superior de su archivo de origen – Awesomeness

+1

Este fragmento de código es excelente para el silencio verificar el estado del bluetooth (on/off, etc.) –

Cuestiones relacionadas