A API Google Play EMM oferece suporte aos seguintes métodos de distribuição para apps públicos e particulares:
- Os usuários podem instalar manualmente apps da Google Play Store gerenciada.
- Os administradores de TI podem instalar remotamente apps nos dispositivos dos usuários.
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 empolicy.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 usandoDevicePolicyManager.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:
- Faça login na Google Play Store gerenciada.
- Clique em Configurações de administrador.
- 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.