Распространять приложения, Распространять приложения

Google Play EMM API поддерживает следующие методы распространения общедоступных и частных приложений:

Установите приложения вручную из управляемого магазина Google Play.

Вы можете определить, какие приложения доступны пользователю для установки, в policy Device и настроить их, вызвав Devices.update . При подготовке нового устройства вам следует установить политику до добавления управляемой учетной записи Google Play на устройство, в противном случае политика не будет применяться в течение короткого периода времени после добавления учетной записи на устройство.

Поведение управляемого Play Store определяется значением policy.productAvailabilityPolicy :

  • all : доступны все общедоступные приложения из Play Store.
  • whitelist : доступны только приложения, перечисленные в policy.productPolicy .

В обоих случаях все приложения в policy.productPolicy по умолчанию добавляются в макет корпоративного магазина. Макет корпоративного магазина — это домашняя страница управляемого магазина Play Store, если выбран whitelist , и доступ к нему можно получить на вкладке «Рабочие приложения», если выбраны all . Вы можете разрешить своему клиенту настраивать макет корпоративного магазина, встроив управляемый iframe Google Play (см. раздел Организация приложений с помощью управляемого iframe Google Play ).

Удаленно устанавливать приложения на устройства пользователей

Чтобы удаленно установить (также называемую принудительной установкой) приложение на устройстве пользователя, установите policy.productPolicy.autoInstallPolicy в policy Device . При подготовке нового устройства вам следует установить политику перед добавлением управляемой учетной записи Google Play на устройство, иначе политика не будет применяться в течение короткого периода времени после добавления учетной записи на устройство.

Для autoInstallMode можно установить:

  • doNotAutoInstall : приложение не устанавливается автоматически.
  • autoInstallOnce : приложение автоматически устанавливается один раз. Если пользователь удалит приложение, оно не будет установлено снова.
  • forceAutoInstall : приложение устанавливается автоматически. Если пользователь удаляет приложение, оно будет установлено снова. На управляемых устройствах ЦОД должен блокировать удаление с помощью DevicePolicyManager.setUninstallBlocked .

В случае сбоя (потеря подключения, нехватка места для хранения и т. д.) установка повторяется автоматически до тех пор, пока она не завершится успешно. Применяется стратегия экспоненциальной отсрочки повторных попыток, чтобы избежать потери заряда батареи и данных в случае неисправимых сбоев.

Приоритет установки

Вы можете выбрать порядок установок, установив autoInstallPriority . Приоритет должен быть целым числом без знака, а значение по умолчанию — 0. Приложения будут устанавливаться в порядке возрастания приоритета, то есть приложения с более низким значением приоритета будут установлены первыми.

Установить ограничения

Вы можете установить ограничения установки для каждого приложения, установив autoInstallConstraint , что позволит вам контролировать необходимое состояние устройства во время установки:

  • должно ли устройство быть подключено к сети Wi-Fi,
  • должно ли устройство заряжаться,
  • и должно ли устройство простаивать (не использоваться активно пользователем).

Если ограничения не будут выполнены немедленно, затронутые установки будут поставлены в очередь до тех пор, пока ограничения не будут выполнены.

В autoInstallConstraint между полями применяется правило AND. Например, при использовании следующего autoInstallConstraint устройство должно одновременно заряжаться и быть подключено к сети без ограничений (например, Wi-Fi), чтобы приложение могло быть установлено:

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

Автоматическая установка приложений на вновь подготовленных устройствах

API EMM Google Play отправляет уведомление NewDeviceEvent при первой подготовке устройства. Чтобы автоматически устанавливать приложения на вновь подготовленные устройства, прослушивайте уведомления NewDeviceEvent . Из каждого NewDeviceEvent получите userId и deviceId , а затем вызовите Devices.update чтобы установить политику для этого устройства.

Чтобы узнать, как подписаться на уведомления EMM, см. Настройка уведомлений EMM .

Отзыв об ошибке автоматической установки приложения

Об ошибках, связанных с установкой приложения, сообщается через App Feedback , а ЦОД может отслеживать сообщение EnterprisePolicyStatus отправленное через KeyedAppStatesService .

