我正在开发一款iPhone应用和一款Mac应用,它们通过蓝牙LE相互通信。iPhone是中心设备,而Mac是外围设备。我希望iPhone应用程序能够在重新启动后重新连接到Mac应用程序。因此,我将代表Mac的外围设备的UUID保存在NSUserDefaults中,然后当iPhone应用程序启动时,我调用
-[CBCentralManager retrievePeripheralsWithIdentifiers:]
,传入UUID。虽然这个方法返回了外围设备,但是当我调用-[CBCentralManager connectPeripheral:options:]
时,iPhone从未重新连接到Mac。根据这篇SO文章,问题在于两个设备需要配对,以使Mac的UUID持久化。这就带来了我的问题。我无论如何都无法让iPhone和Mac配对。根据Core Bluetooth编程指南的这一页,要求已配对的连接的方法是使外围设备设置特征的属性和权限为适当的值。我引用以下内容:
您可以通过设置适当的特征属性和权限来确保只有受信任的设备可以访问敏感特征值。继续上面的示例,要仅允许受信任的设备检索成员的电子邮件地址,请设置适当的特征属性和权限,如下所示:
emailCharacteristic = [[CBMutableCharacteristic alloc]
initWithType:emailCharacteristicUUID
properties:CBCharacteristicPropertyRead
| CBCharacteristicPropertyNotifyEncryptionRequired
value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
然而,这并行不通。即使我正确地设置了特征的权限和属性,iPhone仍然可以在没有显示配对对话框的情况下读/写它。在其他地方,我被告知启动配对的方法是让外围设备拒绝具有不足身份验证错误的读/写请求。根据此帖子,
要配对,您需要用不足身份验证错误响应写入请求。例如,对于iOS外围设备,您将编写以下内容:
- (void)peripheralManager:(CBPeripheralManager *)peripheralManager didReceiveWriteRequests:(NSArray *)requests {
...
[peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthentication];
...
}
但这仍然不起作用!当Mac以不充分的身份验证错误拒绝写入请求时,iPhone会收到一个-[CBPeripheralDelegate peripheral:didWriteValueForCharacteristic:error:]
回调,并显示一个错误,指出"身份验证不足"。没有配对对话框。我不知道该怎么办,如果无法使其工作,我考虑完全放弃Core Bluetooth。如果您有任何想法如何使其工作,请告诉我。