Compartir por


Distribución de App Center: actualizaciones desde la aplicación de Android

Importante

Visual Studio App Center está programado para la retirada 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 de soporte técnico y las alternativas.

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 el código de actualización desde la aplicación como 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 o quite completamente el SDK de Distribución que contiene código de actualización desde la aplicación antes de enviar la aplicación a Google Play. Si no lo hace, puede provocar incumplimiento y eliminación de la aplicación de Google Play.

Nota

Si está ejecutando 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 interfaz de usuario.

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.

  1. Abra el archivo build.gradle de nivel de aplicación del proyecto (app/build.gradle) y agregue las siguientes líneas después apply pluginde .

    dependencies {
       def appCenterSdkVersion = '5.0.4'
       implementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
    }
    

    Nota

    Si la versión del complemento de Android Gradle es inferior a la 3.0.0, debe reemplazar la implementación por la compilación.

  2. Guarde el archivo build.gradle y asegúrese de desencadenar una sincronización de Gradle en Android Studio.

  3. DownloadManager se usa para descargar actualizaciones. El SDK de App Center aplica TLS 1.2 para mejorar la seguridad.

2. Iniciar app Center Distribute

Para usar App Center, opte por los módulos que quiera usar. De forma predeterminada, no se inicia ningún módulo y debe llamar explícitamente a cada uno de ellos al iniciar el SDK.

Agregue la clase Distribute al AppCenter.start() método para iniciar el servicio App Center Distribute.

AppCenter.start(getApplication(), "{Your App Secret}", Distribute.class);
AppCenter.start(application, "{Your App Secret}", Distribute::class.java)

Asegúrese de que ha reemplazado {Your App Secret} en el ejemplo de código anterior por el secreto de aplicación. Android Studio sugiere automáticamente la instrucción import necesaria una vez que agregue una referencia a la Distribute clase al start() método , pero si ve un error que indica que los nombres de clase no se reconocen, agregue las líneas siguientes a las instrucciones import de la clase de actividad:

import com.microsoft.appcenter.AppCenter;
import com.microsoft.appcenter.distribute.Distribute;
import com.microsoft.appcenter.AppCenter
import com.microsoft.appcenter.distribute.Distribute

Nota

Android 10 o superior tiene restricciones en la actividad de inicio desde segundo plano. Consulte el artículo sobre las restricciones de 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 SYSTEM_ALERT_WINDOW permisos para las aplicaciones. Consulte el artículo sobre las actualizaciones de permisos en Android 11.

Preparación de la compilación de Google Play

Google Play considera el código de actualización desde la aplicación como 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 o quite completamente el SDK de Distribución que contiene código de actualización desde la aplicación antes de enviar la aplicación a Google Play. Si no lo hace, puede provocar incumplimiento y eliminación de la aplicación de Google Play. Para facilitarlo, proporcionamos la versión del SDK de Distribución de App Center con API con código auxiliar, por lo que el único cambio para usted es un intercambio de dependencias.

  1. Abra el archivo build.gradle del nivel de aplicación del proyecto (app/build.gradle).

  2. Configure variantes de compilación agregando sabores de producto:

    android {
        flavorDimensions "distribute"
        productFlavors {
            appCenter {
                dimension "distribute"
            }
            googlePlay {
                dimension "distribute"
            }
        }
    }
    
  3. Modifique el bloque de dependencias para consumir diferentes dependencias en función del tipo de producto:

    dependencies {
        def appCenterSdkVersion = "5.0.4"
        appCenterImplementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
        googlePlayImplementation "com.microsoft.appcenter:appcenter-distribute-play:${appCenterSdkVersion}"
    }
    
  4. Guarde el archivo build.gradle y asegúrese de desencadenar una sincronización de Gradle en Android Studio.

  5. Puede cambiar la variante de compilación en el menú desplegable Build > Select Build Variant (Seleccionar variante de compilación) o Build Variants (Variantes de compilación) en la barra de ventanas de herramientas.

Puede obtener más información sobre cómo configurar variantes de compilación en la documentación de Android.

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 de setUpdateTrack la API.

Distribute.setUpdateTrack(UpdateTrack.PRIVATE);
Distribute.setUpdateTrack(UpdateTrack.PRIVATE)

Nota

El valor predeterminado es UpdateTrack.PUBLIC. Solo se puede llamar a este método 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 no siempre se llama al método antes de la AppCenter.start llamada, será público de forma predeterminada.

