iOS6: CBPeripheral освобождается при подключении

Я пытаюсь подключиться к устройству Bluetooth BTLE. У меня нет проблем с обнаружением периферии.

Однако при попытке подключиться к периферийному устройству я получил следующее предупреждение.

2013-04-05 22:10:36.110 CoreBluetooth [ПРЕДУПРЕЖДЕНИЕ] 7DA9E322-D710-081B-4A9D-526DE546B13C, Name = "Find My Car Smarter", IsConnected = NO> освобождается при подключении

Кроме того, ни один из соответствующих методов делегата не вызывается:

didConnectPeripheral:
didFailToConnectPeripheral:

Я боролся с этим часами... Пожалуйста, помогите.


person mikeholp    schedule 06.04.2013    source источник


Ответы (1)


Краткий ответ: вам нужно сохранить периферийное устройство.

Длинное объяснение: Core Bluetooth не знает, интересует ли вас это периферийное устройство, когда оно обнаружено. Подключиться к нему недостаточно, его нужно сохранить.

Добавьте свойство в класс, в котором вы все это делаете:

@property (strong) CBPeripheral     *connectingPeripheral;

А затем назначьте периферийное устройство этому свойству, когда устройство будет обнаружено, прежде чем вы вернетесь из didDiscoverPeripheral:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
  DDLogVerbose(@"Discovered peripheral: %@ advertisement %@ RSSI: %@", [peripheral description], [advertisementData description], [RSSI description]);

  [central connectPeripheral:peripheral options:nil];
  self.connectingPeripheral = peripheral;
}
person sarfata    schedule 07.04.2013
comment
Это сделало трюк! Это сводило меня с ума... Большое спасибо! - person mikeholp; 10.04.2013
comment
Пожалуйста, подтвердите ответ (зеленая галочка рядом с ним). Это помогает людям узнать, что этот ответ работает, а мне — получить больше очков и значков;) - person sarfata; 10.04.2013
comment
У меня такая же проблема. Я сохраняю ссылку в массиве, но когда пытаюсь подключиться, получаю ту же ошибку. @property NSMutableArray *heartRateMonitors; [self setHeartRateMonitors: [[NSMutableArray alloc] init]]; [[self heartRateMonitors] addObject:peripheral]; Если я сохраню его в отдельной переменной, как в вашем примере, проблема исчезнет. Есть идеи, что я сделал не так? - person Sir Eisenhower; 12.06.2013
comment
Массив должен сохранять содержащиеся в нем объекты, но, может быть, вы слишком рано освобождаете массив? Вы должны добавить отладочное сообщение в метод Dealloc вашего объекта, чтобы убедиться, что сам объект не освобожден (что приведет к освобождению свойства heartRateMonitors). - person sarfata; 13.06.2013
comment
Спасибо за ответ. Я застрял на нем некоторое время - person Ashish Agarwal; 02.11.2013
comment
Большое спасибо! Это было то, что я искал :) - person kodartcha; 15.07.2014