Distribuir apps

La API de EMM de Google Play admite los siguientes métodos de distribución para apps públicas y privadas:

Cómo instalar apps de forma manual desde Google Play Store administrado

Puedes definir qué apps están disponibles para que un usuario las instale en el policy de Device y configurarlas llamando a Devices.update. Cuando aprovisiones un dispositivo nuevo, debes configurar la política antes de agregar la cuenta de Google Play administrada al dispositivo. De lo contrario, la política no se aplicará durante un período breve después de agregar la cuenta al dispositivo.

El comportamiento de Play Store administrado se define según el valor de policy.productAvailabilityPolicy:

  • all: Todas las apps públicas de Play Store están disponibles.
  • whitelist: Solo están disponibles las apps que se indican en policy.productPolicy.

En ambos casos, todas las apps de policy.productPolicy se agregan de forma predeterminada al diseño de la tienda de la empresa. El diseño de la tienda de la empresa es la página principal de Play Store administrado cuando se selecciona whitelist, y se puede acceder a ella en la pestaña "Apps de trabajo" cuando se selecciona all. Puedes permitir que el cliente personalice el diseño de la tienda de la empresa incorporando el iframe de Google Play administrado (consulta Organiza apps con el iframe de Google Play administrado).

Instala apps de forma remota en los dispositivos de los usuarios

Para instalar de forma remota (también llamada instalación push) una app en el dispositivo de un usuario, configura policy.productPolicy.autoInstallPolicy en el policy de Device. Cuando aprovisiones un dispositivo nuevo, debes configurar la política antes de agregar la cuenta de Google Play administrada al dispositivo. De lo contrario, la política no se aplicará durante un período breve después de agregar la cuenta al dispositivo.

autoInstallMode se puede configurar de la siguiente manera:

  • doNotAutoInstall: La app no se instala automáticamente.
  • autoInstallOnce: La app se instala automáticamente una vez. Si el usuario la desinstala, no se volverá a instalar.
  • forceAutoInstall: La app se instala automáticamente. Si el usuario la desinstala, se volverá a instalar. En los dispositivos administrados, el DPC debe bloquear la desinstalación con DevicePolicyManager.setUninstallBlocked.

En caso de falla (pérdida de conectividad, falta de almacenamiento, etc.), las instalaciones se reintentan automáticamente hasta que se completen de forma correcta. Se aplica una estrategia de reintento de retirada exponencial para evitar el desperdicio de batería y datos en caso de fallas irrecuperables.

Prioridad de instalación

Para elegir el orden de las instalaciones, configura autoInstallPriority. La prioridad debe ser un número entero sin signo, y el valor predeterminado es 0. Las apps se instalarán en orden o prioridad creciente, lo que significa que las apps con el valor de prioridad más bajo se instalarán primero.

Instala restricciones

Puedes establecer restricciones de instalación para cada app configurando un autoInstallConstraint, lo que te permite controlar el estado requerido del dispositivo durante la instalación:

  • si el dispositivo debe estar conectado a una red Wi-Fi
  • si el dispositivo debería estar cargando
  • y si el dispositivo debe estar inactivo (si el usuario no lo usa de forma activa).

Si no se cumplen las restricciones de inmediato, las instalaciones afectadas se pondrán en cola hasta que se cumplan.

En un autoInstallConstraint, se aplica la regla Y entre los campos. Por ejemplo, con el siguiente autoInstallConstraint, el dispositivo debe estar cargando y conectado a una red de uso no medido (p.ej., Wi-Fi) para que se instale la app:

"autoInstallConstraint": [
  "chargingStateConstraint" : "chargingRequired",
  "networkTypeConstraint" : "unmeteredNetwork"
]

Cómo instalar apps automáticamente en dispositivos aprovisionados recientemente

La API de EMM de Google Play envía una notificación NewDeviceEvent cuando se aprovisiona un dispositivo por primera vez. Para instalar apps de manera automática en dispositivos aprovisionados recientemente, escucha las notificaciones de NewDeviceEvent. Desde cada NewDeviceEvent, recupera userId y deviceId y, luego, llama a Devices.update para configurar la política de ese dispositivo.

Para obtener información sobre cómo suscribirte a las notificaciones de EMM, consulta Cómo configurar notificaciones de EMM.

Comentarios sobre errores de instalación automática de apps

Los errores relacionados con la instalación de la app se informan a través de Comentarios sobre la app, y el DPC puede supervisar el mensaje EnterprisePolicyStatus que se envía a través de KeyedAppStatesService.

