Le sujet dit tout, vraiment. La documentation, dans la mesure où elle existe, suggère que les applications écrites contre le framework CoreBluetooth fonctionnant sur les appareils iOS peuvent ajouter "bluetooth-central" à leur liste de privilèges en arrière-plan et ainsi traiter une sorte d'événements Bluetooth tout en étant inactifs, mais qui exact les événements sont-ils et ne sont-ils pas livrés?
Par exemple:
Personne ne semblait le savoir, j'ai donc acheté un compte de développeur iOS et effectué quelques expériences. Voici ce que j'ai trouvé:
Lors de l'exécution au premier plan, vous pouvez démarrer une analyse à l'aide de CBCentralManager :: scanForPeripheralsWithServices. Votre analyse peut être restreinte aux appareils annonçant un service particulier, ou non restreinte (passez zéro pour le paramètre de cet appel). Il peut également autoriser ou interdire les doublons; dans le premier cas, vous obtiendrez un rappel didDiscoverPeripheral chaque fois que l'iPhone reçoit un paquet de publicité; dans ce dernier, vous ne recevrez qu'un seul rappel par appareil trouvé.
Lorsque vous entrez en arrière-plan, les règles semblent être les suivantes:
Je ne sais pas si les tentatives de connexion à des appareils non connectables (par exemple, les annonceurs BLE, comme ceux qui implémentent le profil de proximité) sont assez bonnes car mes exemples d'appareils sont connectables. Cependant, au moins pour les périphériques connectables, cette procédure de numérisation/connexion/déconnexion/numérisation suffit pour interroger la présence d'un périphérique en arrière-plan.
Les résultats ci-dessus ont été recueillis à l'aide d'un iPhone 4S exécutant iOS 5.0.1
En plus de la réponse de Chris:
peripheral:didUpdateValueForCharacteristic:error:
) du périphérique en arrière-plan, même après 10 minutes.Ainsi, lorsque vous souhaitez exécuter en continu en arrière-plan, vous avez 2 options:
Plus tard devrait être le "Contexte de l'événement" des vidéos Bluetooth de base de la WWDC 2012 https://developer.Apple.com/videos/wwdc/2012/ Mais le premier ressemble à un hack, je ne veux pas compter sur elle.
J'ai testé cela sur iPhone5, iOS6.1.4
Apple a finalement publié le Core Bluetooth Programming Guide et voici la note officielle sur
Traitement d'arrière-plan Bluetooth principal pour les applications iOS
Il est également bon de noter le comportement de l'arrière-plan et de CoreBluetooth liés aux iBeacons, bien que Apple aime à penser à cela comme une fonctionnalité CoreLocation:
Lorsque les notifications pour une région iBeacon sont activées, elles avisent l'utilisateur de l'entrée ou de la sortie de la région. Ces notifications peuvent être effectuées selon que l'affichage est allumé ou éteint. Ces notifications fonctionnent même lorsque l'application demandant des notifications est en arrière-plan. (Cela est clair dans la documentation).
Pas si évident: si vous utilisez l'API de télémétrie iBeacon, votre application doit être au premier plan. Il ne le dit pas explicitement dans la documentation - en fait, on peut être trompé en pensant que la plage devrait fonctionner en arrière-plan à partir de la documentation. Cependant, un ingénieur Apple Apple clarifie cela dans un message enterré quelque part dans un long fil sur le forum des développeurs Apple, et j'ai également vu cela échouer. ne fonctionnera qu'au premier plan.
On peut découvrir d'autres services annoncés par un iBeacons publicitaire périphérique. Mais cela ne fonctionnera qu'au premier plan. Donc, si vous souhaitez que le central soit informé de la proximité à l'aide d'iBeacons, puis effectuez d'autres transactions à l'aide d'autres services basés sur BLE, cela fonctionnera, mais uniquement au premier plan. Cela ne fonctionnera pas en arrière-plan. Pour les transactions avec des services basés sur BLE en arrière-plan, la publicité doit être une publicité BLE régulière, pas une iBeacon. Vous ne pouvez pas utiliser une publication iBeacon pour aider le processus de découverte en arrière-plan, puis passer à l'utilisation des services BLE en arrière-plan. (J'aurais beaucoup aimé que cela fonctionne, mais pas de dés).
Je viens d'apprendre le mode d'arrière-plan pour les appareils BLE sur iOS8.3 et 8.4 et j'ai trouvé quelques différences par rapport au dessus:
si je commence
[centralManager scanForPeripheralsWithServices: @ [[CBUUID UUIDWithString: kServiceUUID]] options: @ {CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];
de
- (void)applicationDidEnterBackground:(UIApplication *)application
J'ai trouvé que l'énumération renvoie le même périphérique à chaque appel avec un RSSI différent, donc CBCentralManagerScanOptionAllowDuplicatesKey n'est pas ignoré.