Cuando la aplicación está en primer plano (después Distribute.setUpdateTrack(UpdateTrack.PRIVATE); y AppCenter.start), se abre 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.

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 actualizaciones

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

  • Cuando se inicia la aplicación.
  • Cuando la aplicación entra en primer plano después de ir a segundo plano.
  • Al habilitar el módulo Distribute si se ha deshabilitado anteriormente.

Si desea comprobar manualmente las nuevas versiones, 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();
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 si hay actualizaciones

Distribute.checkForUpdate();
Distribute.checkForUpdate()

Esto envía una solicitud a App Center y muestra un cuadro de diálogo de actualización en caso de que haya disponible una nueva versión.

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 desde la aplicación

1. Personalización o localización de texto

Puede proporcionar fácilmente sus propias cadenas de recursos si desea cambiar o localizar el texto que se muestra en el cuadro de diálogo de actualización. Examine los archivos de cadena de 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. Personalización del cuadro de diálogo de actualización

Puede personalizar la apariencia del cuadro de diálogo de actualización predeterminado mediante la implementación de la DistributeListener interfaz . Debe registrar el agente de escucha antes de llamar a AppCenter.start como se muestra en el ejemplo siguiente:

Distribute.setListener(new MyDistributeListener());
AppCenter.start(...);
Distribute.setListener(MyDistributeListener())
AppCenter.start(...)

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

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.net.Uri;

import com.microsoft.appcenter.distribute.Distribute;
import com.microsoft.appcenter.distribute.DistributeListener;
import com.microsoft.appcenter.distribute.ReleaseDetails;
import com.microsoft.appcenter.distribute.UpdateAction;

public class MyDistributeListener implements DistributeListener {

    @Override
    public boolean onReleaseAvailable(Activity activity, ReleaseDetails releaseDetails) {

        // Look at releaseDetails public methods to get version information, release notes text or release notes URL
        String versionName = releaseDetails.getShortVersion();
        int versionCode = releaseDetails.getVersion();
        String releaseNotes = releaseDetails.getReleaseNotes();
        Uri releaseNotesUrl = releaseDetails.getReleaseNotesUrl();

        // Build our own dialog title and message
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity);
        dialogBuilder.setTitle("Version " + versionName + " available!"); // you should use a string resource instead, this is just a simple example
        dialogBuilder.setMessage(releaseNotes);

        // Mimic default SDK buttons
        dialogBuilder.setPositiveButton(com.microsoft.appcenter.distribute.R.string.appcenter_distribute_update_dialog_download, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                // This method is used to tell the SDK what button was clicked
                Distribute.notifyUpdateAction(UpdateAction.UPDATE);
            }
        });

        // We can postpone the release only if the update isn't mandatory
        if (!releaseDetails.isMandatoryUpdate()) {
            dialogBuilder.setNegativeButton(com.microsoft.appcenter.distribute.R.string.appcenter_distribute_update_dialog_postpone, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    // This method is used to tell the SDK what button was clicked
                    Distribute.notifyUpdateAction(UpdateAction.POSTPONE);
                }
            });
        }
        dialogBuilder.setCancelable(false); // if it's cancelable you should map cancel to postpone, but only for optional updates
        dialogBuilder.create().show();

        // Return true if you're using your own dialog, false otherwise
        return true;
    }
    
    @Override
    public void onNoReleaseAvailable(Activity activity) {
        Toast.makeText(activity, activity.getString(R.string.no_updates_available), Toast.LENGTH_LONG).show();
    }
}
import android.app.Activity
import android.app.AlertDialog
import com.microsoft.appcenter.distribute.Distribute
import com.microsoft.appcenter.distribute.DistributeListener
import com.microsoft.appcenter.distribute.ReleaseDetails
import com.microsoft.appcenter.distribute.UpdateAction

class MyDistributeListener : DistributeListener {

