DiscoverServices有时从未触发过

时间:2014-08-27 03:16:36

标签: ios objective-c iphone bluetooth-lowenergy core-bluetooth

大部分时间,这在我的应用程序中正常工作。不幸的是,有时它在调用发现服务后从未被触发过。

我的代码是:

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral     *)peripheral
{
    NSLog(@"Did connect to peripheral: %@", peripheral);
    [self.delegate statusMessage:[NSString stringWithFormat:@"Did connect to peripheral: %@\n", peripheral]];

    peripheral.Delegate = self;
    NSArray *serviceArray = [NSArray arrayWithObject:_uuid_tpms_sensor_service];
                [_peripheral discoverServices:serviceArray];
    [peripheral discoverServices:serviceArray ];
}

与此相关的一些帖子是

最终结论应该是iOS中的一个问题。我的问题是,鉴于它的iOS问题,如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

非常感谢Larme和henrik,因为我从你的回复中得到了很多想法。

经过三天的验证,似乎我找到了解决这个问题的方法(问题更可能是限制iOS的蓝牙堆栈而不是问题)

我想总结一下我的发现并在这里解决:

[根本原因]

  • iOS中的蓝牙堆栈不够健壮,因此内部状态机在发生意外的API调用后会损坏。
  • 由于BTLE无线电遵循某种模式,它一次与一个设备连接查询交互,BLE应用程序应follow the API sequence of connectperiperal-->discover-->read-->disconnect(由链路层上的本地,对等设备或监督超时触发)。
  • Apple承认这是iOS中的一个问题。

<强> [分辨率]

  • 按照上述
  • 中描述的API调用顺序进行操作

希望摘要对其他人有用。

答案 1 :(得分:0)

太多流氓app没有正确处理BLE堆栈会导致崩溃。然后手机需要重新启动。 iOS7和8比iOS BLE的早期版本更强大。 Android仍然不那么健壮。程序员忘记释放资源,或者可能在传输旧数据之前尝试编写新数据。

如果您使用X代码并且在释放资源等之前就停止了应用程序,这可能会发生很多事情。这仍然会导致iOS BLE堆栈崩溃。