Para decodificar los datos codificados en Base64, el DPC debe generar clases según la definición de proto de EnterprisePolicyStatus. Consulta la documentación de Protocol Buffers para obtener instrucciones sobre cómo generar clases de proto.

Con las clases generadas, el DPC puede decodificar el objeto EnterprisePolicyStatus:

EnterprisePolicyStatus enterprisePolicyStatus = EnterprisePolicyStatus.parseFrom(
    BaseEncoding.base64().decode(base64EncodedString)
);

La política de dispositivos ahora incluye el nuevo campo opcional PolicyId. Cuando se crea o actualiza una política, el EMM puede establecer PolicyId en cualquier valor de cadena para identificar una versión específica de la Política de dispositivos.

Si está disponible, los comentarios de instalación de la app informarán el PolicyId para que el DPC pueda hacer coincidir los errores recibidos con políticas específicas.

EnterprisePolicyStatus

message EnterprisePolicyStatus {
  // Individual status for an app in the policy
  repeated ApplicationStatus app_status = 1;

  // Version of the policy for which this status applies.
  PolicyVersion version = 2;
}

ApplicationStatus

// Individual status for an app.
message ApplicationStatus {
  // The package name for the app.
  string package_name = 1;

  // The install status for the app. Only includes status for apps scheduled
  // to be auto-installed via the policy resource.
  AutoInstallStatus install_status = 2;
}

AutoInstallStatus

// Auto-install status for an app.
message AutoInstallStatus {
  // The error causing the install to fail if state is INSTALL_ERROR.
  EnterpriseAutoInstallError error = 1;

  // The current install state of the app.
  EnterpriseAutoInstallState state = 2;
}

PolicyVersion

// The version of the policy which these install states apply to.
message PolicyVersion {
  // A policy id which may be optionally set by the EMM.
  string policy_id = 1;
}

EnterpriseAutoInstallError

// Install errors resulting in failure to install an app.
enum EnterpriseAutoInstallError {
  // Catch-all for unrecognized enum values.
  ENTERPRISE_AUTO_INSTALL_ERROR_UNKNOWN = 0;

  // The app could not be found.
  ENTERPRISE_AUTO_INSTALL_ERROR_NOT_FOUND = 1;

  // The app is not available in the user's country.
  ENTERPRISE_AUTO_INSTALL_ERROR_UNAVAILABLE_COUNTRY = 2;

  // The app is not compatible with the device hardware.
  ENTERPRISE_AUTO_INSTALL_ERROR_NOT_COMPATIBLE_WITH_DEVICE = 3;

  // No license remained to grant ownership of the app, and the user did not
  // already own the app.
  ENTERPRISE_AUTO_INSTALL_ERROR_NO_LICENSES_REMAINING = 4;

  // Required permissions for the app have not been accepted.
  ENTERPRISE_AUTO_INSTALL_ERROR_MISSING_PERMISSION = 5;

  // The app is not available based on the enterprise availability policy.
  ENTERPRISE_AUTO_INSTALL_ERROR_NOT_APPROVED_OR_UNAVAILABLE = 6;

  // The app is not available to the user or device.
  ENTERPRISE_AUTO_INSTALL_ERROR_APP_UNAVAILABLE = 7;

  // Failed to grant license because the user already has ownership.
  ENTERPRISE_AUTO_INSTALL_ERROR_INCOMPATIBLE_OWNERSHIP = 8;

  // The admin has not accepted the terms of service.
  ENTERPRISE_AUTO_INSTALL_ERROR_TOS_NOT_ACCEPTED = 9;

  // The device does not have enough RAM.
  ENTERPRISE_AUTO_INSTALL_ERROR_INSUFFICIENT_RAM = 10;

  // The app is incompatible with the device carrier.
  ENTERPRISE_AUTO_INSTALL_ERROR_NOT_COMPATIBLE_WITH_DEVICE_CARRIER = 11;

  // The app is incompatible with the country or carrier.
  ENTERPRISE_AUTO_INSTALL_ERROR_NOT_COMPATIBLE_WITH_DEVICE_COUNTRY_OR_CARRIER = 12;

  // The app is incompatible with the safe search level.
  ENTERPRISE_AUTO_INSTALL_ERROR_NOT_COMPATIBLE_WITH_DEVICE_SAFE_SEARCH_LEVEL = 13;

  // The app could not be installed due to an installer error.
  ENTERPRISE_AUTO_INSTALL_ERROR_INSTALL_FAILED = 14;

