Was genau können CoreBluetooth-Anwendungen im Hintergrund tun?

78

Das Thema sagt wirklich alles. Die Dokumentation legt nahe, dass Apps, die gegen das CoreBluetooth-Framework geschrieben wurden, das auf iOS-Geräten ausgeführt wird, "Bluetooth-Zentral" zu ihrer Hintergrundberechtigungsliste hinzufügen und so eine Art von Bluetooth-Ereignissen verarbeiten können, während sie inaktiv sind, aber welche genauen Ereignisse dies tun und tun nicht geliefert bekommen?

Zum Beispiel:

  1. Kann ich mit einem Gerät kommunizieren, mit dem ich bereits eine Kopplung hergestellt habe?
  2. Kann ich regelmäßige Erkennungsanfragen stellen, um Geräte zu finden, die außerhalb der Reichweite liegen / die ich noch nie gesehen habe? (Zum Beispiel, wenn ich eine Benachrichtigung übermitteln wollte, wenn ein neues interessantes Gerät gefunden wird)
  3. Was ist, wenn ein Gerät außerhalb der Reichweite liegt und dann zurückkommt? Erhalte ich getrennte und verbundene Ereignisse ohne Benutzereingriff oder muss ich im Vordergrund stehen und den Benutzer explizit eine erneute Verbindung anfordern lassen?
Chris Smowton
quelle

Antworten:

120

Niemand schien es zu wissen, also kaufte ich ein iOS-Entwicklerkonto und führte einige Experimente durch. Folgendes habe ich gefunden:

Wenn Sie im Vordergrund ausgeführt werden, können Sie einen Scan mit CBCentralManager :: scanForPeripheralsWithServices starten. Ihr Scan kann auf Geräte beschränkt sein , die für einen bestimmten Dienst werben, oder uneingeschränkt (für den Parameter dieses Anrufs wird Null übergeben). Es kann auch Duplikate zulassen oder nicht zulassen . Im ersteren Fall erhalten Sie jedes Mal einen didDiscoverPeripheral-Rückruf, wenn das iPhone Werbepakete empfängt. In letzterem Fall erhalten Sie nur einen Rückruf pro gefundenem Gerät.

Wenn Sie den Hintergrund eingeben, sehen die Regeln wie folgt aus:

  • Wenn Sie einen uneingeschränkten Scan ausgeführt haben, wird dieser stillschweigend abgebrochen. Sie erhalten keine didDiscover-Rückrufe.
  • Wenn Ihr Scan eingeschränkt war (dh Sie haben eine oder mehrere Dienst-UUIDs angegeben, nach denen Sie gesucht haben), wird Ihr Scan weiterhin ausgeführt, das Flag "Duplikate zulassen" wird jedoch ignoriert . Dies bedeutet, dass Sie jetzt nur didDiscoverPeripheral-Rückrufe für neue Geräte erhalten. Wenn alle Geräte im Vordergrund gesehen wurden, erhalten Sie überhaupt keine Rückrufe.
  • Durch Starten und Stoppen des Scans wird nicht zurückgesetzt, welche Geräte als neu gelten. Wenn ein Gerät vorhanden ist, erhalten Sie auch bei mehreren Scans nur einen einzigen Rückruf, es sei denn ...
  • Wenn Sie eine Verbindung zu einem Gerät herstellen, dann die Verbindung trennen und erneut scannen , wird das Gerät erneut aufgelistet (dh Sie erhalten einen weiteren Aufruf von didDiscoverPeripheral). Ich denke, iOS betrachtet dies als "Interesse gezeigt" an dem Gerät.

Ich weiß nicht, ob Verbindungsversuche mit nicht verbindbaren Geräten (z. B. BLE Advertisers, wie diejenigen, die das Näherungsprofil implementieren) gut genug sind, da meine Beispielgeräte verbindbar sind. Zumindest für anschließbare Geräte reicht dieses Verfahren zum Scannen / Verbinden / Trennen / Scannen jedoch aus, um die Anwesenheit eines Geräts im Hintergrund abzufragen.

Die obigen Ergebnisse wurden mit einem iPhone 4S unter iOS 5.0.1 gesammelt

Chris Smowton
quelle
2
Hey Chris. Interessant! Eines verstehe ich allerdings nicht. Kann der Prozess im Hintergrund weiterlaufen, wenn er mit einem Bluetooth-Design kommuniziert? (Könnte ich zum Beispiel einen Herzfrequenzmesser anschließen und dann die Anwendung in den Hintergrund verschieben und erwarten, dass sie weiter ausgeführt wird?)
Ben
2
Hallo Ben. Es läuft nicht mehr so ​​weiter wie im Vordergrund, wird aber weiterhin ausgeführt, wenn Bluetooth-Ereignisse der oben beschriebenen Art auftreten. Ein Problem, auf das ich gestoßen bin, ist, dass selbst in dieser Situation, wenn für eine Weile keine Benutzerinteraktion stattfindet, das Telefon in den Ruhezustand wechselt und die App nicht mehr aufgerufen wird. Ich habe dies umgangen, indem ich mich (fälschlicherweise) als Audioanwendung registriert habe, wodurch eine Unterbrechung verhindert wird. Dies ist jedoch für den App Store offensichtlich unzulässig.
Chris Smowton
Hallo Chris. Guter Eintrag. Ihr letzter Kommentar negiert die Aussage in diesem Beitrag: lists.apple.com/archives/bluetooth-dev/2011/Dec/msg00007.html Dies sind keine guten Nachrichten. Denken Sie, dass dies ein tatsächlicher Fehler in der Implementierung ist? Haben Sie eine Verbindung zu einem Gerät hergestellt? Können Sie bestätigen, dass die Benachrichtigungen zur Wertaktualisierung ebenfalls beendet werden? Vielen Dank.
Allprog
1
@ChrisSmowton Ich weiß, dass Sie kein iOS-Gerät mehr haben. Aber haben Sie eine Idee, wie man zwischen iOS, das ein Duplikat ignoriert, und iOS, das kein Peripheriegerät findet, unterscheiden kann?
Shreyashirday
3
Wenn Sie es seit Ihrer letzten Verbindung nicht mehr gesehen haben, ist es nicht vorhanden. Wenn Sie es gesehen haben, kann ich es nur im Hintergrund wiederfinden, indem ich versuche, eine Verbindung herzustellen.
Chris Smowton
9

