Distribución de App Center: actualizaciones de MAUI y Xamarin en la aplicación

Importante

Visual Studio App Center está programado para retirarse el 31 de marzo de 2025. Aunque puede seguir usando Visual Studio App Center hasta que se retire por completo, hay varias alternativas recomendadas a las que puede considerar la posibilidad de migrar.

Obtenga más información sobre las escalas de tiempo y las alternativas de soporte técnico.

App Center Distribute permitirá a los usuarios instalar una nueva versión de la aplicación al distribuirla a través de App Center. Con una nueva versión de la aplicación disponible, el SDK presentará un cuadro de diálogo de actualización a los usuarios para descargar o posponer la nueva versión. Una vez que decidan actualizar, el SDK comenzará a actualizar la aplicación.

Advertencia

Google Play considera que el código de actualización desde la aplicación es un comportamiento malintencionado incluso si no se usa en tiempo de ejecución. Use una variante del SDK de Distribución como se indica en esta sección antes de enviar la aplicación a Google Play. Si no se quita el código de actualización desde la aplicación, se puede producir un incumplimiento y la eliminación de la aplicación de Google Play.

Nota

Si ejecuta pruebas automatizadas de IU, las actualizaciones habilitadas en la aplicación bloquearán las pruebas automatizadas de IU, ya que intentarán autenticarse en el back-end de App Center. Se recomienda no habilitar App Center Distribute para las pruebas de IU.

Agregar actualizaciones de la aplicación a la aplicación

Siga la sección Introducción si aún no ha configurado e iniciado el SDK en la aplicación.

1. Agregar el módulo Distribuir de App Center

El SDK de App Center está diseñado con un enfoque modular: un desarrollador solo necesita integrar los módulos de los servicios en los que están interesados.

Visual Studio para Mac

  • Abra Visual Studio para Mac.
  • Haga clic en Abrir archivo>y elija la solución.
  • En el navegador de soluciones, haga clic con el botón derecho en la sección Paquetes y elija Agregar paquetes NuGet....
  • Busque App Center e instale App Center Distribute.
  • Haga clic en Agregar paquetes.

Visual Studio para Windows

  • Abra Visual Studio para Windows.
  • Haga clic en Abrir archivo>y elija la solución.
  • En el navegador de soluciones, haga clic con el botón derecho en Referencias y elija Administrar paquetes NuGet.
  • Busque App Center e instale Microsoft.AppCenter.Distribute.

Consola del Administrador de paquetes

  • Abra la consola en Visual Studio. Para ello, elija Herramientas>Consola del Administrador> de paquetes NuGet Administrador de paquetes.
  • Si está trabajando en Visual Studio para Mac, asegúrese de que ha instalado las extensiones de administración de paquetes NuGet. Para ello, elijaExtensionesde Visual Studio>, busque NuGet e instale, si es necesario.
  • Escriba el siguiente comando en la consola:
Install-Package Microsoft.AppCenter.Distribute

Nota

Si usa el SDK de App Center en un proyecto portátil (por ejemplo , Xamarin.Forms), debe instalar los paquetes en cada uno de los proyectos: los portátiles, Android e iOS. Para ello, debe abrir cada subproyecto y seguir los pasos correspondientes descritos en las secciones Visual Studio para Mac o Visual Studio para Windows.

Nota

Android 10 o superior tiene restricciones en la actividad de inicio desde segundo plano. Consulte el artículo sobre las restricciones sobre el inicio de actividades en segundo plano.

Nota

Las aplicaciones que se ejecutan en Android 10 (Edición Go) no pueden recibir el permiso SYSTEM_ALERT_WINDOW . Consulte el artículo sobre SYSTEM_ALERT_WINDOW en dispositivos Go.

Nota

A partir de Android 11, ACTION_MANAGE_OVERLAY_PERMISSION las intenciones siempre llevan al usuario a la pantalla configuración de nivel superior, donde el usuario puede conceder o revocar los permisos para las SYSTEM_ALERT_WINDOW aplicaciones. Consulte el artículo sobre las actualizaciones de permisos en Android 11.

2. Iniciar la distribución de App Center

Configure el SDK de App Center mediante una llamada AppCenter.Start(...) a como se describe en la guía de introducción.

Para la aplicación de iOS, abra y AppDelegate.cs agregue la línea siguiente antes de la llamada a LoadApplication:

Distribute.DontCheckForUpdatesInDebug();

Este paso no es necesario en Android donde la configuración de depuración se detecta automáticamente en tiempo de ejecución.

