9

Nun, ich habe eine Anwendung, die zu scannen und zu einem Bluetooth-Gerät unter iOS 6.0.1 aber auf iPhone 4s verbinden, und es funktioniert gut. , wenn die Anwendung auf dem Apple Store laden, geben sie mir einen Absturz der Anwendung, Fledermaus-Programmierung, aber ich habe nur den Absturz verstehen, wenn ich die Anwendung auf einem iphone5 versuchen, wo dieCBperipheral UUID ist Null in IOS 6.0.1 auf I-Phone5

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI; 

mir eine periphere mit null Uuid zurückkehren .

Ich drucke das Peripheriegerät, den Namen, die UUID, die RSSI und die AdvertData, alles ist gut, aber die UUID ist null, und ich benutze die UUID in der Anwendung. Das führt dazu, dass meine Anwendung abstürzt. Ich kann die Null-UUID steuern, und das bedeutet, dass ich die Anwendung nicht steuern kann.

Jemand weiß, was passiert, und eine mögliche Lösung?

+0

porssible Lösung ist die nächste. – Manelonix

+0

Ich fand die Lösung und fragte die UUID nach dem Lesen der Dienste. Nur wenn die Verbindung hergestellt wurde, können Sie die UUID des Gerätes kennenlernen ... bis bald – Manelonix

+0

Ich habe Code, der diesen Rückruf verwendet, wenn auf dem iPad laufen, bekomme ich eine nicht periferial.UUI, aber es ist null auf iPhone 6.0.1 –

Antwort

2

Was wir zu tun haben, ist das nächste: Sie können das Peripherieobjekt nicht mit einem NSLog schreiben, aber wir können die periphere Uuid-Eigenschaft nicht haben, bevor die Verbindung ausgeführt wurde. Es war immer Null. Wir fragen nach der UUID, wenn die gelesenen Dienste beendet wurden, nicht vorher, und dann können wir die Anwendungen auf i-phone5 nicht ohne Absturz ausführen.

Ich lese es über auf TI (Texas Instruments), dass es ein IOS Bug war, aber ich denke, es ist ein ble Sicherheitsupdate, müssen wir verbinden, bevor fragen Sie die Uuid.

1

Nach der ersten Verbindung wird die UUID vom Gerät gespeichert/zwischengespeichert. Wenn zu einem späteren Zeitpunkt das gleiche Peripheriegerät erkannt wird, ist die UUID vor der Verbindung verfügbar. Sie können nach allen gespeicherten Peripheriegeräten fragen, indem Sie "retrievePeripherals" aufrufen.

0

Es scheint eine Bug-/Feature-Verbesserung in iOS 6 zu sein, die sich auf dem iPhone 5 durch den asynchronen Charakter des Codes bemerkbar macht. Ich habe auch Code, der auf dem 4S funktioniert, aber nicht auf dem 5.

Die von den meisten Leuten gepostete Problemumgehung ist, sicherzustellen, dass Sie zu jedem Gerät verbinden, das Sie finden, wie Sie es finden. Die Erklärung ist, dass die UUID erst zugewiesen wird, wenn eine Verbindung hergestellt wurde.

Sie können ein Beispiel dafür in der TI-Sensor-Tag-Code sehen, die Sie von der TI-Website herunterladen können

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 

    NSLog(@"Found a BLE Device : %@",peripheral); 

    /* iOS 6.0 bug workaround : connect to device before displaying UUID ! 
     The reason for this is that the CFUUID .UUID property of CBPeripheral 
     here is null the first time an unkown (never connected before in any app) 
     peripheral is connected. So therefore we connect to all peripherals we find. 
    */ 

    peripheral.delegate = self; 
    [central connectPeripheral:peripheral options:nil]; 

    [self.nDevices addObject:peripheral]; 

} 

Allerdings fällt auf, dass Sie auch die folgenden

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
{ 
    NSLog(@"didDiscoverPeripheral"); 

    if (![foundPeripherals containsObject:peripheral]) { 
     NSLog(@"foundPeripherals addObject %@", peripheral.name); 
     [foundPeripherals addObject:peripheral]; 
    } else { 
     NSInteger index = [foundPeripherals indexOfObject:peripheral]; 
     NSLog(@"foundPeripherals replaceObject %@", peripheral.name); 
     [foundPeripherals replaceObjectAtIndex:index withObject:peripheral]; 
    } 

} 

tun können als didDiscoverPeripheral wird mehr als einmal für jedes Gerät (ich sehe es zweimal auf dem iPhone 5 genannt) und das zweite Mal die Peripheriedetails sind abgeschlossen.