@GoreDefex Пожалуйста, посмотрите на вопрос. Мне тоже нужен ответ на тот же вопрос: stackoverflow.com/questions/47813624

имаюсь этим более 3 месяцев и выдергиваю волосы. Поэтому, пожалуйста, не отвечайте новичкам.

Мне интересно, есть ли в 2017 году с iOS 10+ ЛЮБОЙ способ вывести приложение из завершенного состояния ... предпочтительно через периферийное устройство Bluetooth ... но я возьму то, что смогу получить!

Я считаю прекращено, когдапользователь пролистал приложение в диспетчере задач или когда периферийное устройство включено / выключено, и приложение уже было мертвым

Мне нужны важные периферийные данные BT, связанные со здоровьем (записанные устройством BT), которые хранятся в приложении, поэтому мне нужно постоянное соединение или возможность восстановить приложение и обработать данные. Я знаю, что об этом часто спрашивают, поэтому я пытаюсь найти наиболее актуальное понимание или решения этой проблемы. Я прочитал ооочень много статей и С.О. сообщения об этом, так что я знаю, что Core Bluetooth ненадежен в лучшем случае. Я знаю, что общая концепция ненадежна, и люди говорят, что с 2010 года это невозможно. Однако в iOS многое меняется, поэтому я надеялся, что что-то изменится.

Чтобы было ясно:

Пробуждение по протоколу BT было бы замечательно, но на самом деле оно не было надежным, поэтому ... Я возьму ЛЮБОЙ вид надежного пробуждения (местоположение, аудио, BT и т. Д., Но НЕ iBeacon, поскольку я подключен / подключен к устройству BT) , Если мне придется «взломать» пробуждение, чтобы оно произошло на месте или аудио, а затем как-то быстро получить данные с периферийного устройства, я возьму это!

Я пытался:

(Пропустите это, если вы не заботитесь или не применимы)

Фоновый центральный режим включен в info.plist

Используя полное восстановление состояния, то есть этот код ...

self.centralManager = [[CBCentralManager alloc] initWithDelegate:self
                                                           queue:nil
                                                             options:@{CBCentralManagerOptionShowPowerAlertKey: @(YES),
                                                                       CBCentralManagerOptionRestoreIdentifierKey:@"MyDevice"}];

Чтобы зарегистрировать идентификатор ключа и этот код ...

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"launch options found: %@", launchOptions);
    NSArray *centralManagerIdentifiers = launchOptions[UIApplicationLaunchOptionsBluetoothCentralsKey];

    NSLog(@"central managers found in launch options: %@", centralManagerIdentifiers);
    [self triggerLocalNotification:[NSString stringWithFormat:@"central managers found in launch options: %@", centralManagerIdentifiers]];

    if([centralManagerIdentifiers count] > 0) {
        for(NSString *identifier in centralManagerIdentifiers) {
            if([identifier isEqualToString:@"MyDevice"]) {
                [self triggerLocalNotification:[NSString stringWithFormat:@"Identifier found: %@", identifier]];
                self.bluetoothManager = [BluetoothMgr sharedInstance];
            }
        }
    }

    return YES;
}

- (void)centralManager:(CBCentralManager *)central
  willRestoreState:(NSDictionary<NSString *,id> *)state {

    NSLog(@"************** RESTORED STATE BT **************");
    [self triggerCustomLocalNotification:@"************** RESTORED STATE BT **************"];

    NSLog(@"central manager object: %@", central);
    NSLog(@"state dictionary: %@", state);

    [self triggerCustomLocalNotification:[NSString stringWithFormat:@"state dictionary: %@", state]];


    NSArray *restoredPeripherals = [state objectForKey:@"CBCentralManagerRestoredStatePeripheralsKey"];

    self.centralManager = central;
    self.centralManager.delegate = self;

    if([restoredPeripherals count] > 0) {
        for(CBPeripheral *peripheral in restoredPeripherals) {
            if([peripheral.name rangeOfString:@"mybox-"].location != NSNotFound) {
                NSLog(@"Restoring mybox Box: %@", peripheral);
                [self triggerCustomLocalNotification:[NSString stringWithFormat:@"Peripheral was found in WILL RESTORE STATE! it was: %@", peripheral]];

                self.myPeripheral = peripheral;
                self.myPeripheral.delegate = self;

                [self connectToDevice];

                return;
            }
        }
    }
}

Для восстановления центрального управляющего государством. Это работает только тогда, когда приложение убито iOS или состояние изменено. Не работает, когда пользователь убивает приложение.

Подписка на уведомляющую характеристику в устройстве (я создал эту пользовательскую характеристику и полностью контролирую программирование устройства) ... это работает очень хорошо, но не всегда вызывает пробуждение приложения. Хорошо работает в фоновом режиме, хотя. Просто не прекращено.

Попытка полностью отключиться после завершения, чтобы я мог использовать iBeacon, чтобы разбудить ... слишком много обручей, и в конце концов он не работает надежно вообще.Значительные обновления местоположения ... крайне ненадежныйЗапись звука ... нет методов запуска, когда он начинает запись (что я мог найти в любом случае) или методы, которые запускаются периодически во время записи

Ответы на вопрос(1)

Ваш ответ на вопрос