Para habilitar las actualizaciones desde la aplicación para las compilaciones de depuración en Android, llame al siguiente método en el archivo MainActivity.cs del proyecto, en el OnCreate método y antes LoadApplicationde .

Distribute.SetEnabledForDebuggableBuild(true);

Nota

Este método solo afecta a las compilaciones de depuración y no tiene ningún impacto en las compilaciones de versión.

2.3 [Solo para iOS] Modificar info.plist del proyecto

El SDK de App Center comprueba las direcciones URL que redirigen a la aplicación para evitar la instalación de prueba, por lo que para que las actualizaciones distribuidas a través del portal se controlen correctamente, deberá especificar CFBundleURLSchemes en CFBundleURLTypes la sección del Info.plist archivo:

Nota

Info.plisto un archivo de lista de propiedades de información es un archivo de texto estructurado que contiene información de configuración esencial para un ejecutable agrupado. Puede encontrar más información sobre ella en la documentación para desarrolladores de Apple.

  1. Agregue una nueva clave para URL types o CFBundleURLTypes en el archivo Info.plist (en caso de que Xcode muestre info.plist como código fuente).
  2. Cambie la clave del primer elemento secundario a URL Schemes o CFBundleURLSchemes.
  3. Escriba appcenter-${APP_SECRET} como esquema de dirección URL y reemplace por ${APP_SECRET} el secreto de aplicación de la aplicación.

Sugerencia

Si desea comprobar que ha modificado Info.plist correctamente, ábralo como código fuente. Debe contener la siguiente entrada con el secreto de aplicación en lugar de ${APP_SECRET}:

<key>CFBundleURLTypes</key>
  <array>
      <dict>
          <key>CFBundleURLSchemes</key>
          <array>
              <string>appcenter-${APP_SECRET}</string>
          </array>
      </dict>
  </array>

Eliminación de actualizaciones desde la aplicación para compilaciones de Google Play

Google Play considera que el código de actualización desde la aplicación es un comportamiento malintencionado incluso si no se usa en tiempo de ejecución. Si no se quita el código de actualización desde la aplicación, se puede producir un incumplimiento y la eliminación de la aplicación de Google Play. Para facilitar la tarea, proporcionamos la versión del SDK de App Center Distribute con API de código auxiliar, por lo que el único cambio para usted es un intercambio de dependencias.

  1. Agregue una nueva configuración de compilación denominada GooglePlay para los proyectos compartidos y Xamarin.Android . Asegúrese de que la configuración de compilación de los proyectos está asignada correctamente a la configuración de la solución adecuada. Consulte Instrucciones de Visual Studio o Visual Studio para Mac para obtener más detalles.

  2. Abra Xamarin.Android y proyectos compartidos en .csproj cualquier editor de texto y mueva la referencia de distribución al grupo de elementos condicionales:

    <ItemGroup Condition=" '$(Configuration)' != 'GooglePlay' ">
        <PackageReference Include="Microsoft.AppCenter.Distribute" Version="3.3.0" />
    </ItemGroup>
    <ItemGroup Condition=" '$(Configuration)' == 'GooglePlay' ">
        <PackageReference Include="Microsoft.AppCenter.DistributePlay" Version="3.3.0" />
    </ItemGroup>
    

    Nota

    Si usa el formato depackages.config anterior para administrar las referencias de NuGet, puede migrar a un formato PackageReference , siga las instrucciones de migración.

  3. Guarde los cambios y restaure los paquetes NuGet.

  4. Puede cambiar la configuración en la barra de comandos de la parte superior del IDE.

Uso del grupo de distribución privado

De forma predeterminada, Distribute usa un grupo de distribución público. Si desea usar un grupo de distribución privado, deberá establecerlo explícitamente a través UpdateTrack de la propiedad .

Distribute.UpdateTrack = UpdateTrack.Private;

Nota

El valor predeterminado es UpdateTrack.Public. Esta propiedad solo se puede actualizar antes de la llamada al AppCenter.Start método . Los cambios en la pista de actualización no se conservan cuando se reinicia el proceso de aplicación, por lo que si la propiedad no siempre se actualiza antes de la AppCenter.Start llamada, será pública de forma predeterminada.

Después de esta llamada, se abrirá una ventana del explorador para autenticar al usuario. Todas las comprobaciones de actualización posteriores obtendrán la versión más reciente en la pista privada. La pista de actualización no se conserva en el SDK en los inicios de la aplicación.

