Я разрабатываю приложение для iPhone и приложение Mac, которые общаются друг с другом через Bluetooth LE. IPhone является центральным, а Mac - периферийным. Я хочу, чтобы приложение iPhone смогло повторно подключиться к приложению Mac после перезапуска. Поэтому я сохраняю UUID периферийного устройства, представляющего Mac, в NSUserDefaults, а затем, когда приложение iPhone запускается, я вызываю -[CBCentralManager retrievePeripheralsWithIdentifiers:]
, передавая UUID. Хотя этот метод возвращает периферийное устройство, когда я звоню -[CBCentralManager connectPeripheral:options:]
, iPhone никогда не перестраивается на Mac. Согласно сообщению this SO, проблема в том, что два устройства должны быть сопряжены так, чтобы UUID Mac был постоянным. Это подводит меня к моей проблеме. Я не могу за всю жизнь забрать iPhone и Mac. Согласно странице this на странице Руководства по программированию базового Bluetooth, для обеспечения сопряженного подключения необходимо, чтобы периферийное устройство установило свойства и разрешения для соответствующих значений. Я цитирую:Базовый Bluetooth: не удается получить iPhone (центральный) и Mac (периферийное) для пары
Вы можете гарантировать, что только доверенные устройства имеют доступ к значениям чувствительных признаков, установив соответствующие свойства и разрешения. Продолжая пример выше, чтобы только доверенные устройства, чтобы получить адрес электронной почты пользователя, попробуйте установить свойство соответствующих Характеристического в и разрешении, как это:
emailCharacteristic = [[CBMutableCharacteristic alloc]
initWithType:emailCharacteristicUUID
properties:CBCharacteristicPropertyRead
| CBCharacteristicPropertyNotifyEncryptionRequired
value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
Однако это не работает. Даже когда я устанавливаю правильные разрешения и свойства для этого признака, iPhone все равно может читать и записывать его без отображения диалогового окна сопряжения. В другом месте мне говорят, что способ инициирования спаривания - это периферийное отклонение запроса чтения/записи с недостаточной ошибкой проверки подлинности. Согласно сообщению this,
Для сопряжения вам необходимо ответить на запрос на запись с недостаточной ошибкой проверки подлинности. Например, для периферийного устройства IOS можно было бы написать что-то вроде:
- (void)peripheralManager:(CBPeripheralManager *)peripheralManager didReceiveWriteRequests:(NSArray *)requests {
...
[peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthentication];
...
}
Но это по-прежнему не работает! Когда Mac отклоняет запрос на запись с недостаточной ошибкой проверки подлинности, iPhone получает обратный вызов -[CBPeripheralDelegate peripheral:didWriteValueForCharacteristic:error:]
с ошибкой, которая гласит: «Аутентификация недостаточна». Нет диалога сопряжения. Я понятия не имею, что делать, и подумываю о том, чтобы полностью отказаться от Core Bluetooth, если я не могу заставить это работать. Если у вас есть идеи, как заставить это работать, сообщите мне об этом.
Просто догадаться: возможно, это потому, что вы пытаетесь _write_ значение для характеристики, но его разрешения допускают только _reading_? Таким образом, центральный не запускает процесс спаривания, так как он еще не сможет записать характеристику даже в паре. –