Изменения CBCentralManager для iOS 7

Я пытаюсь использовать образец BTLE Transfer от Apple. проект, чтобы понять программирование CoreBluetooth. Приложение работает нормально, если я использую устройство iOS 6 в качестве хранилища, но если я запускаю то же приложение с устройством iOS 7 в качестве хранилища, оно не работает. Периферийное устройство прекращает отправку после двух пакетов, а центральное устройство не получает ни одного из них.

Единственная подсказка - это предупреждение, которое я получаю только при работе на iOS 7:

CoreBluetooth[WARNING] <CBCentralManager: 0x15654540> is disabling duplicate filtering, but is using the default queue (main thread) for delegate events

Может ли кто-нибудь сказать мне, что нужно изменить, чтобы сделать это приложение совместимым с iOS 7?

РЕДАКТИРОВАТЬ: Когда оба устройства iOS7, проблем нет. Это ломается только тогда, когда центральный iOS7 разговаривает с периферийным устройством iOS6.


person Drew C    schedule 23.09.2013    source источник


Ответы (2)


Хорошо, я только что запустил его на центральном iOS 7 для периферийного устройства iOS 6. Если вы хотите, чтобы это предупреждение об отключении дублирующейся фильтрации исчезло, просто запустите его в другом потоке. Сделайте что-то вроде этого:

dispatch_queue_t centralQueue = dispatch_queue_create("com.yo.mycentral", DISPATCH_QUEUE_SERIAL);// or however you want to create your dispatch_queue_t
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueue];

Теперь он позволит вам сканировать с включенными дубликатами. Однако вы должны вызвать установщик textView в основном потоке, чтобы иметь возможность установить текст без сбоев:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.textview setText:[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]];
        });

Кстати, вы, вероятно, также захотите принять новую инициализацию делегата iOS 7:

_centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:centralQueue options:nil];//set the restoration options if you want

(Просто проверьте версию iOS и вызовите соответствующий метод инициализации)

person Tommy Devoy    schedule 24.09.2013
comment
Это устраняет предупреждение, но не устраняет проблему связи. По-видимому, это известная проблема при обмене данными между iOS 6 и 7. - person Drew C; 21.11.2013

InscanForPeripheralsWithServices:options:, если вы установите CBCentralManagerScanOptionAllowDuplicatesKey:@YES, измените его на CBCentralManagerScanOptionAllowDuplicatesKey:@NO, что означает, что сканирование должно выполняться без фильтрации дубликатов.

Для меня это работает и на iOS7.

person manojdeshmane99    schedule 26.02.2014