IOS - проверьте, включен ли bluetooth без всплывающего всплывающего окна системы
Этот код позволяет определить текущий статус bluetooth:
CBCentralManager* testBluetooth = [[CBCentralManager alloc] initWithDelegate:nil queue: nil];
switch ([testBluetooth state]) {....}
Но когда происходит [[CBCentralManager alloc] init...], система выдает предупреждение пользователю, если bluetooth выключен.
Есть ли способ проверить статус bluetooth, не нарушая моих пользователей?
Ответы
Ответ 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];
}