Actualización de aplicaciones existentes de Xamarin.Forms

Siga estos pasos para actualizar una aplicación existente de Xamarin.Forms para usar la Unified API y actualizar a la versión 1.3.1.

Importante

Debido a que Xamarin.Forms 1.3.1 es la primera versión que admite la API unificada, se debe actualizar toda la solución para usar la versión más reciente al mismo tiempo que se migra la aplicación de iOS a Unified API. Esto significa que, además de actualizar el proyecto de iOS para la compatibilidad unificada, también tendrá que editar código en todos los proyectos de la solución.

La actualización se realiza en dos pasos:

  1. Migre la aplicación de iOS a Unified API mediante la compilación de Visual Studio para Mac en la herramienta de migración.

    • Use la herramienta de migración para actualizar automáticamente el proyecto.

    • Actualice las API nativas de iOS, como se describe en las instrucciones para actualizar las aplicaciones iOS (específicamente en el representador personalizado o el código del servicio de dependencia).

  2. Actualice toda la solución a la versión 1.3 de Xamarin.Forms.

    1. Instale el paquete NuGet de Xamarin.Forms 1.3.1.

    2. Actualice la clase App en el código compartido.

    3. Actualice el AppDelegate en el proyecto de iOS.

    4. Actualice el MainActivity en el proyecto de Android.

    5. Actualice el MainPage en el proyecto de Windows Phone.

1. Aplicación de iOS (migración unificada)

Parte de la migración requiere actualizar Xamarin.Forms a la versión 1.3, que admite Unified API. Para que se creen las referencias de ensamblado correctas, primero es necesario actualizar el proyecto de iOS para usar Unified API.

Herramienta de migración

Haga clic en el proyecto de iOS para que esté seleccionado y elija Project Migrate to Xamarin.iOS Unified API... (Migrar > a Unified API de Xamarin.iOS...) y acepte el mensaje de advertencia que aparece.

Choose Project > Migrate to Xamarin.iOS Unified API... and agree to the warning message that appears

Esto hará lo siguiente automáticamente:

  • Cambiar el tipo de proyecto para admitir Unified API de 64 bits.
  • Cambiar la referencia del marco a Xamarin.iOS (reemplazando la anterior referencia monotouch).
  • Cambiar las referencias de espacio de nombres en el código para quitar el prefijo MonoTouch.
  • Actualizar el archivo csproj para usar los destinos de compilación correctos para Unified API.

Limpie y compile el proyecto para asegurarse de que no haya más errores que corregir. No se debe realizar ninguna otra acción. Estos pasos se explican con más detalle en la documentación de Unified API.

Actualización de las API nativas de iOS (si es necesario)

Si ha agregado código nativo de iOS adicional (como representadores personalizados o servicios de dependencia), es posible que tenga que realizar otras correcciones de código manuales. Vuelva a compilar su aplicación y consulte las instrucciones de Actualización de aplicaciones iOS existentes para obtener información adicional sobre los cambios que pueden ser necesarios. Estas sugerencias también ayudarán a identificar los cambios necesarios.

2. Actualización de Xamarin.Forms 1.3.1

Una vez que la aplicación de iOS se ha actualizado a Unified API, el resto de la solución debe actualizarse a Xamarin.Forms versión 1.3.1. Esto incluye:

  • Actualización del paquete NuGet de Xamarin.Forms en cada proyecto.
  • Cambio del código para usar las nuevas clases de Xamarin.Forms Application, FormsApplicationDelegate (iOS), FormsApplicationActivity (Android) y FormsApplicationPage (Windows Phone).

Estos pasos se explican a continuación:

2.1 Actualizar NuGet en todos los proyectos

Actualice Xamarin.Forms a la versión preliminar 1.3.1 mediante el Administrador de paquetes NuGet para todos los proyectos de la solución: PCL (si está presente), iOS, Android y Windows Phone. Se recomienda eliminar y volver a agregar el paquete NuGet de Xamarin.Forms para actualizar a la versión 1.3.

Nota:

La versión 1.3.1 de Xamarin.Forms está actualmente en versión preliminar. Esto significa que debe seleccionar la opción de versión preliminar en NuGet (a través de una casilla en Visual Studio para Mac o una lista desplegable en Visual Studio) para ver la versión preliminar más reciente.

