Desarrollo de apps multiplataforma con C# y Xamarin

Hace poco di una sesión de desarrollo para Windows Phone en Betabeers Madrid. Hablamos de las herramientas que utilizamos para desarrollar apps en nuestra plataforma (Windows Phone SDK 8.0, Visual Studio 2013), de desarrollo para Windows Phone 8 en general, de los lenguajes de programación (XAML/C#) y de las APIs que podemos utilizar, de programación asíncrona con Async y Await en C# y de otros conceptos básicos como los Data Bindings en XAML o el patrón MVVM (Modelo-Vista-Vista Modelo).

Por último hablamos de reutilización de código y de si existía la posibilidad de desarrollar una app que funcionase en dispositivos Windows Phone, Windows 8, Android e iOS, que fuese nativa en todas las plataformas (por lo que frameworks como PhoneGap quedarían descartados), y utilizando el mismo IDE y el mismo lenguaje de programación. Pues sí, gracias a Visual Studio 2013, C# y Xamarin es posible conseguirlo.

 

Para esta sesión creé un ejemplo cuyo código puedes descargarte aquí: CrossDemo.

 

En la carpeta "CrossDemo 1 Inicial" puedes ver un pequeño proyecto de Visual Studio 2013 con una app de Windows Phone que muestra unos datos cualesquiera en pantalla y los manipula. En este ejemplo toda la lógica de la app se encuentra en el código asociado a la página (en su Code Behind). Al no estar separada la lógica de negocio de la app de su capa de presentación, se hace muy complicado el poder reutilizar el código de esta app si quisiéramos crear por ejemplo una versión de Windows 8 de la misma.

 

A continuación, en la carpeta "CrossDemo 2 MVVM" puedes ver el mismo ejemplo de antes pero implementando MVVM. Toda la lógica de negocio está ahora en un Vista Modelo que es quien le expone a la Vista los datos definidos por el Modelo que puede mostrar, y los métodos que puede ejecutar para manipular esos datos. Al manipular los datos el interfaz de usuario se actualiza automáticamente gracias a los Data Bindings. De esta manera la lógica de negocio está separada de la capa de presentación, haciendo dicha lógica 100% reutilizable.

Nota: por simplicidad, en este ejemplo no he añadido un ViewModelLocator para indicarle a cada Vista qué Vista Modelo le corresponde, ni un NavigationService para navegar desde la página de un Vista Modelo a la página de otro. Aquí puedes ver un ejemplo de MVVM que sí que los incluye: Ejemplo de implementación del patrón MVVM.

 

Por último, en la carpeta "CrossDemo 3 Final" se puede ver el mismo ejemplo de antes, pero ahora el Vista Modelo y el Modelo están en una Portable Class Library (PCL). Toda la lógica de negocio se encuentra por tanto en la PCL, que es un componente 100% reutilizable programado en C# y que he compartido entre el proyecto de Windows Phone 8.0, uno de Windows 8.1 y otro de Android.

El proyecto de Android ha sido desarrollado en Visual Studio con C# gracias a Xamarin.Android, y puede utilizar la PCL gracias al soporte que añadió Xamarin a estos componentes en Visual Studio 2013.

No he incluido un proyecto de iOS en el ejemplo, pero también puede crearse en Visual Studio 2013 con C# y puede compartir la PCL gracias a Xamarin.iOS. La razón de no incluirlo ha sido la necesidad de tener un Mac para poder compilar y probar el ejemplo.

Aquí tienes más detalles sobre la compartición de código entre apps de Windows Phone y Windows 8: Maximize code reuse between Windows Phone 8 and Windows 8. Varios de estos conceptos los he comentado ya en este artículo y aplican a la compartición de código con Android e iOS.

Con todo esto, y tras crear la capa de presentación en cada una de las plataformas (XAML para Windows Phone y Windows 8, Layouts para Android), finalmente tengo una app que funciona en todas ellas y que reutiliza la mayor parte del código.

 

Si quieres ver otro ejemplo que incluya un proyecto de iOS, muestre cómo usar SQLite para almacenar los datos, etc., te recomiendo éste: MyExpenses. En este ejemplo se comparte hasta el ¡80% del código! entre las distintas plataformas gracias a las PCLs.

 

Para ampliar detalles, en Channel 9 puedes ver un par de sesiones sobre desarrollo móvil multiplataforma con Visual Studio 2013, C# y Xamarin:

Part 1: Cross Platform Mobile Development with Xamarin

Part 2: Using Portable Class Libraries with Xamarin

Part3. Cross Platform Mobile Apps with Xamarin and Azure Mobile Services
 

También puedes encontrar más documentación, ejemplos, información sobre APIs, etc., en la Developer Center de Xamarin y en GitHub.

Un saludo,

 

Alejandro Campos Magencio (@alejacma)

Microsoft Technical Evangelist

 

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.