Si un usuario está en la pista privada, significa que después de la autenticación correcta, obtendrá la versión más reciente de cualquier grupo de distribución privado del que sea miembro. Si un usuario está en la pista pública, significa que obtendrá la versión más reciente de cualquier grupo de distribución público.

Deshabilitar la comprobación automática de la actualización

De forma predeterminada, el SDK comprueba automáticamente si hay nuevas versiones:

  • Cuando se inicia la aplicación.
  • Cuando la aplicación entra en segundo plano, vuelva a estar en primer plano.
  • Al habilitar el módulo Distribute si se ha deshabilitado anteriormente.

Si desea buscar nuevas versiones manualmente, puede deshabilitar la comprobación automática de la actualización. Para ello, llame al método siguiente antes de que se inicie el SDK:

Distribute.DisableAutomaticCheckForUpdate();

Nota

Se debe llamar a este método antes de la llamada al AppCenter.Start método .

A continuación, puede usar la CheckForUpdate API que se describe en la sección siguiente.

Comprobar manualmente la actualización

Distribute.CheckForUpdate();

Nota

Una comprobación manual de la llamada de actualización funciona incluso cuando se habilitan las actualizaciones automáticas. Se omite una comprobación manual de la actualización si ya se está realizando otra comprobación. La comprobación manual de la actualización no se procesará si el usuario ha pospuesto actualizaciones (a menos que la versión más reciente sea una actualización obligatoria).

Personalización o localización del cuadro de diálogo de actualización en la aplicación

1. Personalizar o localizar texto

Puede proporcionar fácilmente sus propias cadenas de recursos si desea localizar el texto que se muestra en el cuadro de diálogo de actualización. Examine los archivos de cadena de iOS en este archivo de recursos y los de Android en este archivo de recursos. Use el mismo nombre o clave de cadena y especifique el valor localizado que se reflejará en el cuadro de diálogo en sus propios archivos de recursos de la aplicación.

2. Personalizar el cuadro de diálogo de actualización

Puede personalizar la apariencia del cuadro de diálogo de actualización predeterminado implementando la ReleaseAvailable devolución de llamada. Debe registrar la devolución de llamada antes de llamar AppCenter.Start como se muestra en el ejemplo siguiente:

// In this example OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;
AppCenter.Start(...);

Este es un ejemplo de la implementación de devolución de llamada que reemplaza el cuadro de diálogo del SDK por uno personalizado:

bool OnReleaseAvailable(ReleaseDetails releaseDetails)
{
    // Look at releaseDetails public properties to get version information, release notes text or release notes URL
    string versionName = releaseDetails.ShortVersion;
    string versionCodeOrBuildNumber = releaseDetails.Version;
    string releaseNotes = releaseDetails.ReleaseNotes;
    Uri releaseNotesUrl = releaseDetails.ReleaseNotesUrl;

    // custom dialog
    var title = "Version " + versionName + " available!";
    Task answer;

    // On mandatory update, user can't postpone
    if (releaseDetails.MandatoryUpdate)
    {
        answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install");
    }
    else
    {
        answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install", "Maybe tomorrow...");
    }
    answer.ContinueWith((task) =>
    {
        // If mandatory or if answer was positive
        if (releaseDetails.MandatoryUpdate || (task as Task<bool>).Result)
        {
            // Notify SDK that user selected update
            Distribute.NotifyUpdateAction(UpdateAction.Update);
        }
        else
        {
            // Notify SDK that user selected postpone (for 1 day)
            // This method call is ignored by the SDK if the update is mandatory
            Distribute.NotifyUpdateAction(UpdateAction.Postpone);
        }
    });

    // Return true if you're using your own dialog, false otherwise
    return true;
}

Notas de implementación de Xamarin.Android:

Como se muestra en el ejemplo, debe llamar a Distribute.NotifyUpdateAction(UpdateAction.UPDATE); o Distribute.NotifyUpdateAction(UpdateAction.POSTPONE); si la devolución de llamada devuelve true.

Si no llama a NotifyUpdateAction, la devolución de llamada se repetirá en cada cambio de actividad.

Se puede volver a llamar a la devolución de llamada con la misma versión si la actividad cambia antes de que se notifique a la acción del usuario al SDK.

Este comportamiento es necesario para cubrir los siguientes escenarios:

  • La aplicación se envía al fondo (como presionar HOME) y, a continuación, se reanuda en otra actividad.
  • La actividad está cubierta por otra sin salir de la aplicación (como hacer clic en algunas notificaciones).
  • Otros escenarios similares.

