Как автоматически подключить связку ключей Bluetooth, подключенную к моему приложению iOS, и перезагрузить iPhone?

У меня есть цель c приложением, которое реализует coreBluetooth-фреймворк для соединения с цепочками ключей Bluetooth. Все правильно, я подключаюсь через bluetooth брелок, если я иду в фоновый режим, мое устройство остается подключенным. Если мое устройство выключено или потеряно, то выполняется повторное подключение. И мое приложение обнаруживает, когда я нажимаю кнопку цепочки ключей Bluetooth с сервисом и с didUpdateValueForCharacteristic. Так что все это правильно.

Но я пытаюсь использовать свойства восстановления с функцией willRestoreState, и это не работает... Я отправляю свое приложение в фоновый режим, но когда я перезагружаю свой iPhone, это не восстанавливает соединение и не работает didUpdateValueForCharacteristic.

Я добавил CentralManager и все функции делегата Bluetooth в AppDelegate с функциями для восстановления приложения, и я использую пользовательскую очередь для подключения CentralManager Bluetooth. Но я не знаю, в чем проблема, и почему бы не подключиться, а затем перезагрузить компьютер.

@interface AppDelegate ()

@property (strong,nonatomic) CBCentralManager *central;
@property (copy,nonatomic) NSString *targetPeripheral;
@property (strong,nonatomic) NSMutableArray *discoveredPeripherals;

@property (strong,nonatomic) CBPeripheral *connectedPeripheral;
@property (strong,nonatomic) CBUUID *deviceInfoUUID;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    ViewController *myloginController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"viewController"]; 
        UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:myloginController];
        self.window.rootViewController = navController;
        [self.window makeKeyAndVisible];

    self.discoveredPeripherals=[NSMutableArray new];
    self.deviceInfoUUID=[CBUUID UUIDWithString:@"FFE0"];

//I have added this code to connect then reboot iPhone:
NSArray *centralManagerIdentifiers = launchOptions[UIApplicationLaunchOptionsBluetoothCentralsKey];
if ((centralManagerIdentifiers) && (centralManagerIdentifiers.count > 0)) {
    // The system knows about one or more centrals that need to be restored.
    for (NSString *identifier in centralManagerIdentifiers) {
        dispatch_queue_t queue = dispatch_queue_create("com.myco.cm", DISPATCH_QUEUE_SERIAL);
        self.central = [[CBCentralManager alloc] initWithDelegate:self queue:queue options:@{CBPeripheralManagerOptionRestoreIdentifierKey : identifier,CBCentralManagerOptionShowPowerAlertKey:@YES}];
        [self.referencesToCentrals addObject:self.central];
    }
}
else {
    dispatch_queue_t queue = dispatch_queue_create("com.myco.cm", DISPATCH_QUEUE_SERIAL);
    self.central = [[CBCentralManager alloc] initWithDelegate:self queue:queue options:@{CBPeripheralManagerOptionRestoreIdentifierKey : @"1C7757658-D187-99D2-9578-7B0976AAAEB4",CBCentralManagerOptionShowPowerAlertKey:@YES }];
    [self.referencesToCentrals addObject:self.central];
}

//An this is my willrestoreState function
-(void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary *)dict {

    dispatch_async(dispatch_get_main_queue(), ^() {

    NSArray *peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey];

    if ([peripherals count]>0) {                                                            // There are peripherals
        for (CBPeripheral* p in peripherals) {
            if ([p.identifier isEqual:[CBUUID UUIDWithString:self.UUID]]) {                // wich are sensorTags
                [self.central connectPeripheral:[peripherals firstObject] options:nil];          // so let's reconnect
            }
        }

    }
}

    - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error {

        NSString *content = [[NSString alloc] initWithData:characteristic.value encoding:NSUTF8StringEncoding];

        NSLog(@"Receive from Peripheral: %@",content);
    }

    -(void) startScan {
        [self.central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"FFE0"]] options:nil];
    }

    - (void)applicationDidEnterBackground:(UIApplication *)application {
         NSLog(@"We are in background");
    }

    -(void) centralManagerDidUpdateState:(CBCentralManager *)central {
    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
            [self startScan];
            break;
        case CBManagerStateUnknown:
            break;
        case CBManagerStatePoweredOff:
            break;
        case CBManagerStateResetting:
            break;
        case CBManagerStateUnsupported:
            break;
        case CBManagerStateUnauthorized:
            break;
    }
}

-(void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

    if([self.central retrieveConnectedPeripheralsWithServices:@[[CBUUID UUIDWithString:@"FFE0"]]] != 0){
        dispatch_async(dispatch_get_main_queue(), ^{
            self.nameBT = peripheral.name;
            self.UUID = peripheral.identifier.UUIDString;
        });
    }

    if (![self.discoveredPeripherals containsObject:peripheral]){
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.discoveredPeripherals addObject:peripheral];
        });
    }

        if (self.connectedPeripheral) {
            [self.central cancelPeripheralConnection:self.connectedPeripheral];
        }
        self.targetPeripheral=peripheral.identifier.UUIDString;
        [self.central connectPeripheral:peripheral options:nil];

}

-(void) centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    self.connectedPeripheral=peripheral;

    dispatch_async(dispatch_get_main_queue(), ^{
        self.nameBT = peripheral.name;
        self.UUID = peripheral.identifier.UUIDString;
    });

    peripheral.delegate=self;
    [peripheral discoverServices:@[self.deviceInfoUUID]];
}

And I have added this to try if application reconnect bluetooth:

    -(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder {
        return YES;
    }

-(void) centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
    NSLog(@"Disconnected from peripheral");
if ([self.targetPeripheral isEqualToString:peripheral.identifier.UUIDString]) {
        NSLog(@"Retrying");
        [self.central connectPeripheral:peripheral options:nil];
    }
}

}

Как я могу восстановить соединение, когда iPhone автоматически перезагружается без необходимости открывать приложение? Что я делаю неправильно?

0 ответов

Другие вопросы по тегам