我正在构建几个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];
}
答案 0 :(得分:2)
根据代码和你的评论,你没有做任何坏事。它仍然是Core Bluetooth框架的不稳定性,阻碍了您的工作。对于iOS 6来说,这些问题比iOS 7更常见,但严重的压力仍然可以解决问题。 Apple开发者论坛和bluetooth-dev邮件列表中充满了类似的报告。如果您在测试时使用的用法在每天使用时并不常见,那么问题可能与最终用户无关。 (虽然仍然很烦人。)
我建议你尝试收集统计数据。注册您调用每个API的次数,并尝试为Apple建立一些证据,证明该框架仍然不稳定。在NSUserDefaults中存储统计数据可能是最简单的解决方案。
无论如何,如果你有强大的数据可以作为故障的证据,那么将错误报告给Apple,在开发者论坛中发帖,发送邮件到bluetooth-dev列表。让尽可能多的人听到你的声音。
答案 1 :(得分:0)
你什么时候打电话给这个方法? - 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];
}
}