Чтобы декодировать данные в кодировке Base64, ЦОД должен создать классы на основе прототипа определения EnterprisePolicyStatus . Инструкции по созданию прототипов классов см. в документации по протокольным буферам .

С помощью сгенерированных классов ЦОД может декодировать объект EnterprisePolicyStatus :

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

Политика устройства теперь включает новое необязательное поле PolicyId . При создании или обновлении политики EMM может установить для PolicyId любое строковое значение, чтобы идентифицировать конкретную версию политики устройства .

Если доступно, отзыв об установке приложения сообщит PolicyId , чтобы центр обработки данных мог сопоставить полученные ошибки с конкретными политиками.

Статус корпоративной политики

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

Статус приложения

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

Статус автоустановки

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

Версия политики

// 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. Вы используете Play EMM API, чтобы позволить ИТ-администраторам распространять закрытые версии (также называемые треками) приложений определенным пользователям. Ваши корпоративные клиенты могут использовать эту функцию не только для тестирования сторонних приложений, но и для тестирования частных приложений, разработанных собственными силами.

Подходящие приложения

Прежде чем разработчик добавит предприятие в список закрытых тестировщиков приложения, приложение должно соответствовать следующим критериям:

  • Рабочая версия приложения опубликована в Google Play.
  • В консоли Google Play управляемый Google Play включен на странице дополнительных настроек приложения.
  • Любые закрытые версии приложения соответствуют требованиям к коду версии .

Добавить предприятие в закрытые тесты

Разработчики приложений могут добавлять предприятия в тесты, использующие методы закрытого альфа-тестирования или альфа-тестирования с использованием групп Google . Инструкции см. в руководстве по настройке открытого, закрытого или внутреннего теста . Разработчику необходимо ввести идентификатор организации (также называемый идентификатором предприятия ) каждого участвующего предприятия. ИТ-администраторы могут предоставить идентификатор своей организации сторонним разработчикам приложений, выполнив следующие действия:

  1. Войдите в управляемый магазин Google Play .
  2. Нажмите «Настройки администратора» .
  3. Скопируйте строку идентификатора организации из поля информации об организации и отправьте ее разработчику.

Дополнительные требования для частных приложений

Для частных приложений разработчику также необходимо добавить идентификатор организации каждого участвующего предприятия на вкладке «Управляемый Google Play» на странице «Дополнительные настройки» приложения. Инструкции см. в разделе Публикация частного приложения .

Раздавать закрытые треки пользователям

Чтобы получить список треков, доступных предприятию для указанного приложения, вызовите Products.get . Список appTracks[] , содержащийся в ответе, включает треки, доступные для каждого приложения. appTracks[].trackAlias ​​— это читаемое пользователем имя трека, которое можно отобразить в консоли EMM, а appTracks[].trackId — это машиночитаемый идентификатор трека.

Чтобы предоставить пользователю видимость закрытой версии приложения, установите policy.productPolicy[].trackIds[] в policy Device . Если для устройства доступно несколько дорожек, будет установлена ​​доступная версия с самым высоким кодом версии.

TrackIds будут автоматически удалены из вызова Products.get в определенных сценариях, например в следующих:

  • APK-файл трека переносится на другой трек или в производство.
  • Производственная версия обновлена ​​до более высокой версии, чем трек.
  • Застройщик останавливает путь.

Отслеживайте лицензии платных приложений

Для платных приложений объект Grouplicenses отслеживает, сколько лицензий принадлежит предприятию и сколько лицензий используется. Вы можете позвонить на Grouplicenses.get , чтобы получить сведения о лицензии для приложения.

Прежде чем платное приложение можно будет установить на устройство, предприятию необходимо иметь лицензию на это приложение. Если лицензия доступна, приложение устанавливается на устройство и создается объект Entitlements . Объект Entitlements связывает лицензию с пользователем и уменьшает количество доступных лицензий для приложения. Если доступных лицензий нет, установка приложения завершается неудачей и объект Entitlements не создается.

Объекты Grouplicenses и Entitlements не используются приложениями, которые распространяются бесплатно.