Zusätzlich zu Chris 'Antwort:

  • Wenn Ihre App über den Hintergrundmodus "Bluetooth-Zentral" verfügt und mit einem Peripheriegerät verbunden ist, können Sie peripheral:didUpdateValueForCharacteristic:error:auch nach 10 Minuten Benachrichtigungen ( ) vom Peripheriegerät im Hintergrund erhalten.

Wenn Sie also kontinuierlich im Hintergrund ausgeführt werden möchten, haben Sie zwei Möglichkeiten:

  • Führen Sie die Schleife "Verbinden, trennen, erneut scannen" aus
  • Senden Sie Benachrichtigungen an das Peripheriegerät

Später sollte der "Event-Hintergrund" von WWDC 2012 Core Bluetooth-Videos https://developer.apple.com/videos/wwdc/2012/ sein. Ersteres sieht jedoch wie ein Hack aus, ich möchte mich nicht darauf verlassen.

Ich habe dies auf iPhone5, iOS6.1.4 getestet


Apple hat endlich den Core Bluetooth Programming Guide veröffentlicht und hier ist der offizielle Hinweis dazu

Kern-Bluetooth-Hintergrundverarbeitung für iOS-Apps

Maische
quelle
7

Es ist auch gut, das Verhalten von Hintergrund und CoreBluetooth im Zusammenhang mit den iBeacons zu beachten, obwohl Apple dies gerne als CoreLocation-Funktionalität betrachtet:

  1. Wenn Benachrichtigungen für eine iBeacon-Region aktiviert sind, werden sie den Benutzer über den Ein- oder Ausgang der Region benachrichtigen. Diese Benachrichtigungen können abhängig davon erfolgen, ob die Anzeige ein- oder ausgeschaltet ist. Diese Benachrichtigungen funktionieren auch dann, wenn sich die App, die Benachrichtigungen anfordert, im Hintergrund befindet. (So ​​viel ist in der Dokumentation klar).

  2. Nicht so offensichtlich: Wenn Sie die iBeacon-Bereichs-API verwenden, muss Ihre App im Vordergrund stehen. Dies wird in der Dokumentation nicht explizit angegeben. Tatsächlich kann man irreführen, wenn man denkt, dass das Sortieren im Hintergrund der Dokumentation funktionieren sollte. Ein Apple-Ingenieur klärt dies jedoch in einem Beitrag, der irgendwo in einem langen Thread im Apple-Entwicklerforum vergraben ist, und ich habe auch gesehen, dass dies fehlschlägt. Das Ranging funktioniert nur im Vordergrund.

  3. Man kann andere Dienste entdecken, die von iBeacons für periphere Werbung beworben werden. Dies funktioniert aber nur im Vordergrund. Wenn Sie also möchten, dass die Zentrale mithilfe von iBeacons über die Nähe informiert wird und dann einige andere Transaktionen mit anderen BLE-basierten Diensten ausführen, funktioniert dies, jedoch nur im Vordergrund. Es wird nicht im Hintergrund funktionieren. Für Transaktionen mit BLE-basierten Diensten im Hintergrund muss die Anzeige eine reguläre BLE-Anzeige sein, kein iBeacon. Sie können keine iBeacon-Ankündigung verwenden, um den Erkennungsprozess im Hintergrund zu unterstützen, und dann zur Verwendung von BLE-Diensten im Hintergrund wechseln. (Ich hätte es sehr gern gesehen, aber keine Würfel).

user108
quelle
4

Ich habe gerade den Hintergrundmodus für BLE-Geräte unter iOS8.3 und 8.4 gelernt und einige Unterschiede von oben festgestellt:

  1. wenn ich anfange

    [centralManager scanForPeripheralsWithServices: @ [[CBUUID UUIDWithString: kServiceUUID]] Optionen: @ {CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];

von

- (void)applicationDidEnterBackground:(UIApplication *)application

Ich habe festgestellt, dass die Aufzählung bei jedem Aufruf mit unterschiedlichem RSSI dasselbe Gerät zurückgibt, sodass CBCentralManagerScanOptionAllowDuplicatesKey nicht ignoriert wird.

  1. Wenn sich die App im Vordergrund befindet, wurde das BLE-Gerät 50 Mal in Sekunden entdeckt. Wenn sich die App im Hintergrund befindet, der Telefonbildschirm jedoch aktiv ist, hat die App BLE-Geräte 6-mal in Sekunden entdeckt. Wenn der Telefonbildschirm blockiert ist, hat die App BLE-Geräte 1 Mal in Sekunden entdeckt.
Igor Vlasov
quelle
1
Gut zu wissen, hört sich so an, als hätten sie den Stack verbessert, seit ich ihn 2012 verwendet habe :)
Chris Smowton