web-dev-qa-db-fra.com

Comment obtenir le statut de bluetooth (ON/OFF) dans iphone par programmation

J'essaie d'obtenir le statut de l'iPhone/iPod Bluetooth, qu'il soit activé ou désactivé par programme ... Est-il possible d'utiliser une API Apple ou une API tierce.

36
Nilikh

Un peu de recherche sur la réponse de Sam que je pensais partagerVous pouvez le faire sans utiliser une API privée, mais avec quelques réserves:

  • Cela ne fonctionnera que sur iOS 5.0+ 
  • Il ne fonctionne que sur les appareils qui prennent en charge les spécifications Bluetooth LE (iPhone 4S +, iPod de 5e génération, iPad De 3e génération +). 
  • Si vous allouez simplement la classe, votre application demandera l’autorisation d’utiliser la pile Bluetooth à l’utilisateur (ce qui peut ne pas être souhaitable), et s’ils refusent, la seule chose que vous verrez est CBCentralManagerStateUnauthorized. Révision iOS7 +: il est désormais possible d’empêcher les barrages mentionnés ci-dessus. Voir les commentaires ci-dessous qui pointent vers cette réponse qui explique que vous pouvez définir l’option CBCentralManagerOptionShowPowerAlertKey de CoreBluetooth sur NO pour empêcher les autorisations Invite. 
  • La récupération de l'état Bluetooth est asynchrone et continue. Vous devrez configurer un délégué pour obtenir les changements d'état, car la vérification de l'état d'un gestionnaire Bluetooth fraîchement alloué renverra CBCentralManagerStateUnknown.

Cela étant dit, cette méthode semble fournir des mises à jour en temps réel de l'état de la pile Bluetooth.

Après avoir inclus le framework CoreBluetooth, 

#import <CoreBluetooth/CoreBluetooth.h>

Ces tests étaient faciles à effectuer en utilisant:

- (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];
}
45
BadPirate

Pour désactiver le message d'alerte par défaut, il vous suffit de passer par un dictionnaire d'options lorsque vous instanciez CBPeripheralManager:

Swift testé sur 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)

Bien entendu, vous devez également implémenter la méthode déléguée CKManagerDelegate, périphériqueManagerDidUpdateState, comme indiqué ci-dessus:

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
    }
}
23
Tim

Cette réponse a été mise à jour d'Objective-C d'origine à Swift 4.0.

Il est supposé que vous avez déjà créé un gestionnaire Bluetooth et affecté le délégué à la classe 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")
        }
    }
}
10
CodeBender

Certaines mises à jour sur la réponse de BadPirate. Avec iOS7, vous pouvez configurer le gestionnaire central pour ne pas afficher l'alerte lors de l'allocation de l'objet gestionnaire en lui attribuant un NSDictionary dont la clé est "CBCentralManagerOptionShowPowerAlertKey". 

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

Il y a un moyen d'utiliser iOS 5 ou plus avec CoreBluetooth. La classe que vous pouvez utiliser est CBCentralManager. Il a une propriété «état» que vous pouvez vérifier pour voir si Bluetooth est activé ou non. (l'énumération CBCentralManagerState a la ou les valeurs que vous souhaitez vérifier).

2
Sam Griffith Jr.

Cette solution est un peu ancienne, avant qu'Apple n'introduise le noyau 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 

    }
0
Raj