我正在开发通过蓝牙 LE 相互通信的 iPhone 应用程序和 Mac 应用程序。iPhone是中心,Mac是外围。我希望 iPhone 应用程序能够在重新启动后重新连接到 Mac 应用程序。因此,我将代表 Mac 的外围设备的 UUID 保存在 NSUserDefaults 中,然后当 iPhone 应用程序启动时,我调用-[CBCentralManager retrievePeripheralsWithIdentifiers:]
,传入 UUID。尽管此方法返回外围设备,但当我调用 时-[CBCentralManager connectPeripheral:options:]
,iPhone 永远不会重新连接到 Mac。根据this SO post,问题在于两个设备需要配对,以便Mac的UUID是持久的。这让我想到了我的问题。我一辈子都无法让 iPhone 和 Mac 配对。据此_核心蓝牙编程指南页面,需要配对连接的方法是外围设备将特征的属性和权限设置为适当的值。我引用:
您可以通过设置适当的特征属性和权限来确保只有受信任的设备才能访问敏感的特征值。要继续上面的示例,要仅允许受信任的设备检索成员的电子邮件地址,请设置适当的特征属性和权限,如下所示:
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。如果你知道如何让它工作,请告诉我。