En ese caso, la actividad que hospeda el cuadro de diálogo podría reemplazarse sin interacción del usuario. Por lo tanto, el SDK llama de nuevo al agente de escucha para que pueda restaurar el cuadro de diálogo personalizado.

3. Ejecutar código si no se encuentra ninguna actualización

En los casos en los que el SDK busca actualizaciones y no encuentra ninguna actualización disponible más reciente que la usada actualmente, se invoca una NoReleaseAvailable devolución de llamada. Esto le permite ejecutar código personalizado en estos escenarios. Debe registrar la devolución de llamada antes de llamar AppCenter.Start como se muestra en el ejemplo siguiente:

// In this example OnNoReleaseAvailable is a method name in same class
Distribute.NoReleaseAvailable = OnNoReleaseAvailable;
AppCenter.Start(...);
void OnNoReleaseAvailable()
{
    AppCenterLog.Info(LogTag, "No release available callback invoked.");
}

Habilitación o deshabilitación de App Center Distribute en tiempo de ejecución

Puede habilitar y deshabilitar App Center Distribute en tiempo de ejecución. Si la deshabilita, el SDK no proporcionará ninguna funcionalidad de actualización desde la aplicación, pero todavía puede usar El servicio Distribute en el portal de App Center.

Distribute.SetEnabledAsync(false);

Para habilitar App Center Distribute de nuevo, use la misma API, pero pase true como parámetro.

Distribute.SetEnabledAsync(true);

No es necesario esperar esta llamada para que otras llamadas API (como IsEnabledAsync) sean coherentes.

El estado se conserva en el almacenamiento del dispositivo en los inicios de la aplicación.

Nota

Este método solo se debe usar después Distribute de haberse iniciado.

Comprobación de si App Center Distribute está habilitado

También puede comprobar si App Center Distribute está habilitado o no:

bool enabled = await Distribute.IsEnabledAsync();

Nota

Este método solo se debe usar después Distribute de que se haya iniciado, siempre devolverá false antes del inicio.

Realice la limpieza justo antes de que la aplicación se cierre para la actualización (solo iOS)

Registre la devolución de llamada como se muestra en el ejemplo siguiente:

// In this example, OnWillExitApp is a method name in same class
Distribute.WillExitApp = OnWillExitApp;
void OnWillExitApp()
{
    // Perform clean up here
}

Con eso, OnWillExitApp() se invocará cuando Distribute esté a punto de cerrarse.

¿Cómo funcionan las actualizaciones desde la aplicación?

Nota

Para que las actualizaciones desde la aplicación funcionen, se debe descargar una compilación de aplicación desde el vínculo. No funcionará si se instala desde un IDE o manualmente.

La característica de actualizaciones desde la aplicación funciona de la siguiente manera:

  1. Esta característica solo funciona con compilaciones RELEASE (de forma predeterminada) que se distribuyen mediante el servicio App Center Distribute . No funcionará si la característica acceso guiado de iOS está activada.

  2. Una vez que integre el SDK, compile la versión de la aplicación y cargue en App Center, se notificará a los usuarios de ese grupo de distribución la nueva versión por correo electrónico.

  3. Cuando cada usuario abra el vínculo en su correo electrónico, la aplicación se instalará en su dispositivo. Es importante que usen el vínculo de correo electrónico para instalar: no se admite la instalación de prueba. Cuando se descarga una aplicación desde el vínculo, el SDK guarda información importante de las cookies para buscar actualizaciones más adelante; de lo contrario, el SDK no tiene esa información clave.

  4. Si la aplicación establece la pista en privada, se abrirá un explorador para autenticar al usuario y habilitar las actualizaciones desde la aplicación. El explorador no se volverá a abrir siempre y cuando la información de autenticación siga siendo válida incluso cuando vuelva a la pista pública y vuelva a ser privada más tarde. Si la autenticación del explorador se realiza correctamente, el usuario se redirige automáticamente a la aplicación. Si la pista es pública (que es el valor predeterminado), el paso siguiente se produce directamente.

    • En iOS 9 y 10, se abrirá una instancia de dentro de SFSafariViewController la aplicación para autenticar al usuario. Se cerrará automáticamente después de que la autenticación se haya realizado correctamente.
    • En iOS 11, la experiencia del usuario es similar a iOS 10, pero iOS 11 le pedirá al usuario su permiso para acceder a la información de inicio de sesión. Se trata de un cuadro de diálogo de nivel de sistema y no se puede personalizar. Si el usuario cancela el cuadro de diálogo, puede seguir usando la versión que está probando, pero no obtendrá actualizaciones en la aplicación. Se les pedirá que accedan de nuevo a la información de inicio de sesión cuando inicien la aplicación la próxima vez.
  5. Una nueva versión de la aplicación muestra el cuadro de diálogo de actualización desde la aplicación que pide a los usuarios que actualicen la aplicación si es:

    • iOS:

      • un valor mayor de CFBundleShortVersionString o
      • un valor igual de CFBundleShortVersionString pero un valor mayor de CFBundleVersion.
      • las versiones son las mismas, pero el identificador único de compilación es diferente.
    • Android:

      • un valor mayor de versionCode o
      • un valor igual de versionCode pero un valor diferente de versionName.