,

Google Play EMM API поддерживает следующие методы распространения общедоступных и частных приложений:

Установите приложения вручную из управляемого магазина Google Play.

Вы можете определить, какие приложения доступны пользователю для установки, в policy Device и настроить их, вызвав Devices.update . При подготовке нового устройства вам следует установить политику до добавления управляемой учетной записи Google Play на устройство, иначе политика не будет применяться в течение короткого периода времени после добавления учетной записи на устройство.

Поведение управляемого Play Store определяется значением policy.productAvailabilityPolicy :

  • all : доступны все общедоступные приложения из Play Store.
  • whitelist : доступны только приложения, перечисленные в policy.productPolicy .

В обоих случаях все приложения в policy.productPolicy по умолчанию добавляются в макет корпоративного магазина. Макет корпоративного магазина — это домашняя страница управляемого магазина Play Store, если выбран whitelist , и доступ к нему можно получить на вкладке «Рабочие приложения», если выбраны all . Вы можете разрешить своему клиенту настраивать макет корпоративного магазина, встроив управляемый iframe Google Play (см. раздел Организация приложений с помощью управляемого iframe Google Play ).

Удаленно устанавливать приложения на устройства пользователей

Чтобы удаленно установить (также называемую принудительной установкой) приложение на устройстве пользователя, установите policy.productPolicy.autoInstallPolicy в policy Device . При подготовке нового устройства вам следует установить политику до добавления управляемой учетной записи Google Play на устройство, в противном случае политика не будет применяться в течение короткого периода времени после добавления учетной записи на устройство.

Для autoInstallMode можно установить:

  • doNotAutoInstall : приложение не устанавливается автоматически.
  • autoInstallOnce : приложение автоматически устанавливается один раз; если пользователь удаляет приложение, оно не будет установлено снова.
  • forceAutoInstall : приложение устанавливается автоматически. Если пользователь удаляет приложение, оно будет установлено снова. На управляемых устройствах ЦОД должен блокировать удаление с помощью DevicePolicyManager.setUninstallBlocked .

В случае сбоя (потеря подключения, нехватка места для хранения и т. д.) установка повторяется автоматически до тех пор, пока она не завершится успешно. Применяется стратегия экспоненциальной отсрочки повторных попыток, чтобы избежать потери заряда батареи и данных в случае неисправимых сбоев.

Приоритет установки

Вы можете выбрать порядок установок, установив autoInstallPriority . Приоритет должен быть целым числом без знака, а значение по умолчанию — 0. Приложения будут устанавливаться в порядке возрастания приоритета, то есть приложения с более низким значением приоритета будут установлены первыми.

Установить ограничения

Вы можете установить ограничения установки для каждого приложения, установив autoInstallConstraint , что позволит вам контролировать необходимое состояние устройства во время установки:

  • должно ли устройство быть подключено к сети Wi-Fi,
  • должно ли устройство заряжаться,
  • и должно ли устройство простаивать (не использоваться активно пользователем).

Если ограничения не будут выполнены немедленно, затронутые установки будут поставлены в очередь до тех пор, пока ограничения не будут выполнены.

В autoInstallConstraint между полями применяется правило AND. Например, при использовании следующего autoInstallConstraint устройство должно одновременно заряжаться и быть подключено к сети без ограничений (например, Wi-Fi), чтобы приложение могло быть установлено:

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

Автоматическая установка приложений на вновь подготовленных устройствах

API EMM Google Play отправляет уведомление NewDeviceEvent при первой подготовке устройства. Чтобы автоматически устанавливать приложения на вновь подготовленные устройства, прослушивайте уведомления NewDeviceEvent . Из каждого NewDeviceEvent получите userId и deviceId , а затем вызовите Devices.update чтобы установить политику для этого устройства.

Чтобы узнать, как подписаться на уведомления EMM, см. Настройка уведомлений EMM .

Отзыв об ошибке автоматической установки приложения

Об ошибках, связанных с установкой приложения, сообщается через App Feedback , а ЦОД может отслеживать сообщение EnterprisePolicyStatus отправленное через KeyedAppStatesService .

