アプリの配信

Google Play EMM API は、公開アプリと限定公開アプリの次の配信方法をサポートしています。

管理対象の Google Play ストアからアプリを手動でインストールする

ユーザーがインストールできるアプリを Devicepolicy で定義し、Devices.update を呼び出して設定できます。新しいデバイスをプロビジョニングする場合は、管理対象の Google Play アカウントをデバイスに追加する前にポリシーを設定する必要があります。設定しない場合、アカウントをデバイスに追加した後、しばらくの間ポリシーが適用されません。

managed Play ストアの動作は、policy.productAvailabilityPolicy の値で定義されます。

  • all: Google Play ストアで公開されているすべてのアプリを使用できます。
  • whitelist: policy.productPolicy にリストされているアプリのみを使用できます。

どちらの場合も、policy.productPolicy 内のすべてのアプリはデフォルトで企業のストア レイアウトに追加されます。企業のストアのレイアウトは、whitelist が選択されている場合は managed Google Play ストアのホームページで、all が選択されている場合は [ビジネス用] タブでアクセスできます。managed Google Play iframe を埋め込むことで、お客様がエンタープライズのストアのレイアウトをカスタマイズできるようにできます(managed Google Play iframe を使用してアプリを整理するをご覧ください)。

ユーザーのデバイスにアプリをリモートでインストールする

ユーザーのデバイスにアプリをリモートでインストール(プッシュ インストール)するには、Devicepolicypolicy.productPolicy.autoInstallPolicy を設定します。新しいデバイスをプロビジョニングする場合は、管理対象の Google Play アカウントをデバイスに追加する前にポリシーを設定する必要があります。設定しない場合、アカウントをデバイスに追加した後、しばらくの間ポリシーが適用されません。

autoInstallMode は次のように設定できます。

  • doNotAutoInstall: アプリは自動的にインストールされません。
  • autoInstallOnce: アプリは 1 回自動的にインストールされます。ユーザーがアプリをアンインストールした場合、アプリは再インストールされません。
  • forceAutoInstall: アプリは自動的にインストールされます。ユーザーがアプリをアンインストールしても、再びインストールされます。管理対象デバイスでは、DPC は DevicePolicyManager.setUninstallBlocked を使用してアンインストールをブロックする必要があります。

失敗した場合(接続の切断、ストレージ不足など)、インストールは成功するまで自動的に再試行されます。回復不能な障害が発生した場合にバッテリーとデータを浪費しないように、指数バックオフの再試行戦略が適用されます。

インストールの優先度

autoInstallPriority を設定することで、インストール順序を選択できます。優先度は符号なし整数で、デフォルト値は 0 です。アプリは優先度の高い順にインストールされます。つまり、優先度値の低いアプリが先にインストールされます。

制約をインストールする

autoInstallConstraint を設定することで、各アプリのインストール制約を設定できます。これにより、インストール中のデバイスの必要な状態を制御できます。

  • デバイスを Wi-Fi ネットワークに接続する必要があるかどうか、
  • デバイスが充電されているかどうか、
  • デバイスがアイドル状態(ユーザーが操作していない状態)である必要があるかどうか。

制約がすぐに満たされない場合、制約が満たされるまで、影響を受けるインストールはキューに追加されます。

autoInstallConstraint では、フィールド間に AND ルールが適用されます。たとえば、次の autoInstallConstraint では、アプリをインストールするには、デバイスが充電中であり、定額制のネットワーク(Wi-Fi など)に接続されている必要があります。

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

新しくプロビジョニングされたデバイスにアプリを自動インストールする

Google Play EMM API は、デバイスが最初にプロビジョニングされたときに NewDeviceEvent 通知を送信します。新しくプロビジョニングされたデバイスにアプリを自動的にプッシュ インストールするには、NewDeviceEvent 通知をリッスンします。各 NewDeviceEvent から userIddeviceId を取得し、Devices.update を呼び出してそのデバイスのポリシーを設定します。

EMM 通知をサブスクライブする方法については、EMM 通知を設定するをご覧ください。

アプリの自動インストール エラーに関するフィードバック

アプリのインストールに関連するエラーは アプリのフィードバックを通じて報告されます。DPC は、KeyedAppStatesService を介して送信された EnterprisePolicyStatus メッセージをモニタリングできます。

