Con Xamarin y Xamarin.Forms se ha abierto la posibilidad de desarrollar para Windows Phone, iOS y Android compartiendo el código e, incluso con Xamarin.Forms también las vistas con lo que se hace necesario disponer de mecanismos que nos permitan modificar algunos detalles en caso de necesitar que el alguna plataforma o en todas, haya un comportamiento o una visualización diferente. Es aquí donde aparecen dos estrategias diferentes para alcanzar este objetivo, la tradicional compilación condicional y la ejecución por dispositivos.
Compilación condicional
Los desarrolladores de .NET y en especial los que usamos C# ya conocíamos la compilación condicional para establecer diferentes parámetros dependiendo del modo de ejecución de la aplicación que estuviéramos desarrollando, por ejemplo, cambiar parámetros en una ejecución de depuración (DEBUG) que difieran de los de producción.
#if DEBUG // Código a ejecutar si se ejecuta en modo depuración #else // Código a ejecutar fuera del modo depuración #endif
Dado que en el desarrollo de Apps multiplataforma tenemos que poder diferenciar entre dispositivos, Xamarin.Forms nos aporta las siguientes símbolos:
Android + iOS
#if __MOBILE__ //Código específico para Android e iOS #endif
iOS
#if __IOS__ //Código específico para iOS #endif
Android
#if __ANDROID__ //Código específico para Android #endif
También podemos ser más específicos afinando en la versión de Android
#if __ ANDROID _11__ //Código específico para Android 3.0 Honeycomb o superior #endif
Windows Phone
Para Windows Phone se definen dos símbolos, WINDOWS_PHONE y SILVERLIGHT
#if __WINDOWS_PHONE__ //Código específico para Windows Phone #endif #if __SILVERLIGHT__ //Código específico para Windows Phone #endif
Esto nos permitirá ejecutar nuestra aplicación con diferentes códigos por ejemplo para mostrar un Hello world personalizado.
NOTA: En Portable Class Libraries (PCL) no funciona la directiva #if con lo que tendremos que buscar una alternativa como la que os muestro en el siguiente punto
Ejecución por dispositivos
Además de la compilación condicional, en Xamarin.Forms disponemos de otra opción tanto para código C# como para XAML donde podemos diferenciar también entre las diferentes plataformas.
C#
En C# tendremos que hacer uso de Device.OnPlatform que nos permite diferenciar entre plataformas.
Device.OnPlatform( Android:()=> { myLabel.Text = “Hello World from Android” }, iOS: () => { myLabel.Text = “Hello World from iOS”}, WinPhone: () => {myLabel.Text = “Hello World from Windows Phone”} );
XAML
En XAML podemos hacer lo mismo que con C# pero, evidentemente con XAML
<Label> <Label.Text> <OnPlatform x:TypeArguments="Text" iOS="Hello World from iOS" Android="Hello World from Android" WinPhone="Hello World from Windows Phone"/> </Label.Text> Label>
Conclusión
Xamarin.Forms no sólo ofrece una alta productividad a la hora de desarrollar aplicaciones multiplataforma, sino que, unida a la posibilidad de diferenciar plataformas en código para realizar cosas específicas como por ejemplo establecer diferentes separaciones con paddings, también ofrece la posibilidad de realizar tareas específicas en función de la plataforma mejorando así la experiencia de desarrollo y, por tanto, también la experiencia de usuario.