Sugerencia

Si carga el mismo apk/ipa una segunda vez, el cuadro de diálogo NO aparecerá como los binarios son idénticos. En iOS, si carga una nueva compilación con las mismas propiedades de versión, se mostrará el cuadro de diálogo de actualización. La razón de esto es que es un binario diferente . En Android, los archivos binarios se consideran iguales si ambas propiedades de versión son las mismas.

Cómo probar las actualizaciones desde la aplicación?

Debe cargar compilaciones de versión (que usan el módulo Distribuir del SDK de App Center) en el portal de App Center para probar las actualizaciones desde la aplicación, lo que aumenta los números de versión cada vez.

  1. Cree la aplicación en el portal de App Center si aún no lo ha hecho.
  2. Cree un nuevo grupo de distribución y asígnele el nombre, por lo que puede reconocer que está diseñado para probar la característica de actualización en la aplicación.
  3. Agréguese (o todas las personas que quiera incluir en la prueba de la característica de actualización desde la aplicación). Usa una dirección de correo electrónico nueva o descartada para esto, que no se usó para esa aplicación en App Center. Esto garantiza que su experiencia esté cerca de la experiencia de los evaluadores reales.
  4. Cree una nueva compilación de la aplicación que incluya App Center Distribute y contenga la lógica de configuración, como se describe a continuación. Si el grupo es privado, no olvide establecer la pista de actualización privada desde la aplicación antes de empezar a usar la UpdateTrack propiedad .
  5. Haga clic en el botón Distribuir nueva versión en el portal y cargue la compilación de la aplicación.
  6. Una vez finalizada la carga, haga clic en Siguiente y seleccione el grupo Distribución que creó como Destino de esa distribución de la aplicación.
  7. Revise la distribución y distribuya la compilación al grupo de pruebas desde la aplicación.
  8. Personas en ese grupo recibirá una invitación para ser evaluadores de la aplicación. Una vez que acepten la invitación, pueden descargar la aplicación desde el portal de App Center desde su dispositivo móvil. Una vez que tengan instaladas las actualizaciones desde la aplicación, estará listo para probar las actualizaciones desde la aplicación.
  9. Aumento de la versión de la aplicación (CFBundleShortVersionString o CFBundleVersion para iOS, versionCode para Android)
  10. Compile la versión de lanzamiento de la aplicación y cargue una nueva compilación de la aplicación como hizo en el paso anterior y distribúyala al grupo de distribución que creó anteriormente. A los miembros del grupo de distribución se les pedirá una nueva versión la próxima vez que se inicie la aplicación.

Sugerencia

Echa un vistazo a la información sobre cómo usar App Center Distribute para obtener información más detallada sobre los grupos de distribución , etc. Aunque es posible usar App Center Distribute para distribuir una nueva versión de la aplicación sin agregar ningún código, agregar App Center Distribute al código de la aplicación dará lugar a una experiencia más fluida para los evaluadores y usuarios a medida que obtienen la experiencia de actualización desde la aplicación.

Deshabilitación del reenvío automático de los métodos del delegado de aplicación a los servicios de App Center

App Center usa swizzling para reenviar automáticamente los métodos del delegado de aplicación a los servicios de App Center para mejorar la integración del SDK. Existe la posibilidad de conflictos con otras bibliotecas de terceros o con el propio delegado de aplicación. En este caso, es posible que quiera deshabilitar el reenvío de la aplicación de App Center para todos los servicios de App Center siguiendo los pasos siguientes:

  1. Abra el archivo Info.plist del proyecto.
  2. Agregue AppCenterAppDelegateForwarderEnabled la clave y establezca el valor en 0. Esto deshabilita el reenvío de delegados de aplicación para todos los servicios de App Center.
  3. Agregue OpenUrl la devolución de llamada en el AppDelegate.cs archivo.
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
    Distribute.OpenUrl(url);
    return true;
}