Resumen del capítulo 9. Llamadas de API específicas de la plataforma
Nota:
Este libro se publicó en la primavera de 2016 y no se ha actualizado desde entonces. Gran parte del libro sigue siendo útil, pero algunos de los materiales están anticuados y algunos temas ya no son completamente correctos o completos.
A veces es necesario ejecutar código que varíe según la plataforma. En este capítulo se exploran las técnicas.
Preprocesamiento en el proyecto de recursos compartidos
Un proyecto de recurso compartido de Xamarin.Forms puede ejecutar código diferente para cada plataforma mediante las directivas de preprocesador de C# #if
, #elif
y endif
. Esto se muestra en PlatInfoSap1:
Sin embargo, el código resultante puede ser feo y difícil de leer.
Clases paralelas en el proyecto de recursos compartidos
En el ejemplo PlatInfoSap2 se muestra un enfoque más estructurado para ejecutar código específico de la plataforma en SAP. Cada uno de los proyectos de la plataforma contiene una clase y métodos con nombres idénticos, pero implementados para esa plataforma en particular. A continuación, SAP simplemente crea instancias de la clase y llama al método.
DependencyService y la biblioteca de clases portable
Nota:
Las bibliotecas de clases portables se han sustituido por las bibliotecas .NET Standard. Todo el código de ejemplo del libro se ha convertido para usar las bibliotecas .NET estándar.
Normalmente, una biblioteca no puede tener acceso a las clases de los proyectos de aplicación. Esta restricción parece evitar que la técnica que se muestra en PlatInfoSap2 se use en una biblioteca. Aun así, Xamarin.Forms contiene una clase denominada DependencyService
que usa la reflexión de .NET para acceder a las clases públicas del proyecto de aplicación desde la biblioteca.
La biblioteca debe definir un elemento interface
con los miembros que necesita usar en cada plataforma. Después, cada una de las plataformas contiene una implementación de esa interfaz. La clase que implementa la interfaz debe identificarse con un elemento DependencyAttribute en el nivel de ensamblado.
A continuación, la biblioteca usa el método genérico Get
de DependencyService
para obtener una instancia de la clase de plataforma que implementa la interfaz.
Esto se muestra en el ejemplo DisplayPlatformInfo.
Generación de sonido específica de la plataforma
El ejemplo MonkeyTapWithSound agrega pitidos al programa MonkeyTap mediante el acceso a las instalaciones de generación de sonido en cada plataforma.