Pourquoi les applications de suivi des contacts sur mesure ne fonctionnent pas si bien sur iOS
Alors qu’Apple et Google travaillent sur un nouveau API de suivi des contacts multiplateforme pour aider à lutter contre la pandémie de COVID-19, nous commençons à voir certains pays publier des applications sur mesure conçues en utilisant uniquement les API Bluetooth existantes sur chaque plate-forme.
Ce que nous voyons rapidement dans les médias à propos de ces solutions, c’est que l’application iOS a certaines limites en arrière-plan (c’est-à-dire pas l’application visible et active), et en conséquence, les créateurs de ces applications recommandent souvent aux gens de quitter l’iOS l’application au premier plan, ou qu’ils fonctionnent mieux si les appareils Android sont à proximité.
IMPORTANT: Ce message n’est pas conçu pour appeler une mise en œuvre spécifique par un pays, et vous ne devriez pas vous inquiéter en tant que lecteur de télécharger l’un d’entre eux! Bien que le consensus général soit qu’il est préférable que les pays utilisent le cadre Apple | Google, nous devons toujours utiliser ce qui est actuellement disponible jusqu’à ce que quelque chose de potentiellement meilleur soit disponible.
Ce que nous ne voyons pas vraiment dans les médias, c’est une explication technique de haut niveau Pourquoi Les applications iOS de suivi des contacts sur mesure semblent être si inefficaces lorsqu’elles fonctionnent en arrière-plan, et pourquoi Android n’a pas les mêmes limitations. Je vise à couvrir exactement cela dans ce post à un niveau élevé. Vous n’avez pas besoin d’être développeur pour lire cet article!
TL; DR: C’est à cause de la façon dont iOS restreint les développeurs exécutant des applications en arrière-plan pour protéger la confidentialité et la durée de vie de la batterie, ce qui est très différent de la façon dont Android permet aux applications de s’exécuter en arrière-plan.
Je vous recommande vraiment de lire l’intégralité du post, vous en apprendrez beaucoup sur le fonctionnement d’iOS et d’Android, et plus de détails sur les raisons pour lesquelles cela signifie que les applications de suivi des contacts ont des problèmes sur iOS, et tout un tas d’autres choses intéressantes!
Qu’est-ce qu’une application de suivi des contacts
Avant d’aller plus loin, vous vous demandez peut-être à quoi sert une application Contact Tracing. En termes simples, il est conçu pour garder une trace des personnes avec lesquelles vous avez été proche, et si l’une de ces personnes est diagnostiquée avec COVID-19, vous pouvez être averti afin que vous puissiez vous auto-isoler ou vous faire tester, et d’autres personnes dont vous avez été proche peut faire de même. Pour que cela soit efficace, il doit être installé sur de nombreux appareils!
Les applications de suivi des contacts sur iOS et Android utilisent ce que l’on appelle Bluetooth basse énergie (LE), que j’appellerai simplement Bluetooth tout au long de cet article. J’écris cet article en tant que personne qui a développé et publié deux applications iOS qui utilisent Bluetooth de manière fiable en arrière-plan, et j’ai porté l’une de ces applications sur Android, ce qui m’a beaucoup appris sur les différences entre les deux plates-formes lorsque il s’agit d’exécuter le code de manière fiable alors que l’application n’est pas l’application de premier plan (visible).
COMMENTAIRE: Je peux vous dire tout de suite, beaucoup de gens n’aiment pas laisser les applications fonctionner. Étant donné que mes utilisateurs n’aiment même pas laisser mes applications s’exécuter dans le commutateur d’applications iOS, ils n’utiliseraient certainement pas mon application si cela signifiait de laisser l’application en cours d’exécution au premier plan (afin que l’application soit visible) à tout moment!
Maintenant que nous savons ce qu’est une application Contact Tracing, parlons exactement Pourquoi les créateurs de ces applications recommandent aux utilisateurs de laisser leurs applications iOS s’exécuter au premier plan pour les rendre plus fiables et pourquoi ce n’est pas un problème sur Android.
Le cycle de vie de l’application iOS
Commençons par les bases, car il est important de comprendre le cycle de vie général d’une application iOS avant de continuer.
Lorsque nous créons une application iOS, par défaut, elle ne peut pas du tout fonctionner en arrière-plan, même lorsqu’il apparaît sur iOS Commutateur d’application. Lorsque vous quittez l’application pour accéder à l’écran d’accueil ou à une autre application, le système «fige» l’application après quelques secondes et la place dans ce que l’on appelle un «suspendu » Etat. À ce stade, l’application n’est plus au premier plan et n’est plus l’application active.
REMARQUE: Il est important de comprendre que votre application n’utilise aucune batterie lorsqu’elle est suspendue. Même si cela apparaît dans l’App Switcher, il ne fait rien!
Dans l’état suspendu, si une autre application (ou iOS elle-même!) A besoin de plus de mémoire (RAM), l’application suspendue peut être arrêtée. En tant qu’utilisateur, vous verrez toujours l’application dans le sélecteur d’applications, mais c’est juste un image du dernier état de l’interface utilisateur avant qu’il ne soit suspendu.
Bien sûr, les choses ont changé depuis iPhone OS 1.0 et les applications iOS peuvent désormais effectuer certaines tâches en arrière-plan, notamment continuer à lire du son comme Spotify, suivre votre position (avec autorisation) comme Strava, et également utiliser Bluetooth (encore une fois, avec autorisation), comme les applications Contact Tracing.
Pour que cela se produise, lorsque nous créons notre application iOS, nous devons déclarer au système (iOS) que notre application souhaite effectuer certaines tâches en arrière-plan. Nous le déclarons en activant un ou plusieurs « modes d’arrière-plan« .
Une fois que nous avons activé un mode d’arrière-plan spécifique, nous pouvons alors utiliser des API spéciales qui permettent d’effectuer ces tâches. Chaque mode d’arrière-plan a des API et des règles différentes et a un impact différent sur la durée de vie de la batterie de votre appareil. Pour cet article, nous nous soucions uniquement de ceux Bluetooth.
Les modes d’arrière-plan Bluetooth LE
Pour utiliser Bluetooth en arrière-plan sur iOS, nous devons activer l’un (ou les deux) de deux modes d’arrière-plan différents pour notre application (plus de détails sur la différence entre eux plus tard).
Une fois que nous avons activé le ou les modes d’arrière-plan appropriés, notre application peut continuer à utiliser les API Bluetooth pertinentes sans être l’application active, mais il y a des règles vraiment nuancées comment cela fonctionne et ce que nous pouvons faire.
Mais, avant de pouvoir entrer dans les détails, je dois vous expliquer les deux différents types d’API Bluetooth qu’une application iOS peut utiliser! Dans Bluetooth LE, il existe un concept de Central et un Périphérique.
UNE Central est généralement quelque chose comme un téléphone ou un ordinateur portable. Vous pouvez penser à cela comme client.
UNE Périphérique est généralement quelque chose comme un moniteur de fréquence cardiaque, ou un appareil comme une planche à roulettes électrique. Vous pouvez penser à cela comme serveur.
Le périphérique (ou le serveur) possède des données et le central (ou le client) souhaite lire ces données. Le périphérique annonce lui-même, et la centrale peut analyse pour cela, connectez-vous une fois qu’il le trouve et lisez quelques données. Le concept de publicité et de numérisation est important à retenir pour plus tard dans ce post.
Les applications iOS et Android peuvent agir comme tous les deux le Central et le Périphérique à la fois, ce qui les rend (presque) parfaits pour une utilisation en tant qu’application Contact Tracing.
Comment les applications de suivi des contacts utilisent Bluetooth LE
À un niveau extrêmement élevé, la façon dont une application Contact Tracing pourrait fonctionner, c’est que chaque appareil iOS et Android sur lequel l’application est installée permet à l’application d’agir à la fois comme centrale et périphérique.
Cela signifie que chaque appareil simultanément annonce lui-même à d’autres appareils à découvrir et à connecter, ainsi que scans pour que d’autres appareils à proximité puissent le découvrir et s’y connecter.
Lorsqu’ils se découvrent, ils peuvent se connecter, transférer une petite quantité de données pour identifier cet appareil, puis utiliser ces informations pour pouvoir dire que ces deux appareils se sont rapprochés.
REMARQUE: Je ne vais pas entrer dans les détails sur la confidentialité ou la cryptographie ici, c’est un tout autre sujet!
Pour que cela fonctionne correctement, cela doit se produire indépendamment du fait qu’un utilisateur utilise actuellement votre application au premier plan, qu’il ait le téléphone verrouillé ou qu’il utilise simplement une autre application.
Pour que cela se produise dans notre application iOS, nous devons activer les deux modes d’arrière-plan mentionnés ci-dessus qui permettent à l’application de continuer à utiliser les API Bluetooth en tant que central et périphérique tout en n’étant plus l’application active.
Une fois que nous les aurons activés, si nous commençons à faire de la publicité en tant que périphérique et à rechercher d’autres périphériques en tant que central, cela continuer à se produire lorsque notre application n’est plus l’application active et notre application est en arrière-plan.
Même si nous avons maintenant activé les modes d’arrière-plan et faisons de la publicité et de la numérisation, notre application toujours entrer dans l’état suspendu après quelques secondes d’être en arrière-plan. Le système lui-même prend en charge la numérisation et la publicité, tandis que notre application est complètement gelée.
REMARQUE: C’est l’une des raisons pour lesquelles les applications Bluetooth LE utilisent si peu d’énergie sur votre iPhone!
Ce n’est que lorsqu’un événement Bluetooth se produit (comme la découverte d’un autre périphérique) que notre application est reprise (non suspendue) en arrière-plan pour gérer l’événement, puis est à nouveau suspendue rapidement après quelques secondes.
Le système continuera de le faire pour nous tant que notre application sera dans le sélecteur d’applications (et que l’appareil iOS ne sera pas redémarré), même si notre application se termine en arrière-plan pour libérer de la mémoire pour une autre application par le système.
Si un événement Bluetooth arrive après la fin de notre application par le système, notre application est recréée afin que nous puissions le gérer, puis il sera à nouveau suspendu.
Tout cela se passe en arrière-plan, donc pour un utilisateur, c’est transparent et il semble que notre application fasse tout le travail. C’est la magie de l’exécution en arrière-plan sur iOS.
IMPORTANT: Jusqu’à iOS 13.4, si nous supprimons notre application du sélecteur d’applications, le système ne fera plus de publicité ni de numérisation en notre nom, et nous devrons attendre que l’application soit lancée par l’utilisateur pour redémarrer.
Dans iOS 13.4, ce comportement semble avoir changé et il restera connecté après la suppression de l’application du sélecteur d’applications, mais cette modification n’est pas documentée et ne doit pas être invoquée.
Donc quel est le problème?!
Tout cela sonne bien, non? En regardant ce qui précède, il semble qu’iOS continuera de faire le travail dont nous avons besoin pour créer notre application de suivi des contacts sur mesure!
Alors pourquoi les créateurs d’applications de suivi des contacts sur mesure recommandent-ils aux gens de laisser l’application iOS au premier plan ou de faire d’autres choses pour que l’application fonctionne de manière fiable?
Eh bien, rappelez-vous plus tôt, j’ai dit qu’il existe des règles très nuancées sur le fonctionnement des modes d’arrière-plan Bluetooth iOS? C’est là que cela entre en jeu.
Périphériques iOS en arrière-plan
Parlons d’abord du Mode d’arrière-plan périphérique, car c’est le principal problème.
Lorsque notre application est en arrière-plan et que nous voulons laisser le système prendre le relais de la publicité pour notre application, cela nous permettra seulement de annoncer d’une manière qui permet aux autres appareils iOS de le découvrir.
Cela signifie que d’autres appareils Android recherchent des appareils à proximité impossible de trouver un appareil iOS tandis que l’application iOS est en arrière-plan (bien qu’il existe un sans papiers façon de le faire, ce n’est jamais une bonne idée de se fier à un comportement non documenté, surtout en ce qui concerne Bluetooth).
De plus, j’ai effectué un test où j’ai gardé un appareil iOS verrouillé avec un simple Exemple d’application de suivi des contacts fonctionnant en arrière-plan, après 30 minutes, j’ai installé la même application sur un autre appareil iOS, et ils ne pouvaient pas se découvrir avant d’avoir mis l’application au premier plan sur l’un des appareils.
REMARQUE: Lors de mes tests, j’ai également trouvé des occasions où un appareil iOS ne pouvait pas découvrir un autre appareil iOS qui était verrouillé, jusqu’à ce que je réveille simplement l’écran alors qu’il était encore verrouillé. Parfois, c’était moins de 30 minutes.
Sur iOS, les performances de la publicité périphérique tandis que notre application en arrière-plan peuvent également être affectées selon que l’appareil iOS possède également d’autres applications agissant également comme périphérique. iOS décide de la performance en notre nomet ce n’est pas quelque chose que nous contrôlons.
iOS Centrals en arrière-plan
Parlons aussi de la Mode arrière-plan central. Bien que notre application iOS soit en arrière-plan, le système ralentira probablement le taux de recherche des appareils à proximité pour économiser la batterie.
Bien que ce ne soit pas un dealbreaker, cela réduira certainement l’utilité de rechercher des périphériques à proximité qui peuvent être manqués parce que vous avez dépassé quelqu’un alors qu’il n’était pas activement en train de numériser.
Bluetooth LE sur Android
Maintenant que nous avons appris les restrictions que le système iOS a sur les développeurs utilisant Bluetooth en arrière-plan, et pourquoi ils posent un problème pour les applications Contact Tracing, nous pouvons expliquer pourquoi ces problèmes ne sont pas sur Android.
Le système Android a une approche très différente lorsqu’il s’agit de laisser les applications continuer à fonctionner alors qu’elles ne sont pas l’application «active». Au lieu des modes d’arrière-plan comme sur iOS, Android utilise quelque chose appelé « prestations de service« Pour nous permettre de continuer à exécuter le code de manière fiable alors que l’application n’est pas l’application active.
Plus précisément, ils sont appelés «services de premier plan», Et pour les utiliser en tant que développeurs, nous doit afficher une notification visible par l’utilisateur dans le Tiroir de notification.
L’utilisateur est toujours en mesure de résilier ces services s’ils le souhaitent, bien que pour ce faire, ils devront peut-être forcer l’arrêt de l’application dans les paramètres système.
Contrairement à une application iOS, une application Android ne ne pas doivent être dans le « Récents« Liste des applications (l’équivalent du commutateur d’applications iOS) pour que le service continue de fonctionner.
Lorsque nous créons un service, nous le déclarer au système dans notre application fichier manifeste (un fichier que le système utilise pour savoir ce que votre application peut faire), puis nous sommes libres d’exécuter le code que nous voulons, potentiellement indéfiniment.
Cela le rend parfait pour exécuter du code Bluetooth de longue durée, agissant à la fois comme un central et un périphérique, avec très peu de restrictions. Exactement ce dont notre application Contact Tracing a besoin!
C’est pourquoi les applications Android Contact Tracing ne sont pas recommandées de rester au premier plan par leurs créateurs, car il n’y en a pas besoin.
De plus, les API Bluetooth Android nous offrent plus d’options pour la recherche de périphériques, ce qui permet une solution de contournement (non documentée) pour la recherche des applications Bluetooth iOS qui sont uniquement destinées à être détectées par d’autres applications Bluetooth iOS.
REMARQUE: Cette solution de contournement est assez technique, et c’est exactement ce que les développeurs intelligents qui ont créé l’application NHSX Contact Tracing Android ai fait.
Il s’agit de rechercher des appareils à proximité avec des données très spécifiques encodées de manière non documentée sur les appareils iOS. Très intelligent!
Le compromis pour cette liberté sur Android, c’est que nous courons le risque d’utiliser plus de batterie que nécessaire, et le système peut commencer à suggérer à nos utilisateurs que notre application utilise plus de batterie qu’elle ne le pense. En fin de compte, le code Bluetooth fonctionne toujours comme si l’application était l’application active.
De plus, contrairement à iOS, vous avez nettement plus de contrôle sur l’opportunité d’annoncer et de numériser de manière plus agressive pour augmenter les performances ou de manière conservatrice pour réduire la consommation d’énergie. Cela signifie que notre application Android Contact Tracing est beaucoup plus susceptible de découvrir des passants à temps si nous le souhaitons.
Ayant travaillé avec Bluetooth sur les deux plates-formes, je peux dire qu’il y a des avantages et des inconvénients pour chacune.
iOS est clairement plus restrictif, mais l’API et le matériel sont plus stables, car Apple a le contrôle total sur tout cela. Android nous donne beaucoup plus de liberté et de puissance, mais l’API est plus difficile à utiliser et à fonctionner, et certains matériels plus anciens ne fonctionnent tout simplement pas aussi bien.
REMARQUE: Au moment de la rédaction, le documentation Android officielle pour commencer avec Bluetooth LE utilise des API obsolètes!
En fin de compte, en utilisant les API Bluetooth existantes disponibles, les applications Android sont mieux à même de jouer le rôle d’une application de suivi des contacts.
En quoi le framework multiplateforme Apple | Google est-il différent sur iOS?
La raison pour laquelle Cadre de notification d’exposition actuellement en cours de construction par Apple et Google est mieux sur iOS que d’utiliser simplement l’existant Bluetooth de base Les API sont parce qu’Apple peut éviter les restrictions mentionnées précédemment avec des applications utilisant Bluetooth en arrière-plan.
Parce qu’Apple crée le cadre, ils peuvent automatiquement donner la priorité au cadre de notification d’exposition sur le système, s’assurer qu’il n’est pas abusé par les développeurs et équilibrer correctement la consommation d’énergie. spécifiquement pour le suivi des contacts.
note de bas de page
J’ai validé mes réclamations avec de la documentation en ligne et en écrivant et en testant certaines exemple de code que vous êtes invités à télécharger et à explorer si vous le souhaitez!
Je suis dessus Twitter si vous souhaitez me poser des questions sur cet article ou un exemple de code. Vous pouvez également ouvrir un problème sur GitHub et comme une question là-bas.
Quelques documents utiles si vous souhaitez en savoir plus sur les API disponibles:
De plus, l’équipe NHSX a ouvert son iOS et Android Contactez les applications de traçage et elles sont un très bon exemple de la façon d’utiliser Bluetooth sur les deux plates-formes.
Restez en sécurité! ❤️