2016-09-20 3 views
1

Notre application se connecte aux périphériques Bluetooth LE via CoreBluetooth.CoreBluetooth sur iOS10: Timeout après CBPeripheral discoverServices

Sur iOS 8 et 9, tout fonctionne correctement. Sur iOS 10 nous geht une erreur de délai d'attente (Error Domain=CBErrorDomain Code=6 "The connection has timed out unexpectedly.")
dans le CBCentralManagerDelegate:

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error; 

après avoir appelé sur un discoverServices connecté CBPeripheral.

Est-ce que quelqu'un sait ce qui ne va pas? Est-ce un problème iOS 10? Y a-t-il un certain BLE Log à vérifier?

Setup iOS 10.0.1 (14A403) sur iPad Pro 9.7 avec un Nordic Semiconductor nRF51822

Répondre

3

OK, j'ai résolu le problème. J'ai confondu CBUUID et NSUUID
à partir de iOS 10 CBPeripheral discoverServices accepte seulement CBUUID. NSUUID ne marche plus. Peut-être NSUUID a seulement travaillé accidentellement sur les anciennes versions iOS. La documentation indique clairement:

Une liste d'objets CBUUID représentant les types de service à découvrir.

NSArray *services = @[ 
    [CBUUID UUIDWithString:ServiceUUID] //Correct 
    //[[NSUUID alloc] initWithUUIDString:ServiceUUID] //Does work on iOS 9 but not on iOS 10 
]; 
[self.peripheral discoverServices:services]; 

impatient de porter l'application à Swift fortement typé.

+0

Merci l'homme que vous m'avez sauvé .. Il est à noter que si vous mettez le NSUUID, il n'envoie jamais un message d'erreur, ce qui rend vraiment difficile à déboguer –

0

Assurez-vous que vous ne laissez pas l'CBPeripheral être désallouée avant peripheral:didDiscoverServices: est appelé dans votre CBCentralManagerDelegate. Ceci est facilement accompli en affectant le périphérique à une propriété, e. g .:

@property (nonatomic, string) CBPeripheral *peripheral; 

... 

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { 

    self.peripheral = peripheral 
    [peripheral discoverServices:<desired service UUIDs>]; 
    ... 
} 
+0

Merci, mais cela ne résout pas mon problème puisque le 'CBPeripheral' est maintenu par une référence forte. – cornr