2014-11-26 4 views
4

Я разрабатываю приложение для 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, если я не могу заставить это работать. Если у вас есть идеи, как заставить это работать, сообщите мне об этом.

+0

Просто догадаться: возможно, это потому, что вы пытаетесь _write_ значение для характеристики, но его разрешения допускают только _reading_? Таким образом, центральный не запускает процесс спаривания, так как он еще не сможет записать характеристику даже в паре. –

ответ

0

От Apple DTS: «Я проверил с другими инженерами здесь, и мы не считаем, что всплывающее соединение можно установить между двумя устройствами iOS, но iOS-устройством и периферийным устройством BLE».

Итак, спаривание всплывающих окон происходит только между приложением iOS/Mac и периферийным устройством. rdar время.