EMM entegrasyon kılavuzu

Bu kılavuz, kurumsal mobilite yönetimi (EMM) sağlayıcılarının konsollarına el değmeden kayıt özelliğini entegre etmelerine yardımcı olur. Kayıt hakkında daha fazla bilgi edinmek ve DPC'nizin (cihaz politikası denetleyici) cihazların temel hazırlığını yapmasına yardımcı olacak en iyi uygulama önerilerini görmek için okumaya devam edin. DPC'niz varsa cihazların temel hazırlığını yapmayla ilgili en iyi uygulamaları öğrenecek, geliştirme ve test konusunda yardım almak için öneriler alacaksınız.

BT yöneticileri için özellikler

BT yöneticilerinin doğrudan konsolunuzdan el değmeden kayıt ayarlarını yapmalarına yardımcı olmak için müşteri API'sini kullanın. Bir BT yöneticisinin konsolunuzda tamamlayabileceği bazı görevler şunlardır:

  • Mobil politikalarınıza göre el değmeden kayıt yapılandırmaları oluşturun, düzenleyin ve silin.
  • DPC'nizin kuruluşun satın alacağı cihazların temel hazırlığını yapmak için varsayılan bir yapılandırma belirleyin.
  • Cihazlara ayrı yapılandırmalar uygulayın veya cihazları el değmeden kayıttan kaldırın.

El değmeden kayıt hakkında daha fazla bilgi edinmek için genel bakış sayfasını okuyun.

Ön koşullar

EMM konsolunuza el değmeden kayıt özelliğini eklemeden önce çözümünüzün aşağıdakileri desteklediğini onaylayın:

  • EMM çözümünüzün şirkete ait bir Android 8.0 veya sonraki sürüm (Pixel 7.1+) cihazın tümüyle yönetilen modda temel hazırlığını yapması gerekiyor. Şirkete ait Android 10 ve sonraki sürümleri çalıştıran cihazlar tümüyle yönetilen olarak veya bir iş profiliyle sağlanabilir.
  • El değmeden kayıt özelliği DPC'yi otomatik olarak indirip yüklediği için DPC'niz Google Play'den edinilebilir olmalıdır. BT yöneticilerinin müşteri API'sini veya portalı kullanarak yapılandırabileceği uyumlu DPC'lerin listesini sunuyoruz. DPC'nizi listeye eklemek için EMM Sağlayıcı topluluğu aracılığıyla bir ürün değişikliği isteği gönderin.
  • Müşterilerinizin, müşteri API'sini çağırmak için el değmeden kayıt hesapları olmalıdır. İş ortağı bayi, kuruluş cihazlarını satın aldığında BT yöneticisinin kuruluşu için hesap oluşturur.
  • Cihazın Google Mobil Hizmetleri (GMS) ile uyumlu olması ve el değmeden kayıt özelliğinin doğru şekilde çalışması için Google Play hizmetlerinin her zaman etkin olması gerekir.

API'yi çağırma

Konsolunuzun kullanıcıları (Google Hesaplarını kullanarak), API isteklerinizi müşteri API'sine yetkilendirir. Bu akış, diğer EMM API'leri için gerçekleştirdiğiniz yetkilendirmeden farklıdır. Bunu uygulamanızda nasıl yapacağınızı öğrenmek için Yetkilendirme bölümünü okuyun.

Hizmet Şartları'nı işleme

Kullanıcılarınızın API'yi çağırmadan önce en son Hizmet Şartları'nı kabul etmesi gerekir. API çağrısı bir HTTP 403 Forbidden durum kodu döndürür ve yanıt gövdesinde bir TosError varsa kullanıcıdan el değmeden kayıt portalında oturum açarak Hizmet Şartları'nı kabul etmesini isteyin. Aşağıdaki örnekte bunu yapmanın yollarından biri gösterilmektedir:

Java

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

.NET

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

Python

# 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 istemciniz ayrıntılı hataları (Java, Python veya HTTP istekleri) destekliyorsa isteklerinize 2 değeriyle X-GOOG-API-FORMAT-VERSION HTTP başlığını ekleyin. İstemciniz ayrıntılı hataları (.NET ve diğerleri) desteklemiyorsa hata mesajıyla eşleştirin.

İleride Hizmet Şartları'nı güncellediğimizde, bu yaklaşımı izlerseniz uygulamanız kullanıcıyı yeni Hizmet Şartları'nı yeniden kabul etmeye yönlendirir.

BT yöneticileri, kuruluşlarının kullanıcılarını yönetmek için el değmeden kayıt portalını kullanır. Bunu müşteri API'si aracılığıyla sunamazsınız. BT yöneticileri, portalı kullanarak cihaz ve yapılandırmaları da yönetebilir. Konsolunuzdan veya belgelerinizden portala bağlantı oluşturmanız gerekiyorsa şu URL'yi kullanın:

https://partner.android.com/zerotouch

BT yöneticilerini, Google Hesaplarıyla oturum açmalarının istendiği konusunda bilgilendirmek isteyebilirsiniz.

Cihaz kaydı

El değmeden kayıt, cihazları kaydettirmek için kullanılan bir mekanizmadır ve NFC kaydı veya QR kodu ile kayıt gibidir. Konsolunuzun yönetilen cihazları desteklemesi ve DPC'nizin tümüyle yönetilen cihaz modunda çalışabilmesi gerekir.

El değmeden kayıt, Android 8.0 veya sonraki sürümleri çalıştıran, desteklenen cihazlarda kullanılabilir. BT yöneticileri, desteklenen cihazları bir iş ortağı bayisinden satın almalıdır. Konsolunuz, customers.devices.list numarasını arayarak hangi BT yöneticisinin el değmeden kayıt için uygun olduğunu izleyebilir.

