it-swarm.com.de

Wie kann ich den Status von Bluetooth (EIN/AUS) programmgesteuert im iPhone abrufen?

Ich versuche, den Status des iPhone/iPod Bluetooth so zu ermitteln, dass es programmgesteuert ein- oder ausgeschaltet ist ... Ist es möglich, eine Apple-API oder eine Drittanbieter-API zu verwenden?.

36
Nilikh

Ein wenig Recherche zu Sams Antwort die ich dachte, ich würde sie teilen Sie können dies tun, ohne private API zu verwenden, aber mit ein paar Einschränkungen:

  • Es funktioniert nur unter iOS 5.0 und höher 
  • Es funktioniert nur auf Geräten, die die Bluetooth LE-Spezifikation unterstützen (iPhone 4S +, iPod der 5. Generation, iPad 3rd Generation +). 
  • Wenn Sie die Klasse einfach zuweisen, muss Ihre Anwendung die Berechtigung zur Verwendung des Bluetooth-Stapels vom Benutzer anfordern (möglicherweise nicht gewünscht). Wenn sie sich weigert, wird CBCentralManagerStateUnauthorized nur angezeigt iOS7 + Revision: Vorgenannter Durchschlag kann jetzt verhindert werden. Siehe untenstehende Kommentare, die auf diese Antwort zeigen, in denen erläutert wird, dass Sie die Option CBCentralManagerOptionShowPowerAlertKey von CoreBluetooth auf NO setzen können, um die Eingabeaufforderung von Berechtigungen zu verhindern. 
  • Das Abrufen des Bluetooth-Status erfolgt asynchron und kontinuierlich. Sie müssen einen Delegaten einrichten, um Statusänderungen zu erhalten. Wenn Sie den Status eines neu zugewiesenen Bluetooth-Managers prüfen, wird CBCentralManagerStateUnknown zurückgegeben

Allerdings scheint diese Methode Echtzeit-Aktualisierungen des Bluetooth-Stack-Status bereitzustellen.

Nach dem Einbinden des CoreBluetooth-Frameworks 

#import <CoreBluetooth/CoreBluetooth.h>

Diese Tests waren einfach durchzuführen mit:

- (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

Um die Standardwarnmeldung zu deaktivieren, müssen Sie beim Instanziieren des CBPeripheralManagers nur ein Optionswörterbuch durchgehen:

Schnell getestet auf 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)

Natürlich müssen Sie auch die CKManagerDelegate-Delegatenmethode peripherManagerDidUpdateState wie oben beschrieben implementieren:

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

Diese Antwort wurde vom ursprünglichen Objective-C auf Swift 4.0 aktualisiert.

Es wird davon ausgegangen, dass Sie bereits einen Bluetooth-Manager erstellt und den Delegaten der ViewController-Klasse zugewiesen haben.

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

Bei einigen Aktualisierungen der Antwort von BadPirate können Sie mit iOS7 festlegen, dass der zentrale Manager die Warnung bei der Zuweisung des Managerobjekts nicht anzeigt, indem Sie ihm ein NSDictionary mit dem Schlüssel "CBCentralManagerOptionShowPowerAlertKey" auf 0 zuweisen. 

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

Unter iOS 5 und höher gibt es eine Möglichkeit, CoreBluetooth zu verwenden. Die Klasse, die Sie verwenden können, ist CBCentralManager. Es gibt eine Eigenschaft, in der Sie prüfen können, ob Bluetooth aktiviert ist oder nicht. (Die Aufzählung CBCentralManagerState enthält die Werte, mit denen Sie prüfen möchten).

2

Diese Lösung ist etwas alt, bevor Apple Core Bluetooth einführt 

- (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