Base64 でエンコードされたデータをデコードするには、DPC は EnterprisePolicyStatus のプロト定義に基づいてクラスを生成する必要があります。proto クラスの生成手順については、プロトコル バッファのドキュメントをご覧ください。

生成されたクラスを使用すると、DPC は EnterprisePolicyStatus オブジェクトをデコードできます。

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

デバイス ポリシーに、新しいオプション フィールド PolicyId が追加されました。ポリシーを作成または更新するときに、EMM は PolicyId を任意の文字列値に設定して、特定のデバイス ポリシー バージョンを識別できます。

利用可能な場合、アプリのインストール フィードバックは PolicyId を報告します。これにより、DPC は受信したエラーを特定のポリシーと照合できます。

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

クローズド テスト用にアプリを配布する

クローズド テストでは、アプリのデベロッパーが信頼できるユーザーからアプリの初期バージョンに関するフィードバックを得ることができます。デベロッパーは Google Play Console でクローズド テストを設定できます。Play EMM API を使用すると、IT 管理者はアプリのクローズド バージョン(トラックとも呼ばれます)を特定のユーザーに配布できます。企業のお客様は、この機能を使用してサードパーティ製アプリをテストするだけでなく、社内で開発した限定公開アプリをテストすることもできます。

対象アプリ

デベロッパーがアプリのクローズド テスターのリストに企業を追加する前に、アプリは次の条件を満たしている必要があります。

  • アプリの本番環境バージョンが Google Play で公開されている。
  • Google Play Console で、アプリの [詳細設定] ページで [管理対象の Google Play] が有効になっている。
  • アプリのクローズド バージョンがバージョン コードの要件を満たしている。

クローズド テストに企業を追加する

アプリ デベロッパーは、クローズド アルファ版テストまたはGoogle グループを使用したアルファ版テストの方法で、テストに企業を追加できます。手順については、オープンテスト版、クローズド テスト版、内部テスト版をセットアップする方法のガイドをご覧ください。デベロッパーは、参加する各企業の組織 ID(エンタープライズ ID)を入力する必要があります。IT 管理者は、次の手順に沿って組織の ID をサードパーティ製アプリのデベロッパーに提供できます。

  1. managed Google Play ストアにログインします。
  2. [管理者設定] をクリックします。
  3. [組織の情報] 欄から組織 ID の文字列をコピーし、デベロッパーに送信します。

限定公開アプリの追加要件

限定公開アプリの場合、デベロッパーはアプリの [詳細設定] ページの [managed Google Play] タブに、参加する各企業の組織 ID を追加する必要があります。手順については、限定公開アプリを公開するをご覧ください。

クローズド トラックをユーザーに配布する

指定したアプリで企業が利用できるトラックのリストを取得するには、Products.get を呼び出します。レスポンスに含まれる appTracks[] リストには、各アプリで使用可能なトラックが含まれます。appTracks[].trackAlias は、EMM コンソールで表示できるトラックのユーザー読み取り可能な名前で、appTracks[].trackId はトラックの機械読み取り可能な ID です。

アプリのクローズド トラックをユーザーに公開するには、Devicepolicypolicy.productPolicy[].trackIds[] を設定します。デバイスで複数のトラックが利用可能な場合は、利用可能なバージョンの中でバージョン コードが最も高いバージョンがインストールされます。

次のシナリオなど、特定のシナリオでは、trackIds が Products.get 呼び出しから自動的に削除されます。

  • トラックのアプリ バージョンが別のトラックまたは製品版に昇格している。
  • 製品版がトラックよりも高いバージョンに更新されている。
  • デベロッパーがトラックを停止します。

有料アプリのライセンスを管理する

有料アプリの場合、Grouplicenses オブジェクトは、企業が所有するライセンス数と使用中のライセンス数を追跡します。Grouplicenses.get を呼び出すと、アプリのライセンスの詳細を取得できます。

有料アプリをデバイスにインストールするには、企業がそのアプリのライセンスを利用できる必要があります。ライセンスが利用可能な場合、アプリはデバイスにインストールされ、Entitlements オブジェクトが作成されます。Entitlements オブジェクトは、ライセンスをユーザーにリンクし、アプリで利用可能なライセンス数を減らします。利用可能なライセンスがない場合、アプリのインストールは失敗し、Entitlements オブジェクトは作成されません。

Grouplicenses オブジェクトと Entitlements オブジェクトは、無料で配布されるアプリでは使用されません。