Xamarin

Depuis quelque temps, je travaille sur des projets multiplateformes en Xamarin sur Mac OS X. Utilisant Visual Studio pour développer, j’ai monté une machine virtuelle sous Windows 10 avec Visual Studio 2015 et Parallels. Comme je souhaite utiliser Xamarin Android Player depuis Mac pour avoir plus de performances au niveau de la virtualisation, j’ai suivi l’excellent article de James Montemagno expliquant tout ce processus en détail.

Jusque-là, tout s’est passé pour le mieux dans le meilleur des mondes. Cependant, cet état de grâce n’a pas duré bien longtemps sinon vous ne seriez pas en train de lire ces lignes.

La situation

Le projet sur lequel je travaille avec un collègue utilise des services avec Web API. Pour les développer, il utilise son poste Windows local et se sert de IIS Express. La partie cliente du projet en Xamarin Forms est maintenant suffisamment avancée et je souhaite donc utiliser ces services depuis mon application Xamarin Forms.

Faisons un bref récapitulatif de la configuration actuelle selon l’article de James Montemagno :

  • Le réseau de la machine virtuelle Windows est en “Shared Network”.
  • Xamarin Android Player tourne sur le Mac et dispose d’une IP locale (chez moi 10.71.34.101)
  • Le développement se fait dans la machine virtuelle depuis Visual Studio 2015
  • Les services Web API sont hébergés par IIS Express, un port aléatoire (disons 49931), dans la machine virtuelle

Objectif

Ce qu’il faut parvenir à faire maintenant c’est appeler les services web depuis l’émulateur Android et depuis un vrai téléphone sur le même réseau local que le Mac.

Pour cela, il faut changer l’hébergement des services web pour un vrai IIS. En effet, IIS Express semble refuser de traiter les requêtes provenant de l’hôte Mac OS malgré toutes les configurations que j’ai pu tester et ce que l’on peut trouver ici  :

http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx

Dans notre cas, cela aura un autre effet positif. Je pourrais développer le client mobile sans avoir à lancer la solution des services web.

Installation et configuration de IIS et ASP.NET

Pour installer IIS, il suffit de l’activer dans les fonctionnalités Windows. Pour ASP.NET Web Api il faudra aussi bien penser à activer ASP.NET dans les fonctionnalités de Windows. Dans le panneau de configuration, on choisit “Programs”, puis “Programs and Features” et enfin “Windows Features”

Il ne reste plus qu’à activer ASP.NET 4.5

WindowsFeatures

Ensuite, il faut héberger les services dans IIS.

Pour cela, il faut lancer Visual Studio en mode administrateur et dans les propriétés du projet choisir “Local IIS”. J’en ai profité dans mon cas pour héberger le site sur le port 80.

VS-IIS

Dans l’outil d’administration de IIS, on vérifie que le Binding des ports est bien le même que dans la capture ci-dessous.

Pare-feu Windows

Si le Pare-feu de Windows est activé (et il devrait l’être !), il va falloir ouvrir le port 80. Chaque version de Windows dispose pour cela de son affichage particulier ou de sa ligne de commande particulière.

Paradoxalement, je trouve plus simple de passer par les paramètres avancés.

Dans le panneau de configuration, on cherche la section “System and Security” puis “Windows Firewall”.

Firewall

On sélectionne “Inbound Rules” à gauche et on clique sur “New Rule…” dans le panneau de droite.

Firewall-FirstScreen

Il ne reste plus qu’à effectuer la configuration comme sur les écrans qui suivent :

Firewall-RuleType

Firewall-Ports

Firewall-Action

Firewall-Profile

Firewall-Rulename

Redirection des ports

La machine virtuelle étant maintenant prête, il faut aussi configurer Parallels.

Nous allons ordonner à Parallels de rediriger tout le trafic entrant sur le port 80 du Mac vers la machine virtuelle.

Rendez-vous dans la configuration de Parallels.

Parallels-Preferences

On sélectionne l’onglet “Advanced” et on clique sur “Network: Change settings…”

Parallels-Advanced

Un volet s’ouvre où on peut voir en bas la liste des ports actuellement forwardés.

Parallels-AdvancedConfig

Pour en ajouter un nouveau, on clique sur le petit “+”, on sélectionne le protocole source, le port, la machine virtuelle Parallels de destination et le port cible.

Parallels-PortConfig

Récupération de l’adresse IP

Le trafic du port 80 est maintenant correctement redirigé vers la machine virtuelle. Le point d’entrée des services devient maintenant l’hôte Mac OS X et par extension tout appareil mobile souhaitant les interroger devront en fait interroger l’hôte.

On va donc chercher l’ip de l’hôte et s’en servir dans le projet Xamarin.

Cette dernière se trouve dans les préférences systèmes de Mac OS X en cliquant sur l’icône Network ou bien dans Terminal en lançant la commande “ifconfig”.

Conclusion

Même si cela prend un peu de temps à mettre en place la première fois, on gagne en performance et en souplesse lors du développement d’une application mobile utilisant des services sous IIS.

Cet article a été écrit dans un contexte Xamarin Forms et Web API mais la plupart des étapes peuvent être réutilisées pour bien d’autres types de projets !

N’hésitez donc pas à partager !