No iOS 10 ou superior, existe QUALQUER maneira de ativar um aplicativo de forma CONFIÁVEL

Eu estive nisso por mais de 3 meses e puxando meu cabelo. Portanto, não responda com respostas para iniciantes.

Gostaria de saber se, em 2017 com o iOS 10+, há QUALQUER maneira possível ativar o aplicativo do estado finalizado ... de preferência por periférico bluetooth ... mas vou levar o que posso obter!

Considero encerrado quandoo usuário passou o aplicativo no gerenciador de tarefas ou quando o periférico está ligado / desligado e o aplicativo já está morto

Preciso de dados periféricos BT importantes relacionados à saúde (registrados pelo dispositivo BT) mantidos no aplicativo, por isso preciso de uma conexão consistente ou da capacidade de ativar o aplicativo e fazer o backup dos dados. Sei que isso é muito solicitado, estou tentando encontrar o entendimento ou as soluções mais atuais para esse problema. Eu li tantos artigos e S.O. postagens sobre isso, então eu sei que o Core Bluetooth não é confiável, na melhor das hipóteses. Eu sei que o conceito geral é esquisito e as pessoas vêm dizendo desde 2010 que não é possível. No entanto, muitos continuam mudando no iOS, então eu esperava que algo tivesse mudado.

Para ser claro:

O despertar da BT seria ótimo, mas realmente não é confiável, então ... Levarei QUALQUER tipo de despertar confiável (localização, áudio, BT, etc ... NÃO no iBeacon, já que estou conectado / emparelhado ao dispositivo BT) . Se eu tiver que "hackear" o despertador para acontecer no local ou no áudio e rapidamente obter os dados do periférico de alguma forma, eu aceito!

Eu tentei:

(Pule isso se você não se importa ou não é aplicável)

Modo central em segundo plano ativado em info.plist

Usando restauração de estado completa, ou seja, esse código ...

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

Para registrar a chave identificadora e este código ...

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

Para restaurar o estado do gerente central. Isso funciona apenas quando o aplicativo é eliminado pelo iOS ou o estado é alterado. Não funciona quando o usuário mata o aplicativo.

Assinando uma característica de notificação no dispositivo (criei essa característica personalizada e tenho controle total sobre a programação do dispositivo) ... isso funciona muito bem, mas nem sempre ativa o aplicativo. Funciona bem em segundo plano embora. Apenas não terminou.

Tentando me desconectar completamente após o término, para que eu possa usar o iBeacon para acordar ... muitos aros e, no final, ele não funciona de maneira alguma confiável.Atualizações significativas de localização ... extremamente não confiáveisGravação de áudio ... nenhum método é acionado quando inicia a gravação (que eu poderia encontrar de qualquer maneira) ou métodos que são acionados intermitentemente durante a gravação

questionAnswers(1)

yourAnswerToTheQuestion