iOS: 12
Устройство: iPhone 6 (но, кажется, не имеет значения)
У меня возникла следующая проблема при взаимодействии с CBPeripheral.
Устройство (периферийное устройство) случайно отключается через длительные периоды времени. До отключения приложение успешно выполняет последовательности записи / didWrite / didRead в течение длительных периодов времени (10 минут - 1 час - даже 2 часа) -> затем оно внезапно перестает работать.
Последнее действие на стороне приложения:
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
(LOG: "write (17 bytes. device: connected. QueuedItems: 0)")
дальнейших действий не последовало, вскоре последовал обратный вызов didDisconnect из CBCentralManager. Методы делегирования CBPeripheral не вызываются (didWrite и т. Д.)
Я прочитал много связанных тем, но ничего очевидного не приходит.
CBCentral init:
self.bleQueue = dispatch_queue_create("bleQueue", DISPATCH_QUEUE_SERIAL);
NSMutableDictionary *options = [NSMutableDictionary new];
options[CBCentralManagerOptionShowPowerAlertKey] = @NO;
options[CBCentralManagerOptionRestoreIdentifierKey] = self.restoreIdentifier;
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:self.bleQueue options:options];
CBPeripheral:
сильная ссылка, делегат установлен при подключении, все записи выполняются из другой выделенной очереди (dispatch_queue_create ("faceralQueue ", DISPATCH_QUEUE_SERIAL);). Запись данных только после того, как предыдущая передача была подтверждена с помощью didWrite, в противном случае данные помещаются в очередь и т. Д.
Другие соображения:
- изрядное количество обработки, выполняемой приложением (интенсивное использование GCD)
- постоянный обмен данными через BLE (1 Гц)
- приложение в фоновом режиме
Вопросы:
- CBCentral имеет свою очередь. Другая очередь используется для отправки данных в CBPeripheral - должно быть в порядке (как последовательный / фоновый)?
- В чем может быть причина того, что обратный вызов didWrite не сработал (успех или ошибка)?
- Может ли система временно приостановить BLE по какой-либо причине?
- Полагаю, это может быть и чрезмерное использование BLE (длительное непрерывное соединение), но тогда это не проблема для устройств Android и т. Д.)