Это руководство помогает поставщикам услуг управления корпоративной мобильностью (EMM) интегрировать автоматическую регистрацию в свою консоль. Продолжайте читать, чтобы узнать больше о регистрации и ознакомиться с рекомендациями, которые помогут вашему DPC (контроллеру политики устройств) подготовить устройства. Если у вас есть ЦОД, вы изучите лучшие практики подготовки устройств и получите советы по разработке и тестированию.
Возможности для ИТ-администраторов
Используйте клиентский API, чтобы помочь ИТ-администраторам настроить автоматическую регистрацию прямо с вашей консоли. Вот некоторые задачи, которые ИТ-администратор может выполнить в вашей консоли:
- Создавайте, редактируйте и удаляйте конфигурации автоматической регистрации на основе ваших мобильных политик.
- Установите конфигурацию по умолчанию, чтобы ваш ЦОД подготавливал будущие устройства, которые приобретет организация.
- Применяйте индивидуальные конфигурации к устройствам или удаляйте устройства из автоматической регистрации.
Чтобы узнать больше о автоматической регистрации, прочитайте обзор .
Предварительные условия
Прежде чем добавлять автоматическую регистрацию в консоль EMM, убедитесь, что ваше решение поддерживает следующее:
- Ваше решение EMM должно предоставить принадлежащее компании устройство Android 8.0+ (Pixel 7.1+) в полностью управляемом режиме. Корпоративные устройства Android 10+ можно настроить как полностью управляемые или с рабочим профилем .
- Поскольку автоматическая регистрация автоматически загружает и устанавливает DPC, ваш DPC должен быть доступен в Google Play. Мы поддерживаем список совместимых ЦОД, которые ИТ-администраторы могут настроить с помощью клиентского API или портала. Отправьте запрос на изменение продукта через сообщество поставщиков EMM, чтобы добавить свой ЦОД в список.
- Вашим клиентам необходима учетная запись автоматической регистрации для вызова клиентского API. Торговый посредник-партнер настраивает учетную запись для организации ИТ-администратора, когда организация приобретает устройства.
- Устройство должно быть совместимо с Google Mobile Services (GMS), а службы Google Play должны быть всегда включены, чтобы автоматическая регистрация работала правильно.
Вызов API
Пользователи вашей консоли (используя свою учетную запись Google) авторизуют ваши запросы API к клиентскому API. Этот процесс отличается от процесса авторизации, который вы выполняете для других API EMM. Прочтите «Авторизация» , чтобы узнать, как это сделать в вашем приложении.
Обработка условий обслуживания
Вашим пользователям необходимо принять последнюю версию Условий обслуживания (ToS), прежде чем вызывать API. Если вызов API возвращает код состояния HTTP 403 Forbidden
, а текст ответа содержит TosError
, предложите пользователю принять Условия обслуживания, выполнив вход на портал автоматической регистрации. В примере ниже показан один из способов сделать это:
Ява
// Authorize this method call as a user that hasn't yet accepted the ToS. final String googleApiFormatHttpHeader = "X-GOOG-API-FORMAT-VERSION"; final String googleApiFormatVersion = "2"; final String tosErrorType = "type.googleapis.com/google.android.device.provisioning.v1.TosError"; try { // Send an API request to list all the DPCs available including the HTTP header // X-GOOG-API-FORMAT-VERSION with the value 2. Import the exception: // from googleapiclient.errors import HttpError AndroidProvisioningPartner.Customers.Dpcs.List request = service.customers().dpcs().list(customerAccount); request.getRequestHeaders().put(googleApiFormatHttpHeader, googleApiFormatVersion); CustomerListDpcsResponse response = request.execute(); return response.getDpcs(); } catch (GoogleJsonResponseException e) { // Get the error details. In your app, check details exists first. ArrayList<Map> details = (ArrayList<Map>) e.getDetails().get("details"); for (Map detail : details) { if (detail.get("@type").equals(tosErrorType) && (boolean) detail.get("latestTosAccepted") != true) { // Ask the user to accept the ToS. If they agree, open the portal in a browser. // ... } } return null; }
.СЕТЬ
// Authorize this method call as a user that hasn't yet accepted the ToS. try { var request = service.Customers.Dpcs.List(customerAccount); CustomerListDpcsResponse response = request.Execute(); return response.Dpcs; } catch (GoogleApiException e) { foreach (SingleError error in e.Error?.Errors) { if (error.Message.StartsWith("The user must agree the terms of service")) { // Ask the user to accept the ToS. If they agree, open the portal in a browser. // ... } } }
Питон
# Authorize this method call as a user that hasn't yet accepted the ToS. tos_error_type = ('type.googleapis.com/' 'google.android.device.provisioning.v1.TosError') portal_url = 'https://partner.android.com/zerotouch' # Send an API request to list all the DPCs available including the HTTP # header X-GOOG-API-FORMAT-VERSION with the value 2. Import the exception: # from googleapiclient.errors import HttpError try: request = service.customers().dpcs().list(parent=customer_account) request.headers['X-GOOG-API-FORMAT-VERSION'] = '2' response = request.execute() return response['dpcs'] except HttpError as err: # Parse the JSON content of the error. In your app, check ToS exists first. error = json.loads(err.content) tos_error = error['error']['details'][0] # Ask the user to accept the ToS (not shown here). If they agree, then open # the portal in a browser. if (tos_error['@type'] == tos_error_type and tos_error['latestTosAccepted'] is not True): if raw_input('Accept the ToS in the zero-touch portal? y|n ') == 'y': webbrowser.open(portal_url)
Если ваш клиент Google API поддерживает подробные ошибки (запросы Java, Python или HTTP), включите в свои запросы HTTP-заголовок X-GOOG-API-FORMAT-VERSION
со значением 2
. Если ваш клиент не поддерживает подробные ошибки (.NET и другие), сопоставьте сообщение об ошибке.
Когда мы обновим Условия обслуживания в будущем, если вы будете следовать этому подходу, ваше приложение предложит пользователю повторно принять новые Условия обслуживания.
Ссылка на портал
ИТ-администраторы используют портал автоматической регистрации для управления пользователями своей организации — вы не можете предложить это через клиентский API. ИТ-администраторы также могут управлять устройствами и конфигурациями с помощью портала. Если вам нужна ссылка на портал с консоли или в документации, используйте этот URL:
https://partner.android.com/zerotouch
Возможно, вы захотите сообщить ИТ-администраторам, что им будет предложено войти в систему, используя свою учетную запись Google.
Регистрация устройства
Регистрация без касания — это механизм регистрации устройств, аналогичный регистрации NFC или регистрации с помощью QR-кода. Ваша консоль должна поддерживать управляемые устройства, а ваш ЦОД должен иметь возможность работать в режиме полностью управляемого устройства.
Автоматическая регистрация доступна на поддерживаемых устройствах под управлением Android 8.0 или более поздней версии. ИТ-администраторы должны приобретать поддерживаемые устройства у реселлера-партнера . Ваша консоль может отслеживать, какие устройства ИТ-администратора доступны для автоматической регистрации, вызвав customers.devices.list
.
Вот краткое описание того, как работает регистрация:
- Устройство регистрируется на сервере Google при первом запуске (или после сброса настроек) для автоматической регистрации.
- Если ИТ-администратор применил конфигурацию к устройству, автоматическая регистрация запускает мастер настройки Android полностью управляемого устройства и персонализирует экраны с помощью метаданных из конфигурации.
- Автоматическая регистрация загружает и устанавливает ваш ЦОД из Google Play.
- Ваш ЦОД получает намерение
ACTION_PROVISION_MANAGED_DEVICE
и подготавливает устройство.
Если подключение к Интернету отсутствует, проверка происходит, когда оно становится доступным. Дополнительные сведения о подготовке устройств с автоматической регистрацией см. в разделе «Инициализация» ниже.
Конфигурации по умолчанию
Автоматическая регистрация больше всего помогает ИТ-администраторам, когда они устанавливают конфигурацию по умолчанию, которая применяется ко всем новым устройствам, приобретаемым их организацией. Поощряйте установку конфигурации по умолчанию с вашей консоли, если она еще не установлена. Вы можете проверить значение customers.configurations.isDefault
чтобы узнать, установила ли организация конфигурацию по умолчанию.
В примере ниже показано, как можно сделать существующую конфигурацию по умолчанию:
Ява
// Send minimal data with the request. Just the 2 required fields. // targetConfiguration is an existing configuration that we want to make the default. Configuration configuration = new Configuration(); configuration.setIsDefault(true); configuration.setConfigurationId(targetConfiguration.getConfigurationId()); // Call the API, including the FieldMask to avoid setting other fields to null. AndroidProvisioningPartner.Customers.Configurations.Patch request = service .customers() .configurations() .patch(targetConfiguration.getName(), configuration); request.setUpdateMask("isDefault"); Configuration results = request.execute();
.СЕТЬ
// Send minimal data with the request. Just the 2 required fields. // targetConfiguration is an existing configuration that we want to make the default. Configuration configuration = new Configuration { IsDefault = true, ConfigurationId = targetConfiguration.ConfigurationId, }; // Call the API, including the FieldMask to avoid setting other fields to null. var request = service.Customers.Configurations.Patch(configuration, targetConfiguration.Name); request.UpdateMask = "IsDefault"; Configuration results = request.Execute();
Питон
# Send minimal data with the request. Just the 2 required fields. # target_configuration is an existing configuration we'll make the default. configuration = { 'isDefault': True, 'configurationId': target_configuration['configurationId']} # Call the API, including the FieldMask to avoid setting other fields to null. response = service.customers().configurations().patch( name=target_configuration['name'], body=configuration, updateMask='isDefault').execute()
Ссылка на ваш ЦОД
Мы рекомендуем использовать имя ресурса API customers.dpcs.name
для идентификации вашего ЦОД и использования его в конфигурациях. Имя ресурса содержит уникальный и неизменный идентификатор ЦОД. Вызовите customers.dpcs.list
, чтобы получить список всех поддерживаемых ЦОД. Поскольку имя ресурса также включает идентификатор клиента, отфильтруйте список, используя последний компонент пути, чтобы найти соответствующий экземпляр Dpc
. В приведенном ниже примере показано, как сопоставить ваш DPC и сохранить его для последующего использования в конфигурации:
Ява
// Return a customer Dpc instance for the specified DPC ID. String myDpcIdentifier = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...xMSWCiYiuHRWeBbu86Yjq"; final int dpcIdIndex = 3; final String dpcComponentSeparator = "/"; // ... for (Dpc dpcApp : dpcs) { // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the // fourth component matches the DPC ID. String dpcId = dpcApp.getName().split(dpcComponentSeparator)[dpcIdIndex]; if (dpcId.equals(myDpcIdentifier)) { System.out.format("My DPC is: %s\n", dpcApp.getDpcName()); return dpcApp; } } // Handle the case when the DPC isn't found...
.СЕТЬ
// Return a customer Dpc instance for the specified DPC ID. var myDpcIdentifer = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...fE9WdHcxMSWCiYiuHRWeBbu86Yjq"; const int dpcIdIndex = 3; const String dpcComponentSeparator = "/"; // ... foreach (Dpc dpcApp in dpcs) { // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the // fourth component matches the DPC ID. String dpcId = dpcApp.Name.Split(dpcComponentSeparator)[dpcIdIndex]; if (dpcId.Equals(myDpcIdentifer)) { Console.WriteLine("Matched DPC is: {0}", dpcApp.DpcName); return dpcApp; } } // Handle the case when the DPC isn't found...
Питон
# Return a customer Dpc instance for the specified DPC ID. my_dpc_id = 'AH6Gbe4aiS459wlz58L30cqb...fE9WdHcxMSWCiYiuHRWeBbu86Yjq' # ... for dpc_app in dpcs: # Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, # check the fourth component matches the DPC ID. dpc_id = dpc_app['name'].split('/')[3] if dpc_id == my_dpc_id: return dpc_app # Handle the case when the DPC isn't found...
Если вам нужно отобразить имя ЦОД в пользовательском интерфейсе вашей консоли, отобразите значение, возвращаемое из customers.dpcs.dpcName
.
Обеспечение
Воспользуйтесь возможностью предоставить удобный пользовательский интерфейс для подготовки устройств. Имя пользователя и пароль — это все, что необходимо для подготовки устройства. Помните, что реселлеры могут отправлять устройства напрямую удаленным пользователям. Включите все остальные параметры, такие как сервер EMM или организационное подразделение, в customers.configuration.dpcExtras
.
В приведенном ниже фрагменте JSON показана часть примера конфигурации:
{
"android.app.extra.PROVISIONING_LOCALE": "en_GB",
"android.app.extra.PROVISIONING_TIME_ZONE": "Europe/London",
"android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED": true,
"android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE": {
"workflow_type": 3,
"default_password_quality": 327680,
"default_min_password_length": 6,
"company_name": "XYZ Corp",
"organizational_unit": "sales-uk",
"management_server": "emm.example.com",
"detail_tos_url": "https://www.example.com/policies/terms/",
"allowed_user_domains": "[\"example.com\", \"example.org\", \"example.net\"]"
}
}
Регистрация без участия пользователя устанавливает и запускает ваш ЦОД с использованием Android Intent. Система отправляет значения в свойстве JSON android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE
в ваш ЦОД в качестве дополнительных элементов намерения. Ваш ЦОД может читать настройки обеспечения из PersistableBundle
используя те же ключи.
Рекомендуется — используйте следующие дополнительные возможности для настройки ЦОД:
-
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
-
EXTRA_PROVISIONING_LOCALE
-
EXTRA_PROVISIONING_TIME_ZONE
-
EXTRA_PROVISIONING_LOCAL_TIME
-
EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED
-
EXTRA_PROVISIONING_MAIN_COLOR
-
EXTRA_PROVISIONING_DISCLAIMERS
Не рекомендуется — не включайте следующие дополнительные элементы, которые вы можете использовать в других методах регистрации:
-
EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME
-
EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
-
EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER
-
EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION
-
EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
Чтобы узнать, как извлечь и использовать эти настройки в своем ЦОД, прочтите «Предоставление клиентских устройств» .
Разработка и тестирование
Чтобы разработать и протестировать функции автоматической регистрации вашей консоли, вам потребуется следующее:
- поддерживаемое устройство
- учетная запись автоматической регистрации клиента
Разрабатывайте и тестируйте устройства, поддерживающие автоматическую регистрацию , например Google Pixel. Вам не обязательно приобретать устройства для разработки у партнера-посредника.
Свяжитесь с нами , чтобы получить тестовую учетную запись клиента и доступ к порталу автоматической регистрации. Напишите нам со своего корпоративного адреса электронной почты, связанного с учетной записью Google. Сообщите нам производителя и номер IMEI одного или двух устройств, и мы добавим их в вашу учетную запись разработчика.
Помните, поскольку автоматическая регистрация автоматически загружает и устанавливает DPC, ваш DPC должен быть доступен в Google Play, прежде чем вы сможете протестировать подготовку. Вы не можете проводить тестирование с помощью разрабатываемой версии вашего ЦОД.
Поддержка ИТ-администраторов
Если вам нужно помочь ИТ-администраторам в интерфейсе вашей консоли или документации, ознакомьтесь с инструкциями по автоматической регистрации для ИТ-администраторов . Вы также можете направить пользователей вашей консоли к этой статье справочного центра.
Дальнейшее чтение
Прочтите эти документы, которые помогут вам интегрировать автоматическую регистрацию в вашей консоли:
- Автоматическая регистрация для ИТ-администраторов в справке Android Enterprise.
- Предоставьте клиентские устройства с сайта разработчиков Android EMM.