6 votes

La publicité CoreBluetooth en arrière-plan sur iOS 10

Premièrement : j'ai un iPad Air 2 et un iPhone 7. Pour plus de détails, nous estimons que l'application est active et ouverte sur l'iPad et en mode arrière-plan sur l'iPhone. L'application est exactement la même, même avec les mêmes UUID de service Bluetooth et la même clé DataLocalName.

Je veux écrire une application qui peut diffuser un service bluetooth en arrière-plan et est capable de découvrir ce service (idéalement en arrière-plan également). Comme je l'ai déjà lu, je ne peux pas utiliser la technologie beacon d'Apple car il n'est possible de scanner/d'être notifié par les balises à proximité en arrière-plan (j'ai testé cela, ça fonctionne bien) mais pas de diffuser. J'ai donc commencé à utiliser CoreBluetooth comme décrit dans la réponse SO mentionnée car il est possible de diffuser en arrière-plan.

Mon application appelle la méthode didDiscoverPeripheral dans CBCentralManagerDelegate sur l'iPhone (application en arrière-plan), donc elle détecte l'iPad. La propriété isAdvertising de CBPeripheralManager sur l'iPhone est true. Mais didDiscoverPeripheral n'est pas appelé sur l'iPad. Je suis un peu confus. Une option est que mon iPad n'est plus en mesure de détecter l'iPhone pour une raison quelconque ou que mon iPhone ment et ne diffuse pas.

Donc j'ai pensé que je suis juste un peu bête et j'ai cherché sur "CoreBluetooth debug apps". J'ai trouvé Vicinity et AltBeacon. Et avec les deux applications, le comportement est le même ! Si vous mettez en arrière-plan (en appuyant sur le bouton home/sleep) l'application de diffusion, l'application de recherche n'est plus en mesure de le découvrir. Si vous ouvrez l'application en arrière-plan, elle le découvrira instantanément. Les deux applications mentionnent qu'il est possible avec elles de diffuser en arrière-plan.

Est-ce que je fais quelque chose de mal ; ce comportement est-il attendu ? Ai-je mal compris le framework ? Pouvez-vous confirmer ce comportement ?

Pour confirmer cela, la manière la plus rapide est d'installer Vicinity sur deux appareils (vous devez ajouter la clé NSBluetoothPeripheralUsageDescription à Info.plist) configurer un appareil pour diffuser et appuyer sur le bouton home.

6voto

davidgyoung Points 14271

Ce n'est pas spécifique à iOS 10 - cela a toujours été le cas sur iOS. Sous iOS, les applications ne peuvent tout simplement pas envoyer des publicités Bluetooth LE standard lorsqu'elles sont en arrière-plan. Elles doivent être au premier plan pour le faire.

Cela dit, iOS offre une prise en charge limitée des applications qui annoncent des services GATT en arrière-plan. Cela utilise une technique propriétaire qui ne fonctionne qu'avec d'autres appareils iOS qui recherchent ces services. (Parce qu'il utilise un schéma propriétaire non standard, la même technique ne fonctionnera pas pour les annonces de balises, par exemple.)

Voici comment Apple le décrit :

...vous devez savoir que la publicité lorsque votre application est en arrière-plan fonctionne différemment que lorsque votre application est au premier plan. En particulier, lorsque votre application fait de la publicité en étant en arrière-plan :

  • La clé d'annonce CBAdvertisementDataLocalNameKey est ignorée, et le nom local du périphérique n'est pas annoncé.
  • Tous les UUID de service contenus dans la valeur de la clé d'annonce CBAdvertisementDataServiceUUIDsKey sont placés dans une zone "overflow" spéciale ; ils ne peuvent être découverts que par un appareil iOS qui les recherche explicitement.
  • Si toutes les applications qui font de la publicité sont en arrière-plan, la fréquence à laquelle votre appareil périphérique envoie des paquets publicitaires peut diminuer.

En savoir plus ici : https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html

2voto

Daij-Djan Points 18696

C'était un bug dans ios 10.0.(1) et partiellement corrigé dans ios 10.1

src: https://forums.developer.apple.com/thread/51309

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X