Distribuir apps

A API Google Play EMM oferece suporte aos seguintes métodos de distribuição para apps públicos e particulares:

Instalar apps manualmente na Google Play Store gerenciada

É possível definir quais apps estão disponíveis para instalação no policy do Device e ativá-lo chamando Devices.update. Ao provisionar um novo dispositivo, defina a política antes de adicionar a Conta do Google Play gerenciada ao dispositivo. Caso contrário, a política não será aplicada por um curto período após a adição da conta ao dispositivo.

O comportamento da Play Store gerenciada é definido pelo valor de policy.productAvailabilityPolicy:

  • all: todos os apps públicos da Play Store estão disponíveis.
  • whitelist: apenas os apps listados em policy.productPolicy estão disponíveis.

Em ambos os casos, todos os apps em policy.productPolicy são adicionados por padrão ao layout da loja da empresa. O layout da loja da empresa é a página inicial da Play Store gerenciada quando whitelist é selecionado e pode ser acessado em uma guia "Apps de trabalho" quando all é selecionado. Você pode permitir que o cliente personalize o layout da loja da empresa incorporando o iframe do Google Play gerenciado (consulte Organizar apps com o iframe do Google Play gerenciado).

Instalar apps remotamente nos dispositivos dos usuários

Para instalar remotamente (também chamado de instalação push) um app no dispositivo de um usuário, defina policy.productPolicy.autoInstallPolicy na policy do Device. Ao provisionar um novo dispositivo, defina a política antes de adicionar a Conta do Google Play gerenciada ao dispositivo. Caso contrário, a política não será aplicada por um curto período após a adição da conta ao dispositivo.

O autoInstallMode pode ser definido como:

  • doNotAutoInstall: o app não é instalado automaticamente.
  • autoInstallOnce: o app é instalado automaticamente uma vez. Se o usuário desinstalar o app, ele não será instalado novamente.
  • forceAutoInstall: o app é instalado automaticamente. Se o usuário desinstalar o app, ele será instalado novamente. Em dispositivos gerenciados, o DPC bloqueia a desinstalação usando DevicePolicyManager.setUninstallBlocked.

Em caso de falha (perda de conectividade, falta de armazenamento etc.), as instalações são tentadas novamente automaticamente até serem concluídas. Uma estratégia de repetição de espera exponencial é aplicada para evitar o desperdício de bateria e dados em caso de falhas irrecuperáveis.

Prioridade de instalação

É possível escolher a ordem das instalações definindo autoInstallPriority. A prioridade precisa ser um número inteiro não assinado, e o valor padrão é 0. Os apps serão instalados em ordem ou prioridade crescente, ou seja, os apps com o valor de prioridade mais baixo serão instalados primeiro.

Instalar restrições

É possível definir restrições de instalação para cada app definindo um autoInstallConstraint, permitindo controlar o estado necessário do dispositivo durante a instalação:

  • se o dispositivo precisa estar conectado a uma rede Wi-Fi,
  • se o dispositivo precisa ser carregado,
  • e se o dispositivo precisa estar ocioso (não usado ativamente pelo usuário).

Se as restrições não forem atendidas imediatamente, as instalações afetadas serão colocadas em fila até que as restrições sejam atendidas.

Em um autoInstallConstraint, a regra AND é aplicada entre os campos. Por exemplo, com a autoInstallConstraint a seguir, o dispositivo precisa estar carregando e conectado a uma rede ilimitada (por exemplo, Wi-Fi) para que o app seja instalado:

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

Instalar apps automaticamente em dispositivos provisionados recentemente

A API EMM do Google Play envia uma notificação NewDeviceEvent quando um dispositivo é provisionado pela primeira vez. Para instalar apps automaticamente em dispositivos recém-provisionados, detecte notificações NewDeviceEvent. Em cada NewDeviceEvent, extraia o userId e o deviceId e chame Devices.update para definir a política para esse dispositivo.

Para saber como se inscrever nas notificações do EMM, consulte Configurar notificações do EMM.

Feedback sobre erros de instalação automática de apps

Os erros relacionados à instalação do app são informados pelo Feedback do app, e o DPC pode monitorar a mensagem EnterprisePolicyStatus enviada pelo KeyedAppStatesService.

