xcode 5 CoreBluetooth не обнаруживает сервисы для периферийных устройств
Я создаю несколько приложений BLE и столкнулся с этой проблемой с моими протоколами BLE, а также с внешними поставщиками. По большей части, BLE работает так, как задумано, но иногда он не сможет обнаружить службы для определенного периферийного устройства и не будет работать снова, пока я не перезапущу или не перезагрузлю свой телефон.
Кто-нибудь еще испытывал эту проблему?
Когда я закончу с моим периферийным устройством, менеджер позвонит closePeripheralConnection
метод. Соответствующий код:
// Disconnect from peripheral
- (void)closePeripheralConnection
{
NSLog(@"== closePeripheralConnection ==");
// If the peripheral is connected
if (self.peripheral.state == CBPeripheralStateConnected && self.peripheral != nil) {
// Cancel connection
[self.manager cancelPeripheralConnection:self.peripheral];
} else {
[self clearPeripheralSettings];
}
}
// Clear peripheral settings
- (void)clearPeripheralSettings
{
// Clear peripheral variables
self.peripheral = 0;
// Clear services
self.service = 0;
// Clear characteristic values
self.data = 0;
self.notifyCharacteristic = 0;
}
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
[self clearPeripheralSettings];
}
2 ответа
Исходя из кода и вашего комментария вы ничего плохого не делаете. Все еще нестабильность базовой технологии Bluetooth препятствует вашей работе. С iOS 6 такие проблемы были более распространены, чем с iOS 7, но серьезный стресс все еще может взорвать вещи. Форум разработчиков Apple и список рассылки bluetooth-dev полны подобных отчетов. Если тип использования, который вы используете во время тестирования, не является обычным для повседневного использования, то проблема может быть не такой актуальной для конечных пользователей. (Хотя все еще раздражает наверняка.)
Я предлагаю вам попытаться собрать статистику. Зарегистрируйте, сколько раз вы вызываете каждый API, и попытайтесь найти какое-то доказательство для Apple, чтобы показать, что платформа все еще нестабильна. Хранение статистики в NSUserDefaults может быть самым простым решением.
В любом случае, если у вас есть надежные данные, которые могут служить доказательством неисправности, сообщите об ошибке в Apple, опубликуйте на форуме разработчиков и отправьте почту в список bluetooth-dev. Сделайте ваш звук услышанным как можно большим количеством людей.
Когда вы вызываете этот метод? - closePeripheralConnection
Возможно, вы захотите добавить это, чтобы запросить периферийное устройство для обнаружения своих служб при подключении в одном из делегатов обратного вызова центрального менеджера.
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
NSLog(@"peripheral: %@ state: %@", peripheral.name, peripheral.state == CBPeripheralStateConnected ? @"Connected" : @"Disconnected");
if (peripheral.state == CBPeripheralStateConnected) {
peripheral.delegate = self;
[peripheral discoverServices:nil];
}
}