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

Программируем под IOS
Ответить Пред. темаСлед. тема
Гость
 Как автоматически повторно подключить связку ключей Bluetooth, подключенную к моему приложению iOS, а затем перезагрузит

Сообщение Гость »


У меня есть приложение Objective 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]]) {                // which 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];
}
}
}
How can I reconnect when iPhone reboot automatically without need open application?
What am I doing wrong?


Источник: https://stackoverflow.com/questions/431 ... -restart-m
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»