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


Das Thema sagt alles, wirklich. Die Dokumentation, soweit sie überhaupt existiert, legt nahe, dass Apps, die auf dem CoreBluetooth-Framework auf iOS-Geräten geschrieben wurden, "Bluetooth-Central" zu ihrer Hintergrund-Privilegliste hinzufügen und so einige Bluetooth-Ereignisse verarbeiten können, während sie inaktiv sind genau Ereignisse werden und werden nicht geliefert?

Beispielsweise:

  1. Kann ich die Kommunikation mit einem Gerät fortsetzen, mit dem ich bereits eine Verbindung hergestellt habe?
  2. Kann ich periodische Ermittlungsanfragen stellen, um Geräte zu finden, die außerhalb der Reichweite liegen oder die ich noch nie gesehen habe? (Zum Beispiel, wenn ich in der Lage sein möchte, eine Benachrichtigung zu senden, wenn ein neues interessantes Gerät angetroffen wird)
  3. Was passiert, wenn ein Gerät außer Reichweite gerät und dann wiederkommt? Bekomme ich Verbindungs- und Verbindungsereignisse ohne Benutzereingriff, oder muss ich im Vordergrund stehen und muss der Benutzer explizit eine erneute Verbindung anfordern?

76
2018-03-27 19:44


Ursprung


Antworten:


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 arbeiten, können Sie einen Scan mit CBCentralManager :: scanForPeripheralsWithServices starten. Ihr Scan kann sein beschränkt an Geräte, die einen bestimmten Dienst bewerben, oder uneingeschränkt (Nullen für den Parameter dieses Aufrufs). Es kann auch ermöglichen oder verbieten Duplikate; Im ersten Fall erhalten Sie einen didDiscoverPeripheral Callback, wenn das iPhone ein Werbepaket erhält. In letzterem Fall wird nur ein Callback pro Gerät gefunden.

Wenn Sie den Hintergrund eingeben, scheinen die Regeln wie folgt zu sein:

  • Wenn du ein uneingeschränkt scannen, wird es automatisch abgebrochen. Sie erhalten keine didDiscover Callbacks.
  • Wenn dein Scan war beschränkt (d. h. Sie haben eine oder mehrere Dienst-UUIDs angegeben, nach denen Sie gesucht haben). Ihr Scan wird weiterhin ausgeführt, aber der allow duplicates Flag wird ignoriert. Dies bedeutet, dass Sie nur noch didDiscoverPeripheral Callbacks für erhalten Neu Geräte. Wenn alle Geräte im Vordergrund gesehen wurden, erhalten Sie keine Rückrufe.
  • Starten und Stoppen des Scans nicht Setzen Sie zurück, welche Geräte als neu betrachtet werden. Wenn ein Gerät vorhanden ist, erhalten Sie nur einen einzigen Rückruf, sogar über mehrere Scans, es sei denn ...
  • Wenn du verbinden dann zu einem Gerät trennen, dann Erneut scannen, das Gerät wird erneut aufgelistet (d. h. Sie erhalten einen weiteren Anruf an didDiscoverPeripheral). Ich denke, iOS sieht das als "Interesse gezeigt" in dem Gerät.

Ich weiß nicht, ob Verbindungsversuche zu nichtverbindungsfähigen Geräten (z. B. BLE Advertisers wie die, die das Näherungsprofil implementieren) gut genug sind, da meine Beispielgeräte verbindbar sind. Zumindest für anschließbare Geräte reicht diese Scan / Connect / Disconnect / Scan-Prozedur aus, um die Anwesenheit eines Geräts im Hintergrund abzufragen.

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


119
2018-04-10 20:48



Zusätzlich zu Chris Antwort:

  • Wenn Ihre App den Hintergrundmodus "Bluetooth-Central" hat und mit einem Peripheriegerät verbunden ist, können Sie Benachrichtigungen erhalten (peripheral:didUpdateValueForCharacteristic:error:) von der Peripherie im Hintergrund, auch nach 10 Minuten.