  // The app could not be installed due to network errors.
  ENTERPRISE_AUTO_INSTALL_ERROR_NETWORK_FAILED = 15;

  // The device does not have enough storage.
  ENTERPRISE_AUTO_INSTALL_ERROR_INSUFFICIENT_STORAGE = 16;
}

EnterpriseAutoInstallState

// The current install state for an app.
enum EnterpriseAutoInstallState {
  // Catch-all for unrecognized enum values.
  INSTALL_STATE_UNKNOWN = 0;

  // The app has been received by Play but an install attempt has not completed
  // yet.
  INSTALL_STATE_PENDING = 1;

  // The latest install attempt failed and will be retried automatically.
  INSTALL_STATE_ERROR = 2;

  // The app has been installed.
  INSTALL_STATE_INSTALLED = 3;
}

Cómo distribuir apps para pruebas cerradas

Las pruebas cerradas permiten que los desarrolladores de apps obtengan comentarios sobre las primeras versiones de sus apps de usuarios de confianza. Los desarrolladores pueden configurar pruebas cerradas en Google Play Console. Usas la API de EMM de Play para permitir que los administradores de TI distribuyan versiones cerradas (también llamadas segmentos) de apps a usuarios específicos. Tus clientes empresariales pueden usar esta función para probar apps de terceros y también apps privadas desarrolladas de forma interna.

Apps aptas

Antes de que un desarrollador agregue una empresa a la lista de verificadores cerrados de una app, esta debe cumplir con los siguientes criterios:

  • Se publica una versión de producción de la app en Google Play.
  • En Google Play Console, Google Play administrado está habilitado en la página Configuración avanzada de la app.
  • Todas las versiones cerradas de la app cumplen con los requisitos del código de versión.

Cómo agregar una empresa a las pruebas cerradas

Los desarrolladores de apps pueden agregar empresas a las pruebas que usan los métodos Prueba alfa cerrada o Prueba alfa a través de Grupos de Google. Para obtener instrucciones, consulta la guía sobre cómo configurar una prueba abierta, cerrada o interna. El desarrollador debe ingresar el ID de la organización (también conocido como ID de la empresa) de cada empresa participante. Los administradores de TI pueden proporcionar el ID de su organización a los desarrolladores de apps de terceros siguiendo estos pasos:

  1. Accede a Google Play Store administrado.
  2. Haz clic en Configuración del administrador.
  3. Copia la cadena del ID de la organización desde el cuadro de información correspondiente y envíala al desarrollador.

Requisitos adicionales para las apps privadas

En el caso de las apps privadas, el desarrollador también debe agregar el ID de la organización de cada empresa participante en la pestaña Google Play administrado de la página Configuración avanzada de la app. Para obtener instrucciones, consulta Publica una app privada.

Cómo distribuir segmentos cerrados a los usuarios

Para recuperar una lista de segmentos disponibles para una empresa para una app especificada, llama a Products.get. La lista appTracks[] que se incluye en la respuesta incluye los segmentos disponibles para cada app. appTracks[].trackAlias es un nombre legible por el usuario para el segmento que puedes mostrar en tu consola de EMM, y appTracks[].trackId es el ID legible por máquinas para el segmento.

Para otorgarle visibilidad a un usuario del segmento cerrado de una app, establece el policy.productPolicy[].trackIds[] en el policy de Device. Si hay varios segmentos disponibles para un dispositivo, se instalará la versión disponible con el código de versión más alto.

Los trackIds se quitarán automáticamente de la llamada a Products.get en ciertas situaciones, como las siguientes:

  • La versión de la app del segmento se promociona a otro segmento o a producción.
  • La versión de producción se actualiza con una versión superior a la del segmento.
  • Un desarrollador detiene el segmento.

Haz un seguimiento de las licencias de apps pagadas

En el caso de las apps pagadas, el objeto Grouplicenses realiza un seguimiento de cuántas licencias posee una empresa y cuántas están en uso. Puedes llamar a Grouplicenses.get para obtener los detalles de la licencia de una app.

Para que se pueda instalar una app pagada en un dispositivo, la empresa debe tener una licencia disponible para la app. Si hay una licencia disponible, la app se instala en el dispositivo y se crea un objeto Entitlements. Un objeto Entitlements vincula una licencia con un usuario y reduce el recuento de licencias disponibles para la app. Si no hay licencias disponibles, la instalación de la app falla y no se crea ningún objeto Entitlements.

Las aplicaciones que se distribuyen sin cargo no usan objetos Grouplicenses ni Entitlements.