Kayıt sürecinin işleyişi aşağıdaki gibi özetlenebilir:

  1. Bir cihaz el değmeden kayıt için ilk başlatma sırasında (veya fabrika ayarlarına sıfırlandıktan sonra) bir Google sunucusuna bağlanır.
  2. BT yöneticisi cihaza bir yapılandırma uyguladıysa el değmeden kayıt, tümüyle yönetilen cihaz Android kurulum sihirbazını çalıştırır ve yapılandırmadaki meta verilerle ekranları kişiselleştirir.
  3. El değmeden kayıt özelliği, DPC'nizi Google Play'den indirip yükler.
  4. DPC'niz ACTION_PROVISION_MANAGED_DEVICE amacını alır ve cihazın temel hazırlığını yapar.

İnternet bağlantısı yoksa kontrol, bağlantı kurulduğunda yapılır. El değmeden kayıt ile cihaz temel hazırlığı hakkında daha fazla bilgi edinmek için aşağıdaki Temel hazırlık bölümüne bakın.

Varsayılan yapılandırmalar

El değmeden kayıt, BT yöneticilerine kuruluşlarının satın aldığı yeni cihazlara uygulanan varsayılan bir yapılandırma ayarlarken daha çok yardımcı olur. Ayarlanmamışsa konsolunuzdan varsayılan bir yapılandırma ayarlamayı yükseltin. Bir kuruluşun varsayılan yapılandırma belirleyip belirlemediğini öğrenmek için customers.configurations.isDefault değerini kontrol edebilirsiniz.

Aşağıdaki örnekte, mevcut bir yapılandırmayı nasıl varsayılan ayarlayabileceğiniz gösterilmektedir:

Java

// 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();

.NET

// 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();

Python

# 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()

DPC'nize referans verme

DPC'nizi tanımlamak ve yapılandırmalarda kullanmak için API kaynağı adını customers.dpcs.name kullanmanızı öneririz. Kaynak adı, DPC için benzersiz ve değişmeyen bir tanımlayıcı içerir. Desteklenen tüm DPC'lerin listesini almak için customers.dpcs.list numaralı telefonu arayın. Kaynak adı aynı zamanda müşteri kimliğini de içerdiğinden, eşleşen bir Dpc örneği bulmak için son yol bileşenini kullanarak listeyi filtreleyin. Aşağıdaki örnekte, DPC'nizin nasıl eşleştirileceği ve daha sonra yapılandırmada kullanılmak üzere nasıl korunacağı gösterilmektedir:

Java

// 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...

.NET

// 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...

Python

# 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...

Konsolunuzun kullanıcı arayüzünde bir DPC'nin adını göstermeniz gerekiyorsa customers.dpcs.dpcName öğesinden döndürülen değeri görüntüleyin.

Temel hazırlık yapılıyor

Cihaz temel hazırlığı için mükemmel bir kullanıcı deneyimi sağlama fırsatını kaçırmayın. Cihazın temel hazırlığını yapmak için tek gereken bir kullanıcı adı ve şifre olmalıdır. Bayilerin cihazları doğrudan uzak kullanıcılara gönderebileceğini unutmayın. EMM sunucusu veya kuruluş birimi gibi diğer tüm ayarları customers.configuration.dpcExtras içine dahil edin.

Aşağıdaki JSON snippet'i, örnek bir yapılandırmanın bir kısmını gösterir:

{
  "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\"]"
    }
}

El değmeden kayıt, bir Android Intent kullanarak DPC'nizi yükler ve başlatır. Sistem, android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE JSON özelliğindeki değerleri amaçtaki ekstralar olarak DPC'nize gönderir. DPC'niz aynı anahtarları kullanarak PersistableBundle üzerindeki temel hazırlık ayarlarını okuyabilir.

Önerilir: DPC'nizi ayarlamak için aşağıdaki intent ekstralarını kullanın:

Önerilmez. Diğer kayıt yöntemlerinde kullanabileceğiniz aşağıdaki ekstraları eklemeyin:

Bu ayarları DPC'nizde nasıl çıkarıp kullanacağınızı öğrenmek için Müşteri cihazlarının temel hazırlığını yapma bölümünü okuyun.

Geliştirme ve test

Konsolunuzun el değmeden kayıt özelliklerini geliştirip test etmek için aşağıdakilere ihtiyacınız olacaktır:

  • desteklenen bir cihaz
  • müşteri el değmeden kayıt hesabı

Google Pixel gibi el değmeden kaydı destekleyen cihazları geliştirin ve test edin. Geliştirme cihazlarınızı bir bayi iş ortağından satın almanız gerekmez.

Bir test müşteri hesabı edinmek ve el değmeden kayıt portalına erişmek için bize ulaşın. Bir Google Hesabı ile ilişkilendirilmiş kurumsal e-posta adresinizden bize e-posta gönderin. Bir veya iki cihazın üreticisini ve IMEI numarasını bize bildirirseniz bunları geliştirme hesabınıza ekleriz.

El değmeden kayıt özelliğinin otomatik olarak bir DPC'yi indirip yüklediğinden, temel hazırlığı test edebilmeniz için DPC'nizin Google Play'de mevcut olması gerektiğini unutmayın. DPC'nizin geliştirme sürümüyle test yapamazsınız.

BT yöneticileri için destek

BT yöneticilerine konsolunuzun arayüzünde veya belgelerinizde yardım etmeniz gerekiyorsa yardım almak üzere BT yöneticileri için el değmeden kayıt sayfasına göz atın. Konsolunuzun kullanıcılarını bu yardım merkezi makalesine de yönlendirebilirsiniz.

Daha fazla bilgi

El değmeden kayıt özelliğini konsolunuza entegre etmenize yardımcı olması için şu belgeleri okuyun: