Distribuisci app

L'API EMM di Google Play supporta i seguenti metodi di distribuzione per le app pubbliche e private:

Installare manualmente le app dal Google Play Store gestito

Puoi definire quali app sono disponibili per l'installazione da parte di un utente nel policy di Device e impostarlo chiamando Devices.update. Quando esegui il provisioning di un nuovo dispositivo, devi impostare il criterio prima di aggiungere l'account Google Play gestito al dispositivo, altrimenti il criterio non verrà applicato per un breve periodo di tempo dopo l'aggiunta dell'account al dispositivo.

Il comportamento della versione gestita del Play Store è definito dal valore di policy.productAvailabilityPolicy:

  • all: sono disponibili tutte le app pubbliche del Play Store.
  • whitelist: sono disponibili solo le app elencate in policy.productPolicy.

In entrambi i casi, tutte le app in policy.productPolicy vengono aggiunte per impostazione predefinita al layout dello Store dell'azienda. Il layout dello Store dell'azienda è la home page del Play Store gestito quando è selezionato whitelist e può essere visualizzato in una scheda "App di lavoro" quando è selezionato all. Puoi consentire al cliente di personalizzare il layout dello Store dell'azienda incorporando l'iframe della versione gestita di Google Play (vedi Organizzare le app con l'iframe della versione gestita di Google Play).

Installare le app da remoto sui dispositivi degli utenti

Per installare da remoto (chiamata anche installazione push) un'app sul dispositivo di un utente, imposta policy.productPolicy.autoInstallPolicy in policy di Device. Quando esegui il provisioning di un nuovo dispositivo, devi impostare il criterio prima di aggiungere l'account Google Play gestito al dispositivo, altrimenti il criterio non verrà applicato per un breve periodo di tempo dopo l'aggiunta dell'account al dispositivo.

autoInstallMode può essere impostato su:

  • doNotAutoInstall: l'app non viene installata automaticamente.
  • autoInstallOnce: l'app viene installata automaticamente una volta. Se l'utente la disinstalla, non verrà reinstallata.
  • forceAutoInstall: l'app viene installata automaticamente. Se l'utente la disinstalla, verrà reinstallata. Sui dispositivi gestiti, il DPC deve bloccare la disinstallazione utilizzando DevicePolicyManager.setUninstallBlocked.

In caso di errore (perdita di connettività, mancanza di spazio di archiviazione e così via), le installazioni vengono ripetute automaticamente finché non riescono. Viene applicata una strategia di ripetizione con backoff esponenziale per evitare di sprecare batteria e dati in caso di errori irrecuperabili.

Priorità di installazione

Puoi scegliere l'ordine delle installazioni impostando autoInstallPriority. La priorità deve essere un numero intero non firmato e il valore predefinito è 0. Le app verranno installate in ordine crescente o in base alla priorità, il che significa che le app con il valore di priorità più basso verranno installate per prime.

Installare vincoli

Puoi impostare vincoli di installazione per ogni app impostando un autoInstallConstraint, in modo da controllare lo stato richiesto del dispositivo durante l'installazione:

  • se il dispositivo deve essere connesso a una rete Wi-Fi.
  • se il dispositivo dovrebbe essere in carica,
  • e se il dispositivo deve essere inattivo (non in uso dall'utente).

Se i vincoli non vengono soddisfatti immediatamente, le installazioni interessate verranno messe in coda fino a quando non verranno soddisfatti.

In un autoInstallConstraint, la regola AND viene applicata tra i campi. Ad esempio, con il seguente autoInstallConstraint, il dispositivo deve essere in carica e connesso a una rete senza limiti di traffico (ad es. Wi-Fi) per l'installazione dell'app:

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

Installare automaticamente le app sui dispositivi appena provisionati

L'API Google Play EMM invia una notifica NewDeviceEvent al primo provisioning di un dispositivo. Per installare automaticamente le app sui dispositivi appena provisionati, attendi le notifiche NewDeviceEvent. Da ogni NewDeviceEvent, recupera userId e deviceId, quindi chiama Devices.update per impostare il criterio per il dispositivo.

Per scoprire come iscriverti alle notifiche EMM, consulta Configurare le notifiche EMM.

Feedback sugli errori di installazione automatica delle app

Gli errori relativi all'installazione delle app vengono segnalati tramite Feedback app e il DPC può monitorare il messaggio EnterprisePolicyStatus inviato tramite KeyedAppStatesService.

Per decodificare i dati con codifica Base64, il DPC deve generare classi in base alla definizione di proto di EnterprisePolicyStatus. Consulta la documentazione di Protocol Buffers per istruzioni su come generare classi proto.

Con le classi generate, il DPC può decodificare l'oggetto EnterprisePolicyStatus:

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

Le norme del dispositivo ora includono il nuovo campo facoltativo PolicyId. Quando crea o aggiorna un criterio, l'EMM può impostare PolicyId su qualsiasi valore di stringa per identificare una versione specifica del criterio del dispositivo.

Se disponibile, il feedback sull'installazione dell'app segnalerà PolicyId in modo che il DPC possa associare gli errori ricevuti a criteri specifici.

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;
}

Distribuire app per i test chiusi

I test chiusi consentono agli sviluppatori di app di ricevere feedback sulle versioni in anteprima della loro app da utenti attendibili. Gli sviluppatori possono configurare i test chiusi in Google Play Console. L'API Play EMM consente agli amministratori IT di distribuire versioni chiuse (chiamate anche canali) di app a utenti specifici. I tuoi clienti aziendali possono utilizzare questa funzionalità non solo per testare le app di terze parti, ma anche per testare le app private sviluppate internamente.

App idonee

Prima che uno sviluppatore aggiunga un'azienda all'elenco di tester chiusi di un'app, l'app deve soddisfare i seguenti criteri:

  • Una versione di produzione dell'app è pubblicata su Google Play.
  • In Google Play Console, Google Play gestito è attivato nella pagina Impostazioni avanzate dell'app.
  • Tutte le versioni chiuse dell'app soddisfano i requisiti per i codici di versione.

Aggiungere un'azienda ai test chiusi

Gli sviluppatori di app possono aggiungere aziende ai test che utilizzano i metodi Alpha test chiuso o Alpha test utilizzando gruppi Google. Per istruzioni, consulta la guida su come configurare un test aperto, chiuso o interno. Lo sviluppatore deve inserire l'ID organizzazione (chiamato anche ID azienda) di ogni azienda partecipante. Gli amministratori IT possono fornire l'ID della loro organizzazione agli sviluppatori di app di terze parti seguendo questi passaggi:

  1. Accedi alla versione gestita di Google Play Store.
  2. Fai clic su Impostazioni amministratore.
  3. Copia la stringa ID organizzazione dalla casella Informazioni sull'organizzazione e inviala allo sviluppatore.

Requisiti aggiuntivi per le app private

Per le app private, lo sviluppatore deve anche aggiungere l'ID organizzazione di ogni impresa partecipante nella scheda Versione gestita di Google Play della pagina Impostazioni avanzate dell'app. Per le istruzioni, consulta Pubblicare un'app privata.

Distribuire tracce chiuse agli utenti

Per recuperare un elenco di canali disponibili per un'azienda per un'app specifica, chiama Products.get. L'elenco appTracks[] contenuto nella risposta include i canali disponibili per ogni app. appTracks[].trackAlias è un nome del canale leggibile dall'utente che puoi visualizzare nella console EMM e appTracks[].trackId è l'ID leggibile dalla macchina per il canale.

Per concedere a un utente la visibilità del canale chiuso di un'app, imposta policy.productPolicy[].trackIds[] in policy di Device. Se per un dispositivo sono disponibili più canali, verrà installata la versione con il codice più alto.

I trackId verranno rimossi automaticamente dalla chiamata Products.get in determinati scenari, ad esempio:

  • La versione dell'app del canale viene promossa a un altro canale o alla produzione.
  • La versione di produzione è aggiornata con una versione successiva a quella del canale.
  • Uno sviluppatore interrompe il canale.

Tenere traccia delle licenze delle app a pagamento

Per le app a pagamento, l'oggetto Grouplicenses tiene traccia del numero di licenze di proprietà di un'azienda e di quante sono in uso. Puoi chiamare Grouplicenses.get per ottenere i dettagli della licenza di un'app.

Prima che un'app a pagamento possa essere installata su un dispositivo, l'azienda deve disporre di una licenza per l'app. Se è disponibile una licenza, l'app viene installata sul dispositivo e viene creato un oggetto Entitlements. Un oggetto Entitlements collega una licenza a un utente e decrementa il numero di licenze disponibili per l'app. Se non sono disponibili licenze, l'installazione dell'app non riesce e non viene creato alcun oggetto Entitlements.

Gli oggetti Grouplicenses e Entitlements non vengono utilizzati dalle applicazioni distribuite senza costi.