Подтвердить что ты не робот

IOS - проверьте, включен ли bluetooth без всплывающего всплывающего окна системы

Этот код позволяет определить текущий статус bluetooth:

CBCentralManager* testBluetooth = [[CBCentralManager alloc] initWithDelegate:nil queue: nil];


switch ([testBluetooth state]) {....}

Но когда происходит [[CBCentralManager alloc] init...], система выдает предупреждение пользователю, если bluetooth выключен.

Есть ли способ проверить статус bluetooth, не нарушая моих пользователей?

4b9b3361

Ответ 1

Я получил следующий ответ от разработчика Apple: В iOS7 параметр CBCentralManagerOptionShowPowerAlertKey позволяет отключить это предупреждение.

Если у вас есть CBCentralManager, когда вы его инициализируете, вы можете использовать метод initWithDelegate:queue:options

Пример:

В моем файле .h у меня есть CBCentralManager * manager

В .m файле:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerOptionShowPowerAlertKey, nil];

_manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options];

[_manager scanForPeripheralsWithServices:nil options:nil];

С этим кодом предупреждение больше не появляется, я надеюсь, что это поможет!

Ответ 2

В быстром режиме вы можете написать эти две строки в своем делетете приложения внутри функции: didFinishLaunchingWithOptions launchOptions

    self.bCentralManger = CBCentralManager(delegate: self, queue: dispatch_get_main_queue(), options: [CBCentralManagerOptionShowPowerAlertKey: false])
    self.bCentralManger.scanForPeripheralsWithServices(nil, options: nil)

где ваш bCentralManger должен быть объявлен как:

частный var bCentralManger: CBCentralManager!

Ответ 3

В настоящее время нет способа отключить это предупреждение, когда ваше приложение запускается на устройстве iOS, которое поддерживает Bluetooth LE и где Bluetooth отключен. Это был бы запрос на повышение, чтобы предоставить средства для отключения предупреждения. Таким образом, чем больше запросов Apple получает об этом улучшении, тем лучше.

Ответ 4

Я использовал ниже код для отключения предупреждения для iOS 8 и выше версии

self.bluetoothManager = [[CBCentralManager alloc]
                                      initWithDelegate:self 
                                      queue:dispatch_get_main_queue() 
                                      options:@{CBCentralManagerOptionShowPowerAlertKey: @(NO)}];

[self.bluetoothManager scanForPeripheralsWithServices:nil options:nil];

Ответ 5

Я тестировал это только на iOS 9, поэтому, возможно, кто-то может протестировать это более старые ОС-устройства.

Мы делаем все нормально, кроме одного, вместо настроек CBCentralManager Delegate в viewDidLoad мы оставляем это до момента, когда нам это нужно, в приведенном ниже примере я вызываю это, как только мой WKWebView завершит загрузку, и поскольку каждая страница моего веб-представления потенциально требует использования Bluetooth, я помещаю это в WKWebView didFinishNavigation.

Swift

var managerBLE: CBCentralManager?

func bluetoothStatus() {
    managerBLE = CBCentralManager(delegate: self, queue: nil, options: nil)
}

func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
    bluetoothStatus()
}

func centralManagerDidUpdateState(central: CBCentralManager) {
    switch managerBLE!.state
    {
    case CBCentralManagerState.PoweredOff:
        print("Powered Off")
    case CBCentralManagerState.PoweredOn:
        print("Powered On")
    case CBCentralManagerState.Unsupported:
        print("Unsupported")
    case CBCentralManagerState.Resetting:
        print("Resetting")
        fallthrough
    case CBCentralManagerState.Unauthorized:
        print("Unauthorized")
    case CBCentralManagerState.Unknown:
        print("Unknown")
    default:
        break;
    }
}

В тот момент, когда делегат установлен в пределах bluetoothStatus(), вы увидите огонь смены состояния.

Уведомление о включении Bluetooth только, кажется, хочет, чтобы его вызывали прямо при начальной загрузке вашего приложения, делая это таким образом, означает, что вы просто получаете то, что хотите от centralManagerDidUpdateState

Ответ 6

Объединив ответ BadPirate и Anas, вы можете получить состояние bluetooth без уведомления о системной системе.

#import <CoreBluetooth/CoreBluetooth.h>

@interface ShopVC () <CBCentralManagerDelegate>

@property (nonatomic, strong) CBCentralManager *bluetoothManager;

@end

@implementation ShopVC

- (void)viewDidLoad {
    [super viewDidLoad];

    if(!self.bluetoothManager)
    {
        NSDictionary *options = @{CBCentralManagerOptionShowPowerAlertKey: @NO};
        self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options];
    }
}

#pragma mark - CBCentralManagerDelegate

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