Para decodificar os dados codificados em Base64, o DPC precisa gerar classes com base na definição de proto de EnterprisePolicyStatus. Consulte a documentação do Protocol Buffers para instruções sobre como gerar classes proto.

Com as classes geradas, o DPC pode decodificar o objeto EnterprisePolicyStatus:

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

A política do dispositivo agora inclui o novo campo opcional PolicyId. Ao criar ou atualizar uma política, o EMM pode definir o PolicyId como qualquer valor de string para identificar uma versão específica da Política de dispositivo.

Se disponível, o feedback de instalação do app vai informar o PolicyId para que o DPC possa corresponder os erros recebidos a 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;
}

Distribuir apps para testes fechados

Os testes fechados permitem que os desenvolvedores de apps recebam feedback de usuários confiáveis sobre versões iniciais do app. Os desenvolvedores podem configurar testes fechados no Google Play Console. Você usa a API Play EMM para permitir que administradores de TI distribuam versões fechadas (também chamadas de faixas) de apps para usuários específicos. Seus clientes empresariais podem usar esse recurso para testar não apenas apps de terceiros, mas também apps privados desenvolvidos internamente.

Apps qualificados

Antes que um desenvolvedor adicione uma empresa à lista de testadores fechados de um app, ele precisa atender aos seguintes critérios:

  • Uma versão de produção do app é publicada no Google Play.
  • No Google Play Console, a opção Google Play gerenciado está ativada na página Configurações avançadas do app.
  • Todas as versões fechadas do app atendem aos requisitos do código de versão.

Adicionar uma empresa aos testes fechados

Os desenvolvedores de apps podem adicionar empresas a testes que usam os métodos Teste Alfa fechado ou Teste Alfa com os Grupos do Google. Para ver instruções, consulte o guia sobre como configurar um teste aberto, fechado ou interno. O desenvolvedor precisa inserir o ID da organização (também chamado de ID da empresa) de cada empresa participante. Os administradores de TI podem fornecer o ID da organização a desenvolvedores de apps de terceiros seguindo estas etapas:

  1. Faça login na Google Play Store gerenciada.
  2. Clique em Configurações de administrador.
  3. Copie a string do ID da organização na caixa de informações correspondente e envie-a para o desenvolvedor.

Requisitos extras para apps privados

Para apps particulares, o desenvolvedor também precisa adicionar o ID da organização de cada empresa participante na guia Google Play gerenciado da página "Configurações avançadas" do app. Confira as instruções em Publicar um app particular.

Distribuir faixas fechadas para os usuários

Para recuperar uma lista de faixas disponíveis para uma empresa em um app especificado, chame Products.get. A lista appTracks[] contida na resposta inclui as faixas disponíveis para cada app. O appTracks[].trackAlias é um nome legível pelo usuário para a faixa que pode ser exibida no console de EMM, e o appTracks[].trackId é o ID legível por máquina da faixa.

Para conceder a um usuário a visibilidade de uma faixa fechada de um app, defina o policy.productPolicy[].trackIds[] no policy do Device. Se várias faixas estiverem disponíveis para um dispositivo, a versão disponível com o código de versão mais alto será instalada.

Os trackIds são removidos automaticamente da chamada Products.get em determinados cenários, como estes:

  • A versão do app da faixa é promovida para outra faixa ou para a produção.
  • A versão de produção é atualizada com uma versão mais recente do que a faixa.
  • Um desenvolvedor para a faixa.

Acompanhar as licenças pagas de apps

Para apps pagos, o objeto Grouplicenses rastreia quantas licenças uma empresa tem e quantas estão em uso. Você pode chamar Grouplicenses.get para conferir os detalhes da licença de um app.

Antes que um app pago possa ser instalado em um dispositivo, a empresa precisa ter uma licença disponível para ele. Se uma licença estiver disponível, o app será instalado no dispositivo e um objeto Entitlements será criado. Um objeto Entitlements vincula uma licença a um usuário e diminui a contagem de licenças disponíveis para o app. Se não houver licenças disponíveis, a instalação do app falhará e nenhum objeto Entitlements será criado.

Os objetos Grouplicenses e Entitlements não são usados por aplicativos distribuídos sem custo financeiro.