0

Ich habe Wiederherstellung Funktionalität für CoreBluetooth implementiert und es funktioniert gut, außer einer Sache - nach einer Woche (+/- - nicht sicher für 100%) im Hintergrund, ohne zu öffnen, App beendet und nicht auf BLE-basierten Ereignissen wiederhergestellt (einige Male getestet).BLE Wiederherstellung/Erhaltung unerwarteter Effekt

Ich füge auch Protokollierung zu allen BLE bezogenen Aufgabe hinzu, analytics für die Erfassung von Abstürzen hinzufügen, Wiederherstellungsprozess/Ereignisse in zusätzlichen verfolgen - und nach Prüfung dieser Protokolle/info/reports - keine Ausnahmen oder etwas, die meine App beenden können.

Die Frage ist - kann mir jemand den Grund erklären, warum ich solches Verhalten habe?

Antwort

1

Bluetooth-bezogene Probleme können sehr schwer zu identifizieren sein. Wir sind in der Vergangenheit auf einige unerklärliche Fehler gestoßen. Die einzige Möglichkeit, festzustellen, warum BLE nicht mehr funktionierte oder sich schlecht benahm, bestand darin, sich die CoreBluetooth-Protokolle auf dem Gerät anzusehen.

Falls Sie dies noch nicht versucht haben, können Sie diese Protokolle über ein Konfigurationsprofil aktivieren, das Sie von der Apple Developer Pages herunterladen können (suchen Sie nach Bluetooth und folgen Sie den Anweisungen).

Sobald Sie die Protokollierung aktivieren, können Sie ein vollständiges Protokoll vom zugrunde liegenden BLE-Stapel herunterladen, der Ihnen sagt, was schief gelaufen ist. Sie sagen Ihnen sogar, ob Sie die API in irgendeiner Weise missbraucht haben. Ich hoffe, das hilft.

+0

oh, das helfen soll, Ereignis denken nicht über eine solche Möglichkeit – gbk

+0

Ja, es ist eine der verborgenen Schätze der iOS-Entwicklung. Bereite dich darauf vor, eine Menge C++ - Logging für den Bluetooth-Stack zu lesen ;-). –

1

Aus meiner Erfahrung mit CoreBluetooth State Preservation and Restoration bin ich zu dem Schluss gekommen, dass es nicht zuverlässig funktioniert. Sie können es als eine Art "ok" funktionieren lassen, aber Sie werden es nie wieder zuverlässig verbinden, wenn Sie lang laufende ausstehende Verbindungen im Hintergrund verwenden.

Ich habe mehrere Bugs in diesem Zusammenhang gemeldet, aber der schwerwiegendste ist meiner Meinung nach: Wenn der Bluetooth Manager den Status wechselt, während die App beendet wird, gehen alle ausstehenden Verbindungen verloren (da sie vom Modul nicht gespeichert werden) der iOS-Stack). Da Bluetooth-Statusschalter nicht dazu führen, dass Ihre App neu gestartet wird, bedeutet dies einfach, dass Ihre ausstehende Verbindung zu einem beliebigen Zeitpunkt verloren gehen kann und Sie nichts davon wissen. Dies bedeutet für sich, dass die staatliche Restaurierung eher nutzlos ist. Man könnte sagen, dass dies kein Fehler ist, sondern eine schlechte Design-Wahl ...

Eine andere ist, dass das Framework manchmal in einem schlechten Zustand "hängt" (möglicherweise durch eine interne Race-Bedingung oder ähnliches). Dies kann zufällig geschehen, aber Sie können dies ganz einfach reproduzieren, indem Sie connectPeripheral sofort im Rückruf didFailToConnect oder didDisconnect aufrufen. Wenn dies geschieht, wird der connectionState auf die Verbindung eingestellt, während dies in der Tat nicht der Fall ist.

Und so weiter ...

/Anton