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
Zusätzlich zu Chris 'Antwort:
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:
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
quelle
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:
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).
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.
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).
quelle
Ich habe gerade den Hintergrundmodus für BLE-Geräte unter iOS8.3 und 8.4 gelernt und einige Unterschiede von oben festgestellt:
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.
quelle