ReadRSS ruft die Delegate-Methode nicht auf

8

Ich habe seit dem iOS 8 Update ein Problem, momentan ist meine App mit einem BLE Gerät verbunden und liest den RSSI dank eines Timers und der ReadRSSI Methode periodisch.

Die Methode readRSSI wird aufgerufen (mit einem Haltepunkt überprüft), bis zu diesem Punkt ist alles in Ordnung.

Gemäß der Dokumentation sollte der Aufruf von readRSSI den Rückruf auslösen

%Vor%

Diese Delegate-Methode wird jedoch nicht jedes Mal aufgerufen. Aber wenn ich das Telefon Bluetooth ein- und ausschalte, bekomme ich die RSSI Updates zurück. Ist schon jemand auf dieses Problem gestoßen? Wie kann ich es beheben?

    
M to the K 26.09.2014, 13:57
quelle

3 Antworten

4

Ich habe das gleiche Problem, dachte zuerst, es könnte meine Schuld sein, aber später stellt sich heraus, dass es wirklich komisch ist.

Ich schrieb ein ähnliches Programm, benutze das iPhone, um mich mit einem BLE-Beacon zu verbinden, und benutze [CBPeripheral readRSSI], um die Signalstärke zu erhalten. Alles läuft reibungslos, wenn das BLE Beacon zum ersten Mal mit meinem iPhone verbunden wird. Wenn die Verbindung getrennt wird und die Verbindung erneut hergestellt wird, wird die Methode readRSSI nicht mehr aufgerufen. Erst wenn ich das Bluetooth auf meinem iPhone neu starte, wird das Problem gelöst.

Ich starte das Programm im Debug-Modus, Schritt für Schritt, zu meiner Überraschung fand ich überhaupt kein Problem. Selbst wenn ich die Verbindung so oft abbringe und mich wieder verbinde, kann die Methode readRSSI immer noch korrekt aufgerufen werden.

Ich hoffe, das kann helfen. Ich warte auch auf eine Antwort für diese seltsame Sache.

    
Tom Ou 28.09.2014 15:25
quelle
2

Ich bin kürzlich auf dieses Problem gestoßen und hatte mehrere Probleme, die es verursacht haben. Hier sind die Lösungen in Checklistenform, von den einfachsten zu den komplexesten:

  1. Der CBCentralManager wird keinen starken Bezug auf peripheral haben, Sie müssen ihn selbst behalten.
  2. Stelle sicher, dass du tatsächlich peripheral.delegate .
  3. bist
  4. Stellen Sie sicher, dass Sie die neue Methode peripheral(peripheral:didReadRSSI:error:) implementieren und nicht die alte.
  5. iOS 8.0.2 führte Probleme mit der obigen Methode ein, jede Version danach 8.1, 8.2, 8.3, funktioniert ohne Probleme (Was @ Gamma-Point erwähnt hat).
  6. Sie können readRSSI nur für Geräte verwenden, die mit Ihrer Zentrale verbunden sind.
    1. Bei Geräten, die durch Discovery abgerufen wurden, können Sie [CBCentralManagerScanOptionAllowDuplicatesKey : true] übergeben, wenn Sie scanForPeripheralsWithServices(_:options:) ausführen. Wie in diese Antwort .
    2. Außerdem gibt es ein Problem mit der Methode central.retrieveConnectedPeripheralsWithServices . Diese Methode gibt "verbundene" Geräte zurück, aber die Funktion readRSSI funktioniert noch nicht, bis Sie tatsächlich connectPeripheral(_:options:) aufrufen. Obwohl sie mit dem iPhone / iPad / AppleWatch verbunden sind, sind sie nicht mit verbunden zentral, sehr nervig.

Das letzte war das große Problem für mich, ich hatte gehofft das "nächste" verbundene oder entdeckte Gerät zu wählen, konnte aber den RSSI nicht auf dem neuesten Stand halten. Die Dokumentation sagt auch nichts.

Was ich gemacht habe, war, ein großes Wörterbuch mit allen Geräten zu erstellen, die von [UUID : Device] indiziert sind (das Gerät ist ein Wrapper für CBPeripheral ). Geräte, die über Discovery hinzugefügt werden, erhalten ihren RSSI über de discover-Methode und die verbundenen über einen GCD-Timer in der Bluetooth-Queue, die readRSSI aufruft und ihren eigenen RSSI-Wert aktualisiert.

    
Can 05.05.2015 22:19
quelle
1

Ich habe 8.0, es funktioniert gut.

%Vor%

Da oben in iOS 8 veraltet ist und der andere Delegierte versucht wird, wird dies gemeldet.

%Vor%

Dies scheint eine OSX-Delegate-Methode zu sein. Apple wird wahrscheinlich bald etwas in iOS für RSSI hinzufügen.

In iOS 8.0 funktioniert didReadRSSI. In der 8.0.2 Dokumentation ist es nicht unter iOS aufgeführt.

Wenn ich beide Methoden verwende, wird didReadRSSI in iOS 8 & amp; peripheralDidUpdateRSSI wird in iOS 7 aufgerufen.

Aktualisieren Sie nicht auf iOS 8.0.2, bis Apples etwas für RSSI bereitstellt.

Hat jemand die Betaversion von iOS 8.1 getestet?

Sieht so aus, als ob beim Scannen nach Geräten der RSSI nicht gelesen werden kann. Wenn der Aufruf von [CBCentralManager scanForPeripheralsWithServices ...] initiiert wurde, tritt kein Effekt von ReadRSSI auf (es werden keine Delegierten aufgerufen). Wenn jedoch [CBCentralManager stopScan] ausgegeben wird, reagiert ReadRSSI.

Beachten Sie auch: Das Gerät muss im verbundenen Zustand sein, um Befehle auszugeben, sonst erhalten Sie: CoreBluetooth [API MISUSE] CBPeripheral kann Befehle nur im verbundenen Zustand akzeptieren.

    
Gamma-Point 16.10.2014 18:18
quelle