    override fun onReleaseAvailable(activity: Activity, releaseDetails: ReleaseDetails): Boolean {

        // Look at releaseDetails public methods to get version information, release notes text or release notes URL
        val versionName = releaseDetails.shortVersion
        val versionCode = releaseDetails.version
        val releaseNotes = releaseDetails.releaseNotes
        val releaseNotesUrl = releaseDetails.releaseNotesUrl

        // Build our own dialog title and message
        val dialogBuilder = AlertDialog.Builder(activity)
        dialogBuilder.setTitle("Version $versionName available!") // you should use a string resource instead, this is just a simple example
        dialogBuilder.setMessage(releaseNotes)

        // Mimic default SDK buttons
        dialogBuilder.setPositiveButton(
            com.microsoft.appcenter.distribute.R.string.appcenter_distribute_update_dialog_download
        ) { dialog, which ->
            // This method is used to tell the SDK what button was clicked
            Distribute.notifyUpdateAction(UpdateAction.UPDATE)
        }

        // We can postpone the release only if the update isn't mandatory
        if (!releaseDetails.isMandatoryUpdate) {
            dialogBuilder.setNegativeButton(
                com.microsoft.appcenter.distribute.R.string.appcenter_distribute_update_dialog_postpone
            ) { dialog, which ->
                // This method is used to tell the SDK what button was clicked
                Distribute.notifyUpdateAction(UpdateAction.POSTPONE)
            }
        }
        dialogBuilder.setCancelable(false) // if it's cancelable you should map cancel to postpone, but only for optional updates
        dialogBuilder.create().show()

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

    override fun onNoReleaseAvailable(activity: Activity) {
        Toast.makeText(activity, activity.getString(R.string.no_updates_available), Toast.LENGTH_LONG).show()
    }
}

Como se muestra en el ejemplo, debe llamar a Distribute.notifyUpdateAction(UpdateAction.UPDATE); o Distribute.notifyUpdateAction(UpdateAction.POSTPONE); si el agente de escucha devuelve true.

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

Se puede llamar al agente de escucha de nuevo 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 luego 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 puede 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.

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 onNoReleaseAvailable devolución de llamada de la DistributeListener interfaz. Esto le permite ejecutar código personalizado en estos escenarios. En el ejemplo anterior se muestra cómo mostrar el mensaje del sistema cuando no se encuentran actualizaciones.

Habilitar o deshabilitar 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 en la aplicación, pero todavía puede usar El servicio Distribute en el portal de App Center.

Distribute.setEnabled(false);
Distribute.setEnabled(false)

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

Distribute.setEnabled(true);
Distribute.setEnabled(true)

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

Esta API es asincrónica, puede leer más sobre esto en nuestra guía de API asincrónicas de App Center .

Nota

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

Compruebe si App Center Distribute está habilitado.

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

Distribute.isEnabled();
Distribute.isEnabled()

Esta API es asincrónica, puede leer más sobre esto en nuestra guía de API asincrónicas de App Center .

Nota

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

Habilitación de actualizaciones desde la aplicación para compilaciones de depuración

De forma predeterminada, App Center habilita las actualizaciones desde la aplicación solo para las compilaciones de versión.

Para habilitar las actualizaciones desde la aplicación en compilaciones de depuración, llame al método siguiente antes AppCenter.startde :

Distribute.setEnabledForDebuggableBuild(true);
Distribute.setEnabledForDebuggableBuild(true)

Nota

Este método solo afecta a las compilaciones de depuración y no afecta a las compilaciones de versión. La compilación de depuración significa que la android:debuggable marca se establece en (que normalmente se establece true automáticamente mediante variantes de compilación de depuración predefinidas de gradle). De lo contrario, se trata de una compilación de versión.

¿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 De distribución de App Center .

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

  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 carga lateral. 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 permanezca 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 siguiente paso se produce directamente.

  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:

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

Sugerencia

Si carga el mismo APK una segunda vez, el cuadro de diálogo NO aparecerá como las versiones idénticas.

Cómo probar actualizaciones en 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á pensado para probar la característica de actualización en la aplicación.
  3. Agréguese (o a todas las personas que quiera incluir en la prueba de la característica de actualización en la aplicación). Use 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 ha descrito anteriormente. Si el grupo es privado, no olvide establecer la pista de actualización privada en la aplicación antes de empezar a usar la API setUpdateTrack.
  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 instaladas las actualizaciones desde la aplicación, está listo para probar las actualizaciones desde la aplicación.
  9. Aumenta el tamaño versionCode de la aplicación.
  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 distribuya esto al grupo de distribución que creó anteriormente. Se pedirá a los miembros del grupo de distribución 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á como resultado una experiencia más fluida para los evaluadores y los usuarios a medida que obtienen la experiencia de actualización en la aplicación.