История пользователя: пользователь соединяет приложение с периферийным устройством, после успешного подключения и после правильной подписки всех характеристик пользователь помещает приложение в фоновый режим.Пользователь покидает область ярости периферийного устройства и происходит соединение.
Тестовый пример: когда пользователь снова входит и входит в диапазон BLE периферийного устройства, ОС должна разбудить приложение и повторно подключить приложение.приложение правильно.
Решение: я использую поддержку сохранения и восстановления состояния в качестве документации: https://apple.co/2UM6xmi Пересоединение происходит только в том случае, если приложение уничтожено системой и будет метод willRestoreвызывается, и то же самое происходит, когда я перезагружаю устройство.
Проблема: Когда пользователь покидает область диапазона BLE, происходит отключение, но после 20 минут отключения и возврата в область диапазона BLEпериферийное переподключение не происходит.
Если приложение приостановлено, в документации BLE говорится, что в этом случае (https://apple.co/2IpNffT) приложение не собирается восстанавливать центральное состояние BLE, нотеперь вопрос в том, если я программно убью приложение после отключения, то метод willRestoreбудет вызываться только один раз, и если нет никакого периферийного устройства BLE, соединение не произойдет в любом случае.
Есть ли способ достичь этого?соответственно, к документации (в первой ссылке) можно обратиться к этому случаю, в документации говорится о гипотетическом приложении для автоматической двери с использованием BLE.Но я пробовал этот подход в течение нескольких дней безуспешно, у вас есть какие-либо предложения?
Это код:
В контроллере, который сканирует периферийные устройства:
Я инициализирую центральный менеджер:
let options = [CBCentralManagerOptionRestoreIdentifierKey: "someIdentifier"]
self.centralManager = CBCentralManager(delegate: self, queue:nil, options: options)
в методе willRestoreState:
func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) {
let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey] as! NSArray
print(peripherals.debugDescription)
if(peripherals.count > 0){
let peripheral = peripherals.object(at: 0) as! CBPeripheral
self.discoveredPeripheral = peripheral
self.discoveredPeripheral!.delegate = self
self.connectingPeripherals.append(self.discoveredPeripheral!)
self.centralManager!.connect(self.discoveredPeripheral!, options: nil)
}else{
scan()
}
}
Метод didConnect:
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
savePeripheral(peripheral: peripheral)
self.discoveredPeripheral = peripheral
self.discoveredPeripheral!.delegate = self
currentState = STATE_CONNECTED
self.discoveredPeripheral!.discoverServices([CBUUID(string: TRANSFER_SERVICE_UUID)])
eventsToSubscribe = [CBUUID(string: SOME_CHARACTERISTIC_UUID)]
}
Работают следующие сценарии:
1 - приложение убивается с помощью оператора: kill (getpid (), SIGKILL);оно снова подключается.
2- Устройство перезагружается через 1 или 2 минуты, оно повторно подключается.
3- Отключение происходит, потому что мы находимся вне зоны действия Bluetooth, и устройство входитснова в диапазоне в течение первых 5 ~ 10 минут, затем устройство снова подключается.
Сценарий, который не работает:
1- Если отключение происходит, потому что мы вне диапазонаBluetooth, и устройство снова входит в зону действия через 10 минут. Устройство не будет снова подключено.
Кто-нибудь знает, что здесь происходит?
Большое спасибо, яцените поддержку.