iOS 8.0蓝牙外设管理器在添加服务时没有回调。

3
我创建了一个蓝牙外设管理器,使用 [self.peripheralManager addService:myService] 添加了一些服务。
对于iOS7.0,我可以得到该方法的回调 - (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error。
但是,在iOS8.0上,我们没有收到相同方法的任何回调,也无法建立连接。
下面是我所遵循的步骤:
1. 使用[[CBPeripheralManager alloc] initWithDelegate: self queue:nil options:@{CBPeripheralManagerOptionShowPowerAlertKey: @YES}]创建外设管理器。
2. 使用myService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:@"AAAA"] primary:YES]创建服务。
3. 使用myCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"BBBB"] properties:CBCharacteristicPropertyIndicate value:nil permissions:CBAttributePermissionsReadable]创建特征。
4. 使用myService.characteristics = characteristic将该特征添加到服务中。
5. 使用[peripheralManager addService:myService]将该服务添加到外设管理器中。
6. 这个步骤的回调出现在(void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error中。
7. 在iOS8中,我们没有收到这个回调。
下面是外设管理器更新状态的代码。
-(void) peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{
    NSLog(@"Changed State : %d", peripheral.state);
    if (peripheral.state != CBPeripheralManagerStatePoweredOn) {
        [self deviceDisconnected];
        return;
    }
}

我正在使用以下方法添加服务:

[self.peripheralManager addService:myService];

这种方法在iOS8.0中是否已被弃用,或者可能是由其他原因引起的错误?


1
很可能是其他原因,但我们需要更多的代码。在iOS7和iOS8之间有所改变,iOS7允许在蓝牙硬件初始化(开机状态)之前进行操作并发出警告。而在iOS8中则会直接失败。请展示peripheralManagerDidUpdateState:的代码以及如何调用addService函数。 - Paulw11
嘿,我已经在问题描述中添加了我所遵循的启动服务步骤。 - Nikant
2
你在什么时候调用 addService ?是在 deviceDisconnected 中吗?也就是说,在你处于已启动状态之后? - Paulw11
我之前在poweredOn之前调用了addService,这就是出现错误的原因。非常感谢您的帮助 :) - Nikant
1个回答

8

@Paulw在评论中已经正确回答了这个问题。以下是答案:

在iOS 7和iOS 8之间有一个变化,即iOS 7允许在蓝牙硬件初始化(开机状态)之前进行操作并发出警告。在iOS 8中,它只会失败。

因此,在添加任何服务之前,我们必须等待peripheralManagerDidUpdateState:回调。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接