Marcos insertados en Xamarin.iOS

En este documento se describe cómo los desarrolladores de aplicaciones pueden insertar marcos de usuario en sus aplicaciones.

Con iOS 8.0 Apple hizo posible crear un marco insertado para compartir código entre las extensiones de aplicación y la aplicación principal en Xcode.

Xamarin.iOS 9.0 agrega compatibilidad para consumir estos marcos insertados (creados con Xcode) en aplicaciones de Xamarin.iOS. No será posible crear marcos insertados a partir de ningún tipo de proyectos de Xamarin.iOS, solo consumir marcos nativos existentes (Objective-C).

Hay dos maneras de consumir marcos en Xamarin.iOS:

  • Pase el marco a la herramienta mtouch agregando lo siguiente a los argumentos mtouch adicionales en las opciones de compilación de iOS del proyecto:

    --framework:/Path/To/My.Framework
    

    Debe establecerse para cada configuración del proyecto.

  • Agregar referencias nativas desde el menú contextual

Haga clic con el botón derecho en Proyecto y vaya a Agregar referencias nativas.

Select Add native references in Visual Studio for Mac

Esto funcionará para todas las configuraciones.

En versiones futuras de Visual Studio para Mac y Xamarin Tools para Visual Studio, será posible consumir marcos desde el IDE (sin editar archivos de proyecto manualmente).

Encontrará algunos proyectos de ejemplo en GitHub.

Limitaciones

  • Los marcos incrustados solo se admiten en proyectos unificados.
  • Los marcos insertados solo se admiten en proyectos con un destino de implementación de al menos iOS 8.0.
  • Si una extensión requiere un marco insertado, la aplicación contenedora también debe tener una referencia al marco; de lo contrario, el marco no se incluirá en la agrupación de aplicaciones.

El entorno de ejecución Mono

Xamarin.iOS aprovecha internamente esta característica para vincular con el entorno de ejecución de Mono como marco, en lugar de vincular el entorno de ejecución de Mono estáticamente a cada extensión y a la aplicación contenedora.

Esto se realiza automáticamente si la aplicación contenedora es una aplicación unificada, contiene extensiones y la implementación de destino es iOS 8.0 o posterior.

Las aplicaciones sin extensiones seguirán vinculándolas con el entorno de ejecución mono estáticamente, ya que hay una penalización de tamaño para usar un marco si solo hay una aplicación que haga referencia a ella.

El desarrollador de la aplicación puede invalidar este comportamiento agregando lo siguiente como argumento mtouch adicional en las opciones de compilación de iOS del proyecto:

  • --mono:static: se vincula estáticamente con el entorno de ejecución Mono.
  • --mono:framework: se vincula con el entorno de ejecución Mono como marco.

Un escenario para vincular con el entorno de ejecución Mono como marco incluso para aplicaciones sin extensiones es reducir el tamaño del archivo ejecutable, para superar las restricciones de tamaño que Apple aplica en el ejecutable. Por referencia, el entorno de ejecución Mono agrega aproximadamente 1,7 MB por arquitectura (a partir de Xamarin.iOS 8.12, pero varía entre versiones e incluso entre aplicaciones). El marco Mono agrega aproximadamente 2,3 MB por arquitectura, lo que significa que para una aplicación de arquitectura única sin extensiones, lo que hace que el vínculo de la aplicación con el entorno de ejecución Mono como marco reduzca el ejecutable por ~1,7 MB, pero agregue un marco ~2,3 MB, lo que da como resultado una aplicación más grande de ~0,6 MB por completo.