CLBeaconRegion, как отключить предупреждение: включите Bluetooth, чтобы разрешить * для подключения к аксессуарам

У нас есть проект, использующий регионы CoreLocation для мониторинга входа / выхода из области iBeacon в фоновом режиме приложения. CLBeaconRegion (CLRegion), CLBeacon и т. Д. CLLocationManager возвращает обратные вызовы при вводе области CLBeacon (iBeacon). Это легкая оболочка вокруг BluetoothManager внизу.

// various CLLocation delegate callback examples
- (void) locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region;
- (void) locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region;

Проблема, с которой мы сталкиваемся, заключается в том, что, когда у пользователя не включен Bluetooth, Iphone регулярно выдает предупреждение на системном уровне: "Включите Bluetooth, чтобы разрешить"APP_NAME"подключаться к аксессуарам". Это часто случается, я получил это 4 раза сегодня утром, так как приложение работает в фоновом режиме. CLLocationManager может пытаться отслеживать эти CLBeaconRegion, но Bluetooth отключен, поэтому он не может этого сделать.

В другом посте упоминается, что CBCentralManager имеет свойство CBCentralManagerOptionShowPowerAlertKey, которое позволяет отключить это предупреждение.

iOS CoreBluetooth пассивно проверяет, включен ли Bluetooth, не предлагая пользователю включить Bluetooth

К сожалению, я не нашел способа получить доступ к лежащему в основе Bluetooth или какой-либо ссылке на CBCentralManager, чтобы использовать это.

Есть ли способ отключить это предупреждение для мониторинга CLBeaconRegion?

1 ответ

Я разработал решение, которое использует CoreBluetooth и CBCentralManager обнаружение, остановка и запуск использования Bluetooth. Ниже приведена большая часть кода, а также начальная проверка, чтобы увидеть, включен ли он перед запуском. Он работает для подавления сообщения об ошибке, гарантируя, что маяки не используются, когда Bluetooth выключен. Если он отключен, маяки останавливаются. Таким образом, предупреждение уходит. К сожалению, мы не можем фактически включить / отключить Bluetooth программно.

// initialize in viewdidLoad, etc
_bluetoothManager =  [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{CBCentralManagerOptionShowPowerAlertKey:@NO}];


// bluetooth manager state change
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    NSString *stateString = nil;
    switch(central.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;
    }

    if(_bluetoothState != CBCentralManagerStateUnknown && _bluetoothState != CBCentralManagerStatePoweredOn && central.state == CBCentralManagerStatePoweredOn){
         NSLog(@"BEACON_MANAGER: Bluetooth just enabled. Attempting to start beacon monitoring.");
        _forceRestartLM = YES; // make sure we force restart LMs on next update, since they're stopped currently and regions may not be updated to trigger it
        [self startBeaconMonitoring];
    }

    if(_bluetoothState != CBCentralManagerStateUnknown && _bluetoothState == CBCentralManagerStatePoweredOn && central.state != CBCentralManagerStatePoweredOn)    {
        NSLog(@"BEACON_MANAGER: Bluetooth just disabled. Attempting to stop beacon monitoring.");
        [self stopBeaconMonitoring];
    }
}
Другие вопросы по тегам