2016-10-13 3 views
1

Вот мой сценарий:Swift 3: Как сканировать периферийные устройства в фоновом режиме?

Я подключаюсь к двум периферийным устройствам, устанавливаю свое приложение в фоновом режиме и начинаю уходить с периферийными устройствами, пока не потеряет подключение к моему приложению. Возвращаясь, они не соединяются снова, когда добираются.

Когда я выполняю тот же эксперимент, когда приложение работает на переднем плане, никаких проблем не возникает - при приближении периферийных устройств ближе к iPhone приводит к повторному подключению.

Однако, я вижу на консоли, что, когда периферийные устройства теряют соединение, вызывается метод DidDisconnectPeripheral. Проблема заключается в том, что сканирование не вызывается внутри этого метода

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { 
    numberOfTagsSending = numberOfTagsSending - 1 
    numberOfConnectedTags = numberOfConnectedTags - 1 
    print("Tag was disconnected. Start scanning.") 

    synchronizer.alreadySynced = false 

    central.scanForPeripherals(withServices: arrayOfServices, options: [CBCentralManagerScanOptionAllowDuplicatesKey : true]) 
} 

Я прочитал this ответ и сделал все точно так же, к сожалению, она не работает.

Заранее спасибо

+0

Пробовал ли вы называть эту функцию в 'Application: didEnterBackground'? – KSigWyatt

+0

Ну, честно говоря, я этого не делал. Но я никогда не нашел никакой информации, которую я должен явно вызвать из AppDelegate. – DCDC

+0

Попробуйте это и посмотрите, работает ли она в фоновом режиме. Если это не так, это должно быть проблемой с вашим методом 'central.scanForPeripherals()' не настроен как вы указали в своем вопросе. – KSigWyatt

ответ

3

После того, как у вас есть CBPeripheral экземпляр вам не нужно, чтобы открыть его снова. Вы можете просто подключиться к нему; если периферийное устройство в настоящее время не находится в зоне действия, iOS будет автоматически подключаться после того, как периферийное устройство поступит в диапазон, и вызовет ваш делегат didConnectPeripheral.

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { 
    numberOfTagsSending = numberOfTagsSending - 1 
    numberOfConnectedTags = numberOfConnectedTags - 1 

    central.connect(peripheral) 
} 
Смежные вопросы