How to get the status of bluetooth (ON/OFF) in iphone programmatically How to get the status of bluetooth (ON/OFF) in iphone programmatically ios ios

How to get the status of bluetooth (ON/OFF) in iphone programmatically


A little bit of research into Sam's answer that I thought I'd shareYou can do so without utilizing private API, but with a few caveats:

  • It will only work on iOS 5.0+
  • It will only work on devices thatsupport the bluetooth LE spec (iPhone 4S+, 5th Generation iPod+, iPad3rd Generation+)
  • Simply allocating the class will cause your application to ask permission to use the bluetooth stack from the user (may not be desired), and if they refuse, the only thing you'll see is CBCentralManagerStateUnauthorized iOS7+ Revision: Aforementioned strike-through can now be prevented, see comments below which point to this answer which explains you can set CoreBluetooth's CBCentralManagerOptionShowPowerAlertKey option to NO to prevent permissions prompt.
  • Retrieval of bluetooth state is async, and continuous. You will need to setup a delegate to get state changes, as checking the state of a freshly allocated bluetooth manager will return CBCentralManagerStateUnknown

That being said, this method does seem to provide real time updates of bluetooth stack state.

After including the CoreBluetooth framework,

#import <CoreBluetooth/CoreBluetooth.h>

These tests were easy to perform using:

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


To disable the default alert message you just need to pass through an option dictionary when you instantiate the CBPeripheralManager:

SWIFT tested on iOS8+

import CoreBluetooth//Define class variable in your VC/AppDelegatevar bluetoothPeripheralManager: CBPeripheralManager? //On viewDidLoad/didFinishLaunchingWithOptionslet options = [CBCentralManagerOptionShowPowerAlertKey:0] //<-this is the magic bit!bluetoothPeripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: options)

Obviously you also need to implement the CKManagerDelegate delegate method peripheralManagerDidUpdateState as outlined above as well:

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


This answer has been updated from the original Objective-C to Swift 4.0.

It is assumed that you have already created a bluetooth manager and assigned the delegate to the ViewController class.

import CoreBluetoothextension 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")        }    }}