Développer une appli mobile sans accès Internet

>> English version

Quel est ce film dans lequel Liliam-neeson-in-non-stop-movie-3am Neeson est un « air marshal » aux prises avec des terroristes qui commencent par pirater son tchat téléphonique ? Un petit tour sur whatismymovie.com me trouve Non-Stop. Ceux qui l’ont vu se rappelleront qu’à un moment (attention mini-spoiler) il demande à un passager informaticien de créer une appli pour pirater le téléphone du terroriste. En plein vol, donc.

C’est donc en pensant à cette scène que j’ai tenté de travailler sur mon app dans le TGV. La veille j’avais pris la compagnie d’autocar petite sœur de la SNCF, OuiBus, pour bénéficier du Wi-Fi, mais cette fois je n’avais pas ce choix. N’étant pas en France, je n’avais pas non plus de forfait me permettant de « tetheriser » l’ordinateur à un mobile connecté, et de toute façon cela fonctionne très mal dans le TGV, en raison des changements incessants de borne d’accès (« handovers »).

La mémoire qui flanche

La première chose évidente, sans internet, c’est qu’on est vite bloqué lorsqu’une question, ou un problème technique. Sans Google et Stack Overflow, les compagnons de tous les jours du programmeur d’aujourd’hui, on doit s’organiser pour travailler sur des tâches concernant des domaines bien maîtrisés, et pour passer de tâche en tache en attendant de pouvoir les débloquer plus tard. Git est plutôt efficace pour gérer ses modifications de plusieurs tâches différentes sans s’y perdre, heureusement.

Mon îlot à moi

Deuxièmement, il est rare désormais qu’une appli mobile soit indépendante d’Internet. Mon app actuelle va chercher des informations sur un serveur, qui tourne sur mon ordinateur pendant le développement. Il faut donc créer un réseau entre l’ordi et l’appareil mobile, sans disposer de routeur internet. J’ai donc exploré les différents moyens de le réaliser.

Créer un réseau Wifi ad-hoc

Wifi ad hocIl est très facile sur un Mac de créer un réseau Wifi ad-hoc sur le mac, et s’y connecter sur l’appareil mobile. Inconvénient, il n’y a aucune sécurité (contrairement au partage de connexion internet). Auparavant, le chiffrage WEP 40-bit était disponible, mais il semble qu’Apple l’ait supprimé en raison de son obsolescence et donc du faux sentiment de sécurité qu’il donnerait.

J’ai donc pu m’y connecter avec un IPad, par contre impossible de réussir à se connecter à partir de mon téléphone Android (5.1).

Créer un réseau par dessus Bluetooth

Bluetooth PANUne autre solution est d’activer le Bluetooth, appairer les appareils (!), puis de créer un réseau par-dessus. L’avantage de l’appairage est la sécurité à priori apportée, car on s’assure que seuls nos appareils communiquent entre eux.

Le débit est censé être moins élevé qu’en Wifi, mais cela ne posera pas de problème pour mes tests. Comme pour la solution Wifi, cela fonctionne parfaitement sur l’IPad, mais pas sur l’appareil Android, qui se connecte mais se fait déconnecter illico, pour une raison que j’ignore.

Comment puis-je vous joindre ?

Ce n’est pas terminé, il faut indiquer dans l’application l’adresse du serveur. Lorsque je travaillais à la maison, j’utilisais un « DynHost » pour qu’une adresse du style monserveur.mondomaine.net pointe toujours vers mon réseau, et une configuration du routeur permettait d’envoyer les requêtes vers l’ordinateur.

Dans le cas présent, on doit indiquer directement l’adresse IP de l’ordinateur dans notre réseau ad-hoc. Celle-ci est indiquée et il s’agit d’une adresse « auto-assignée » commençant par 169.253. Pour que ce soit pratique, on peut la fixer une fois pour toutes, plutôt que de devoir recompiler l’application à chaque fois.

Où est passé mon domaine ?

L’appareil iOS peut donc se connecter au serveur… sauf si le système lui refuse l’accès ! En effet, depuis iOS 9, en vertu de ce qu’Apple nomme App Transport Security (ATS), les applications n’ont plus le droit de se connecter aux serveurs par une connexion non chiffrée (SSL/TLS), sauf si on indique des exceptions pour chaque domaine. Or, il n’y a pas de nom de domaine sur notre réseau ad-hoc. On n’a pas de serveur DNS qui pourrait convertir monserveur.mondomaine.net en adresse IP. Donc pas d’exception possible… sauf à désactiver totalement l’ATS sur la version de développement, ce qui peut heureusement être fait en ajoutant dans le fichier .plist utilisé par XCode la propriété suivante :

NSAppTransportSecurity.NSAllowsArbitraryLoads = true

Et voilà, l’application se connecte et récupère ses informations. Oui mais, que faire si le serveur lui-même a besoin de se connecter à un autre serveur internet ?

Données offline

Pour contourner ce problème, j’ai ajouté une petite fonctionnalité qui permet de sauver et rejouer les données obtenues lorsqu’on a du réseau. Cela permet de simuler que le serveur se connecte bien à un autre serveur, et le tour est joué.

 

 

Publicités
Cet article, publié dans Entreprise, Voyages, est tagué , , , , . Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s