Чтобы декодировать данные в кодировке Base64, ЦОД должен создать классы на основе прототипа определения EnterprisePolicyStatus . Инструкции по созданию прототипов классов см. в документации по протокольным буферам .

С помощью сгенерированных классов ЦОД может декодировать объект EnterprisePolicyStatus :

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

Политика устройства теперь включает новое необязательное поле PolicyId . При создании или обновлении политики EMM может установить для PolicyId любое строковое значение, чтобы идентифицировать конкретную версию политики устройства .

Если доступно, отзыв об установке приложения сообщит PolicyId , чтобы центр обработки данных мог сопоставить полученные ошибки с конкретными политиками.

Статус корпоративной политики

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

Статус приложения

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

Статус автоустановки

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

Версия политики

// 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. Вы используете Play EMM API, чтобы позволить ИТ-администраторам распространять закрытые версии (также называемые треками) приложений определенным пользователям. Ваши корпоративные клиенты могут использовать эту функцию не только для тестирования сторонних приложений, но и для тестирования частных приложений, разработанных собственными силами.

Подходящие приложения

Прежде чем разработчик добавит предприятие в список закрытых тестировщиков приложения, приложение должно соответствовать следующим критериям:

  • Рабочая версия приложения опубликована в Google Play.
  • В консоли Google Play управляемый Google Play включен на странице дополнительных настроек приложения.
  • Любые закрытые версии приложения соответствуют требованиям кода версии .

Добавить предприятие в закрытые тесты

Разработчики приложений могут добавлять предприятия в тесты, использующие методы закрытого альфа-тестирования или альфа-тестирования с использованием групп Google . Инструкции см. в руководстве по настройке открытого, закрытого или внутреннего теста . Разработчику необходимо ввести идентификатор организации (также называемый идентификатором предприятия ) каждого участвующего предприятия. ИТ-администраторы могут предоставить идентификатор своей организации сторонним разработчикам приложений, выполнив следующие действия:

  1. Войдите в управляемый магазин Google Play .
  2. Нажмите «Настройки администратора» .
  3. Скопируйте строку идентификатора организации из поля информации об организации и отправьте ее разработчику.

Дополнительные требования для частных приложений

Для частных приложений разработчику также необходимо добавить идентификатор организации каждого участвующего предприятия на вкладке «Управляемый Google Play» на странице «Дополнительные настройки» приложения. Инструкции см. в разделе Публикация частного приложения .

Раздавать закрытые треки пользователям

Чтобы получить список треков, доступных предприятию для указанного приложения, вызовите Products.get . Список appTracks[] , содержащийся в ответе, включает треки, доступные для каждого приложения. appTracks[].trackAlias ​​— это читаемое пользователем имя трека, которое можно отобразить в консоли EMM, а appTracks[].trackId — это машиночитаемый идентификатор трека.

Чтобы предоставить пользователю видимость закрытой версии приложения, установите policy.productPolicy[].trackIds[] в policy Device . Если для устройства доступно несколько дорожек, будет установлена ​​доступная версия с самым высоким кодом версии.

TrackIds будут автоматически удалены из вызова Products.get в определенных сценариях, например в следующих:

  • APK-файл трека переносится на другой трек или в производство.
  • Производственная версия обновлена ​​до более высокой версии, чем трек.
  • Застройщик останавливает путь.

Отслеживайте лицензии платных приложений

Для платных приложений объект Grouplicenses отслеживает, сколько лицензий принадлежит предприятию и сколько лицензий используется. Вы можете позвонить на Grouplicenses.get , чтобы получить сведения о лицензии для приложения.

Прежде чем платное приложение можно будет установить на устройство, предприятию необходимо иметь лицензию на это приложение. Если лицензия доступна, приложение устанавливается на устройство и создается объект Entitlements . Объект Entitlements связывает лицензию с пользователем и уменьшает количество доступных лицензий для приложения. Если доступных лицензий нет, установка приложения завершается неудачей и объект Entitlements не создается.

Объекты Grouplicenses и Entitlements не используются приложениями, которые распространяются бесплатно.