Importante

Si usa Visual Studio, asegúrese de que esté instalada la versión más reciente del Administrador de paquetes NuGet. Las versiones anteriores de NuGet en Visual Studio no instalarán correctamente la versión unificada de Xamarin.Forms 1.3.1. Vaya a Herramientas > Extensiones y actualizaciones... y haga clic en la lista Instaladas para comprobar que la versión del Administrador de paquetes NuGet para Visual Studio sea al menos la 2.8.5. Si es una anterior, haga clic en la lista Actualizaciones para descargar la versión más reciente.

Una vez que haya actualizado el paquete NuGet a Xamarin.Forms 1.3.1, realice los siguientes cambios en cada proyecto para actualizar a la nueva clase Xamarin.Forms.Application.

2.2 Biblioteca de clases portable (o proyecto compartido)

Cambie el archivo App.cs para que:

  • La clase App herede ahora de Application.
  • La propiedad MainPage se establezca en la primera página de contenido que quiera mostrar.
public class App : Application // superclass new in 1.3
{
    public App ()
    {
        // The root page of your application
        MainPage = new ContentPage {...}; // property new in 1.3
    }

Hemos quitado completamente el método GetMainPage y, en su lugar, hemos establecido la MainPagepropiedad en la subclase Application.

Esta nueva clase base Application también admite las invalidaciones OnStart, OnSleep y OnResume para ayudarle a administrar el ciclo de vida de la aplicación.

A continuación, la clase App se pasa a un nuevo método LoadApplication en cada proyecto de aplicación, como se describe a continuación:

Aplicación de iOS 2.3

Cambie el archivo AppDelegate.cs para que:

  • La clase herede de FormsApplicationDelegate (en lugar de UIApplicationDelegate, como anteriormente).
  • Se llame a LoadApplication con una nueva instancia de App.
[Register ("AppDelegate")]
public partial class AppDelegate :
    global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate // superclass new in 1.3
{
    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        global::Xamarin.Forms.Forms.Init ();

        LoadApplication (new App ());  // method is new in 1.3

        return base.FinishedLaunching (app, options);
    }
}

Aplicación de Android 2.3

Cambie el archivo MainActivity.cs para que:

  • La clase herede de FormsApplicationActivity (en lugar de FormsActivity, como anteriormente).
  • Se llame a LoadApplication con una nueva instancia de App
[Activity (Label = "YOURAPPNAM", Icon = "@drawable/icon", MainLauncher = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity :
    global::Xamarin.Forms.Platform.Android.FormsApplicationActivity // superclass new in 1.3
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        global::Xamarin.Forms.Forms.Init (this, bundle);

        LoadApplication (new App ()); // method is new in 1.3
    }
}

Aplicación de Windows Phone 2.4

Necesitamos actualizar MainPage: tanto el código XAML como el subyacente.

Cambie el archivo MainPage.xaml para que:

  • El elemento XAML raíz sea winPhone:FormsApplicationPage.
  • El atributo xmlns:phone se cambie a xmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"

A continuación se muestra un ejemplo actualizado: solo debería tener que editar estos elementos (el resto de los atributos debe seguir siendo iguales):

<winPhone:FormsApplicationPage
   ...
   xmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"
    ...>
</winPhone:FormsApplicationPage>

Cambie el archivo MainPage.xaml.cs para que ocurra lo siguiente:

  • La clase herede de FormsApplicationPage (en lugar de PhoneApplicationPage como anteriormente).
  • Se llame a LoadApplication con una nueva instancia de la clase App de Xamarin.Forms. Es posible que tenga que calificar completamente esta referencia, ya que Windows Phone tiene su propia clase App ya definida.
public partial class MainPage : global::Xamarin.Forms.Platform.WinPhone.FormsApplicationPage // superclass new in 1.3
{
    public MainPage()
    {
        InitializeComponent();
        SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;

        global::Xamarin.Forms.Forms.Init();
        LoadApplication(new YOUR_APP_NAMESPACE.App()); // new in 1.3
    }
 }

Solución de problemas