Wenn Sie also kontinuierlich im Hintergrund laufen möchten, haben Sie 2 Möglichkeiten:

  • Führen Sie die Schleife "Verbinden, trennen, erneut scannen" aus
  • Veranlassen Sie, dass die Peripheriegeräte Benachrichtigungen senden

Später sollte der "Event Backgrounding" von WWDC 2012 Core Bluetooth Videos sein https://developer.apple.com/videos/wwdc/2012/ Aber ersteres sieht wie ein Hack aus, ich will mich nicht darauf verlassen.

Ich habe das auf iPhone5, iOS6.1.4 getestet


Apple hat endlich die Core Bluetooth Programmieranleitung und hier ist die offizielle Anmerkung über

Core Bluetooth Hintergrundverarbeitung für iOS Apps


8
2017-07-05 08:08



Es ist auch gut, das Verhalten von Hintergrund und CoreBluetooth in Bezug auf die iBeacons zu beachten, obwohl Apple dies gerne als eine CoreLocation-Funktionalität betrachtet:

  1. Wenn Benachrichtigungen für eine iBeacon-Region aktiviert sind, werden sie den Benutzer über das Eingeben oder Beenden von Regionen informieren. Diese Benachrichtigungen können davon abhängig gemacht werden, ob die Anzeige aktiviert oder deaktiviert ist. Diese Benachrichtigungen funktionieren auch, wenn die App, die Benachrichtigungen anfordert, im Hintergrund ist. (So ​​viel ist in der Dokumentation klar).

  2. Nicht so offensichtlich: Wenn Sie die iBeacon-Ranging-API verwenden, muss Ihre App im Vordergrund stehen. Dies wird in der Dokumentation nicht ausdrücklich erwähnt - tatsächlich kann man irregeführt werden, wenn man davon ausgeht, dass die Entfernungsmessung im Hintergrund von der Dokumentation aus arbeiten sollte. Ein Apple-Techniker klärt das jedoch in einem Post, der irgendwo in einem langen Thread im Apple-Entwicklerforum vergraben ist, und ich habe gesehen, dass dies auch fehlgeschlagen ist. Ranging funktioniert nur im Vordergrund.

  3. Man kann andere Dienste entdecken, die von einer peripheren Werbung iBeacons beworben werden. Aber das wird nur im Vordergrund funktionieren. Wenn Sie möchten, dass die Zentrale mit iBeacons über die Nähe benachrichtigt wird und dann andere Transaktionen mit anderen BLE-basierten Diensten ausführt, funktioniert dies zwar, aber nur im Vordergrund. Es wird nicht im Hintergrund funktionieren. Bei Transaktionen mit BLE-basierten Diensten im Hintergrund muss die Werbung eine reguläre BLE-Werbung sein, kein iBeacon. Sie können keine iBeacon-Werbung verwenden, um den Erkennungsprozess im Hintergrund zu unterstützen, und dann im Hintergrund auf die Verwendung von BLE-Services umschalten. (Ich hätte sehr gerne, dass das funktioniert, aber keine Würfel).


7
2017-10-18 20:08



Ich habe gerade Hintergrundmodus für BLE-Geräte auf iOS8.3 & 8.4 gelernt und habe einige Unterschiede von oben gefunden:

  1. wenn ich anfange

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

von

- (void)applicationDidEnterBackground:(UIApplication *)application

Ich habe festgestellt, Enumeration gibt das gleiche Gerät jeden Anruf mit verschiedenen RSSI, Daher wird CBCentralManagerScanOptionAllowDuplicatesKey nicht ignoriert.

  1. Wenn sich die App im Vordergrund befindet, wurde das BLE-Gerät 50 Mal in Sek. Gefunden. Wenn die App im Hintergrund ist, aber der Telefonbildschirm aktiv ist, wurden 6 Mal in Sek. BLE-Geräte erkannt. Wenn der Telefonbildschirm blockiert ist, wurden die BLE-Geräte 1 Mal in Sekunden erkannt.

4
2017-07-13 11:49