Как автоматически подключить связку ключей 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 автоматически перезагружается без необходимости открывать приложение? Что я делаю неправильно?