Как программно получить статус bluetooth (ON / OFF) в iphone - PullRequest
38 голосов
/ 10 февраля 2011

Я пытаюсь получить статус iPhone / iPod Bluetooth, который включен или выключен программно. Возможно ли использовать какой-нибудь Apple API или сторонний API.

Ответы [ 6 ]

47 голосов
/ 22 марта 2013

Небольшое исследование ответа Сэма , о котором я думал, что поделюсь. Вы можете сделать это без использования частного API, но с несколькими оговорками:

  • Это будетработает только на iOS 5.0+
  • Он будет работать только на устройствах, которые поддерживают спецификацию bluetooth LE (iPhone 4S +, iPod 5-го поколения, iPad 3-го поколения +)
  • Простое распределение классазаставьте ваше приложение запрашивать разрешение на использование стека bluetooth у пользователя (может быть нежелательно), и если они откажутся, единственное, что вы увидите, это CBCentralManagerStateUnauthorized iOS7 + Revision: вышеупомянутый проход теперь можно предотвратитьсм. комментарии ниже, которые указывают на этот ответ , который объясняет, что вы можете установить опцию CoreBluetooth CBCentralManagerOptionShowPowerAlertKey на НЕТ, чтобы запретить разрешение.
  • Получение состояния Bluetooth является асинхронным и непрерывным.Вам потребуется настроить делегата для получения изменений состояния, так как проверка состояния только что выделенного менеджера Bluetooth вернет CBCentralManagerStateUnknown

При этом, похоже, этот метод действительно обеспечивает обновление стека Bluetooth в реальном временисостояние.

После включения инфраструктуры CoreBluetooth

#import <CoreBluetooth/CoreBluetooth.h>

Эти тесты было легко выполнить с помощью:

- (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];
}
23 голосов
/ 16 июля 2015

Чтобы отключить предупреждающее сообщение по умолчанию, вам просто нужно пройти через словарь опций при создании экземпляра CBPeripheralManager:

SWIFT, протестированный на 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)

Очевидно, вам также нужно реализоватьCKManagerDelegate метод делегата ПериферийныйManagerDidUpdateState также описан выше:

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
    }
}
10 голосов
/ 16 февраля 2015

Этот ответ был обновлен с оригинальной версии Objective-C до Swift 4.0.

Предполагается, что вы уже создали менеджер Bluetooth и присвоили делегату класс 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")
        }
    }
}
5 голосов
/ 08 сентября 2014

Некоторые обновления в ответе BadPirate. В iOS7 вы можете настроить центральный менеджер не показывать предупреждение при выделении объекта менеджера, назначив ему NSDictionary с ключом «CBCentralManagerOptionShowPowerAlertKey», установленным в 0.

self.cbManager = [[CBCentralManager alloc] initWithDelegate:self
                                                          queue:nil
                                                        options:
                      [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0]
                                                  forKey:CBCentralManagerOptionShowPowerAlertKey]];
2 голосов
/ 02 августа 2012

Существует способ на iOS 5 и выше с использованием CoreBluetooth. Класс, который вы можете использовать, - CBCentralManager. У него есть свойство 'state', которое вы можете проверить, чтобы увидеть, включен Bluetooth или нет. (перечисление CBCentralManagerState содержит значения, с которыми вы хотите проверить).

0 голосов
/ 07 июля 2011

Это решение немного устарело, до того как Apple представила ядро ​​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 

    }
...