En ocasiones verá un error similar a este después de actualizar el paquete NuGet de Xamarin.Forms. Se produce cuando el actualizador de NuGet no quita completamente las referencias a versiones anteriores de los archivos csproj.

YOUR_PROJECT.csproj: error: este proyecto hace referencia a paquetes NuGet que no se encuentran en este equipo. Habilite la restauración de paquetes NuGet para descargarlos. Para obtener más información, vea https://go.microsoft.com/fwlink/?LinkID=322105. El archivo que falta es ../../packages/Xamarin.Forms.1.2.3.6257/build/portable-win+net45+wp80+MonoAndroid10+MonoTouch10/Xamarin.Forms.targets. (SU_PROYECTO)

Para corregir estos errores, abra el archivo csproj en un editor de texto y busque elementos <Target que hagan referencia a versiones anteriores de Xamarin.Forms, como el elemento que se muestra a continuación. Debe eliminar manualmente este elemento completo del archivo csproj y guardar los cambios.

  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see https://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\..\packages\Xamarin.Forms.1.2.3.6257\build\portable-win+net45+wp80+MonoAndroid10+MonoTouch10\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.1.2.3.6257\build\portable-win+net45+wp80+MonoAndroid10+MonoTouch10\Xamarin.Forms.targets'))" />
  </Target>

El proyecto debe compilarse correctamente una vez quitadas estas referencias antiguas.

Consideraciones

Se deben tener en cuenta las siguientes consideraciones al convertir un proyecto de Xamarin.Forms existente de Classic API a la nueva Unified API si esa aplicación se basa en uno o varios componentes o paquetes NuGet.

Componentes

Cualquier componente que haya incluido en la aplicación también tendrá que actualizarse a Unified API u obtendrá un conflicto al intentar compilar. Para cualquier componente incluido, reemplace la versión actual por una nueva versión del almacén de componentes de Xamarin que admita Unified API y realice una compilación limpia. Cualquier componente que aún no haya sido convertido por el autor mostrará una advertencia de solo 32 bits en el almacén de componentes.

Compatibilidad con NuGet

Aunque hemos contribuido a los cambios en NuGet para trabajar con la compatibilidad con Unified API, no se ha producido una nueva versión de NuGet, por lo que estamos evaluando cómo obtener NuGet para reconocer las nuevas API.

Hasta ese momento, al igual que los componentes, deberá cambiar cualquier paquete NuGet que haya incluido en el proyecto a una versión que admita Unified API y realice una compilación limpia después.

Importante

Si recibe un error de tipo "Error 3: No se puede incluir 'monotouch.dll' y 'Xamarin.iOS.dll' en el mismo proyecto de Xamarin.iOS: se hace referencia a 'Xamarin.iOS.dll' explícitamente, mientras que se hace referencia a 'monotouch.dll' mediante 'xxx, Version=0.0.000, Culture=neutral, PublicKeyToken=null'" después de convertir la aplicación a las Unified API, normalmente se debe a tener un componente o un paquete NuGet en el proyecto que no se ha actualizado a Unified API. Deberá quitar el componente o NuGet existente, actualizar a una versión que admita Unified API y realizar una compilación limpia.

Habilitación de compilaciones de 64 bits de aplicaciones de Xamarin.iOS

Para una aplicación móvil de Xamarin.iOS que se ha convertido a Unified API, el desarrollador todavía necesitará habilitar la compilación de la aplicación para máquinas de 64 bits desde las opciones de la aplicación. Consulte el documento Habilitación de compilaciones de 64 bits de aplicaciones de Xamarin.iOS del documento Consideraciones sobre la plataforma de 32/64 bits para obtener instrucciones detalladas sobre cómo habilitar compilaciones de 64 bits.

Resumen

La aplicación de Xamarin.Forms ahora debe actualizarse a la versión 1.3.1 y la aplicación iOS migrada a Unified API (que admite arquitecturas de 64 bits en la plataforma iOS).

Como se indicó anteriormente, si la aplicación de Xamarin.Forms incluye código nativo, como representadores personalizados o servicios de dependencia, es posible que también sea necesario actualizarlo para usar los nuevos tipos introducidos en Unified API.