Yönetilen yapılandırmaları kurulumu

Kurumsal pazar için uygulama geliştiriyorsanız bir kuruluşun politikaları tarafından belirlenen belirli koşulları karşılamanız gerekebilir. Daha önce uygulama kısıtlamaları olarak bilinen yönetilen yapılandırmalar, kuruluşun BT yöneticisinin uygulamalar için ayarları uzaktan belirtmesine olanak tanır. Bu özellik, özellikle bir iş profiline dağıtılan kuruluş onaylı uygulamalar için yararlıdır.

Örneğin, bir kuruluş onaylı uygulamaların BT yöneticisinin şunları yapmasına izin vermesini zorunlu tutabilir:

  • Web tarayıcısı için URL'lere izin verme veya URL'leri engelleme
  • Bir uygulamanın içeriği hücresel ağ üzerinden mi yoksa yalnızca kablosuz ağ üzerinden mi senkronize edebileceğini yapılandırma
  • Uygulamanın e-posta ayarlarını yapılandırma

Bu kılavuzda, yönetilen yapılandırma ayarlarının uygulamanıza nasıl uygulanacağı gösterilmektedir. Yönetilen yapılandırmaya sahip örnek uygulamaları görüntülemek için ManagedConfigurations sayfasına bakın. Kurumsal mobilite yönetimi (EMM) geliştiriciyseniz Android Management API kılavuzunu inceleyin.

Not: Bu yapılandırma ayarları, geçmiş nedenlerle kısıtlamalar olarak bilinir ve bu terimi kullanan dosya ve sınıflarla (RestrictionsManager gibi) uygulanır. Ancak bu kısıtlamalar, yalnızca uygulama işlevleriyle ilgili kısıtlamalar değil, aslında çok çeşitli yapılandırma seçeneklerini uygulayabilir.

Uzak yapılandırmaya genel bakış

Uygulamalar, BT yöneticileri tarafından uzaktan ayarlanabilen yönetilen yapılandırma seçeneklerini tanımlar. Bunlar, yönetilen yapılandırma sağlayıcısı tarafından değiştirilebilen keyfi ayarlardır. Uygulamanız bir iş profilinde çalışıyorsa BT yöneticisi, uygulamanızın yönetilen yapılandırmasını değiştirebilir.

Yönetilen yapılandırma sağlayıcı, aynı cihazda çalışan başka bir uygulamadır. Bu uygulama genellikle BT yöneticisi tarafından kontrol edilir. BT yöneticisi, yapılandırma değişikliklerini yönetilen yapılandırma sağlayıcı uygulamasına iletir. Bu uygulama da uygulamanızdaki yapılandırmaları değiştirir.

Harici olarak yönetilen yapılandırmalar sağlamak için:

  • Yönetilen yapılandırmaları uygulama manifestinizde belirtin. Bu, BT yöneticisinin Google Play API'leri aracılığıyla uygulamanın yapılandırmalarını okumasına olanak tanır.
  • Uygulama her devam ettiğinde, mevcut yönetilen yapılandırmaları kontrol etmek için RestrictionsManager nesnesini kullanın ve uygulamanızın kullanıcı arayüzünü ve davranışını bu yapılandırmalara uygun olacak şekilde değiştirin.
  • ACTION_APPLICATION_RESTRICTIONS_CHANGED intent'ini dinleyin. Bu yayını aldığınızda, mevcut yönetilen yapılandırmaları görmek için RestrictionsManager simgesini kontrol edin ve uygulamanızın davranışında gerekli değişiklikleri yapın.

Yönetilen yapılandırmaları tanımlama

Uygulamanız, tanımlamak istediğiniz tüm yönetilen yapılandırmaları destekleyebilir. Uygulamanın yönetilen yapılandırmalarını yönetilen yapılandırmalar dosyasında, yapılandırma dosyasını ise manifest dosyasında belirtirsiniz. Yapılandırma dosyası oluşturmak, diğer uygulamaların uygulamanızın sağladığı yönetilen yapılandırmaları incelemesine olanak tanır. EMM iş ortakları, Google Play API'lerini kullanarak uygulamanızın yapılandırmalarını okuyabilir.

Uygulamanızın uzak yapılandırma seçeneklerini tanımlamak için aşağıdaki öğeyi manifest'inizin <application> öğesine ekleyin:

<meta-data android:name="android.content.APP_RESTRICTIONS"
    android:resource="@xml/app_restrictions" />

Uygulamanızın res/xml dizininde app_restrictions.xml adlı bir dosya oluşturun. Bu dosyanın yapısı, RestrictionsManager ile ilgili referans bölümünde açıklanmıştır. Dosyada, uygulamanın sahip olduğu her yapılandırma seçeneği için bir <restriction> alt öğesi içeren tek bir üst düzey <restrictions> öğesi bulunur.

Not: Yönetilen yapılandırma dosyasının yerelleştirilmiş sürümlerini oluşturmayın. Uygulamanızda yalnızca tek bir yönetilen yapılandırma dosyasına izin verilir. Bu sayede yapılandırmalar, uygulamanız için tüm yerel ayarlarda tutarlı olur.

Bir EMM, kurumsal ortamda BT yöneticileri için uzaktan konsol oluşturmak amacıyla yönetilen yapılandırma şemasını kullanır. Böylece, yöneticilerin uygulamanızı uzaktan yapılandırması sağlanır.

Yönetilen yapılandırma sağlayıcı, uygulamanın açıklama metni de dahil olmak üzere mevcut yapılandırmalarıyla ilgili ayrıntıları bulmak için uygulamayı sorgulayabilir. Yapılandırma sağlayıcı ve BT yöneticisi, uygulamanız çalışmadığında bile uygulamanızın yönetilen yapılandırmalarını diledikleri zaman değiştirebilir.

Örneğin, uygulamanızın hücresel bağlantı üzerinden veri indirmesine izin verecek veya bunu yasaklayacak şekilde uzaktan yapılandırılabilir olduğunu varsayalım. Uygulamanızda aşağıdaki gibi bir <restriction> öğesi olabilir:

<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">

  <restriction
    android:key="downloadOnCellular"
    android:title="@string/download_on_cell_title"
    android:restrictionType="bool"
    android:description="@string/download_on_cell_description"
    android:defaultValue="true" />

</restrictions>

Her bir yapılandırma için android:key özelliğini kullanarak yönetilen yapılandırma paketinden değerini okursunuz. Bu nedenle, her yapılandırmada benzersiz bir anahtar dizesi olmalıdır ve bu dize yerelleştirilemez. Dize değişmezi ile belirtilmelidir.

Not: Bir üretim uygulamasında android:title ve android:description, Kaynaklarla yerelleştirme bölümünde açıklandığı gibi yerelleştirilmiş bir kaynak dosyasından alınmalıdır.

Uygulamalar, bundle_array içinde paketleri kullanarak kısıtlamaları tanımlar. Örneğin, birden fazla VPN bağlantısı seçeneği olan bir uygulama, her VPN sunucu yapılandırmasını bir bundle içinde tanımlayabilir. Bu yapılandırmaya, bir paket dizisinde gruplandırılmış birden fazla paket eşlik eder:

<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android" >

  <restriction
    android:key="vpn_configuration_list"
    android:restrictionType="bundle_array">
    <restriction
      android:key="vpn_configuration"
      android:restrictionType="bundle">
      <restriction
        android:key="vpn_server"
        android:restrictionType="string"/>
      <restriction
        android:key="vpn_username"
        android:restrictionType="string"/>
      <restriction
        android:key="vpn_password"
        android:restrictionType="string"/>
    </restriction>
  </restriction>

</restrictions>

android:restrictionType öğesi için desteklenen türler Tablo 1'de listelenmiştir ve RestrictionsManager ile RestrictionEntry referanslarında açıklanmıştır.

Tablo 1. Kısıtlama girişi türleri ve kullanımı.

Tür android:restrictionType Tipik kullanım
TYPE_BOOLEAN "bool" Doğru veya yanlış bir boole değeri.
TYPE_STRING "string" Ad gibi bir dize değeri.
TYPE_INTEGER "integer" MIN_VALUE ile MAX_VALUE arasında bir değere sahip bir tam sayı.
TYPE_CHOICE "choice" android:entryValues arasından seçilen bir dize değeridir. Genellikle tek seçimli bir liste olarak sunulur.
TYPE_MULTI_SELECT "multi-select" android:entryValues öğesinden seçilen değerleri içeren bir dize dizisi. Birden fazla girişin seçilebileceği çoklu seçim listeleri sunmak için kullanın (ör. izin verilenler listesine eklenecek belirli başlıkları seçmek için).
TYPE_NULL "hidden" Gizli kısıtlama türü. Aktarılması gereken ancak kullanıcıya kullanıcı arayüzünde sunulmaması gereken bilgiler için bu türü kullanın. Tek bir dize değeri depolar.
TYPE_BUNDLE_ARRAY "bundle_array" Kısıtlama dizilerini depolamak için bu türden yararlanınbundles. Android 6.0 (API düzeyi 23) sürümünde kullanılabilir.

Not: android:entryValues makine tarafından okunabilir ve yerelleştirilemez. Yerelleştirilebilen, kullanıcılar tarafından okunabilir değerleri göstermek için android:entries kullanın. Her girişin android:entryValues'te karşılık gelen bir dizini olmalıdır.

Yönetilen yapılandırmaları kontrol etme

Diğer uygulamalar yapılandırma ayarlarını değiştirdiğinde uygulamanız otomatik olarak bilgilendirilmez. Bunun yerine, uygulamanız başlatıldığında veya devam ettirildiğinde yönetilen yapılandırmaların ne olduğunu kontrol etmeniz ve uygulamanız çalışırken yapılandırmaların değişip değişmediğini öğrenmek için bir sistem amacı dinlemeniz gerekir.

Uygulamanız, geçerli yapılandırma ayarlarını öğrenmek için bir RestrictionsManager nesnesi kullanır. Uygulamanız, mevcut yönetilen yapılandırmaları şu zamanlarda kontrol etmelidir:

Bir RestrictionsManager nesnesi almak için getActivity() ile mevcut etkinliği alın, ardından bu etkinliğin Activity.getSystemService() yöntemini çağırın:

Kotlin

var myRestrictionsMgr =
        activity?.getSystemService(Context.RESTRICTIONS_SERVICE) as RestrictionsManager

Java

RestrictionsManager myRestrictionsMgr =
    (RestrictionsManager) getActivity()
        .getSystemService(Context.RESTRICTIONS_SERVICE);

Bir RestrictionsManager oluşturduktan sonra, getApplicationRestrictions() yöntemini çağırarak mevcut yapılandırma ayarlarını alabilirsiniz:

Kotlin

var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions

Java

Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

Not: Kolaylık sağlamak için UserManager.getApplicationRestrictions() işlevini çağırarak mevcut yapılandırmaları UserManager ile de alabilirsiniz. Bu yöntem, RestrictionsManager.getApplicationRestrictions() ile tamamen aynı şekilde çalışır.

getApplicationRestrictions() yöntemi, veri depolama alanından okuma gerektirdiğinden bu yöntemin kullanımı sınırlı olmalıdır. Mevcut yapılandırmayı bilmeniz gerektiğinde her seferinde bu yöntemi çağırmayın. Bunun yerine, uygulamanız başlatıldığında veya devam ettirildiğinde bu işlevi bir kez çağırmanız ve getirilen yönetilen yapılandırma paketini önbelleğe almanız gerekir. Ardından, Yönetilen Yapılandırma Değişikliklerini Dinleme bölümünde açıklandığı gibi, uygulamanız etkinken yapılandırma değişikliğinin olup olmadığını öğrenmek için ACTION_APPLICATION_RESTRICTIONS_CHANGED intent'ini dinleyin.

Yönetilen yapılandırmaları okuma ve uygulama

getApplicationRestrictions() yöntemi, ayarlanmış her yapılandırma için bir anahtar/değer çifti içeren bir Bundle döndürür. Değerlerin tümü Boolean, int, String ve String[] türündedir. Yönetilen yapılandırmaları Bundle oluşturduktan sonra, mevcut yapılandırma ayarlarını bu veri türleri için standart Bundle yöntemleriyle (ör. getBoolean() veya getString()) kontrol edebilirsiniz.

Not: Yönetilen yapılandırmalar Bundle, yönetilen yapılandırma sağlayıcısı tarafından açıkça ayarlanmış her yapılandırma için bir öğe içerir. Ancak, yönetilen yapılandırmalar XML dosyasında varsayılan bir değer tanımladığınız için bir yapılandırma pakette bulunacağını varsayamazsınız.

Mevcut yönetilen yapılandırma ayarlarına göre uygun işlemi uygulamanızın yapması gerekir. Örneğin, uygulamanızda hücresel bağlantı üzerinden veri indirip indiremeyeceğini belirten bir yapılandırma varsa ve yapılandırma false olarak ayarlanmışsa cihazın kablosuz ağa bağlı olduğu durumlar dışında veri indirmeyi devre dışı bırakmanız gerekir. Aşağıdaki örnek kodda bu işlem gösterilmektedir:

Kotlin

val appCanUseCellular: Boolean =
        if (appRestrictions.containsKey("downloadOnCellular")) {
            appRestrictions.getBoolean("downloadOnCellular")
        } else {
            // cellularDefault is a boolean using the restriction's default value
            cellularDefault
        }

if (!appCanUseCellular) {
    // ...turn off app's cellular-download functionality
    // ...show appropriate notices to user
}

Java

boolean appCanUseCellular;

if (appRestrictions.containsKey("downloadOnCellular")) {
    appCanUseCellular = appRestrictions.getBoolean("downloadOnCellular");
} else {
    // cellularDefault is a boolean using the restriction's default value
    appCanUseCellular = cellularDefault;
}

if (!appCanUseCellular) {
    // ...turn off app's cellular-download functionality
    // ...show appropriate notices to user
}

Birden fazla iç içe yerleştirilmiş kısıtlama uygulamak için bundle_array kısıtlama girişini Parcelable nesneleri koleksiyonu olarak okuyup Bundle olarak yayınlayın. Bu örnekte, her VPN'nin yapılandırma verileri ayrıştırılır ve sunucu bağlantısı seçeneklerinin listesi oluşturmak için kullanılır:

Kotlin

// VpnConfig is a sample class used store config data, not defined
val vpnConfigs = mutableListOf<VpnConfig>()

val parcelables: Array<out Parcelable>? =
        appRestrictions.getParcelableArray("vpn_configuration_list")

if (parcelables?.isNotEmpty() == true) {
    // iterate parcelables and cast as bundle
    parcelables.map { it as Bundle }.forEach { vpnConfigBundle ->
        // parse bundle data and store in VpnConfig array
        vpnConfigs.add(VpnConfig()
                .setServer(vpnConfigBundle.getString("vpn_server"))
                .setUsername(vpnConfigBundle.getString("vpn_username"))
                .setPassword(vpnConfigBundle.getString("vpn_password")))
    }
}

if (vpnConfigs.isNotEmpty()) {
    // ...choose a VPN configuration or prompt user to select from list
}

Java

// VpnConfig is a sample class used store config data, not defined
List<VpnConfig> vpnConfigs = new ArrayList<>();

Parcelable[] parcelables =
    appRestrictions.getParcelableArray("vpn_configuration_list");

if (parcelables != null && parcelables.length > 0) {
    // iterate parcelables and cast as bundle
    for (int i = 0; i < parcelables.length; i++) {
        Bundle vpnConfigBundle = (Bundle) parcelables[i];
        // parse bundle data and store in VpnConfig array
        vpnConfigs.add(new VpnConfig()
            .setServer(vpnConfigBundle.getString("vpn_server"))
            .setUsername(vpnConfigBundle.getString("vpn_username"))
            .setPassword(vpnConfigBundle.getString("vpn_password")));
    }
}

if (!vpnConfigs.isEmpty()) {
    // ...choose a VPN configuration or prompt user to select from list
}

Yönetilen yapılandırma değişikliklerini dinleme

Bir uygulamanın yönetilen yapılandırmaları her değiştirildiğinde sistem ACTION_APPLICATION_RESTRICTIONS_CHANGED intent'ini tetikler. Yapılandırma ayarları değiştiğinde uygulamanın davranışını değiştirebilmeniz için uygulamanızın bu intent'i dinlemesi gerekir.

Not: ACTION_APPLICATION_RESTRICTIONS_CHANGED intent'i yalnızca dinamik olarak kaydedilen dinleyicilere gönderilir, uygulama manifest dosyasında tanımlanan dinleyicilere gönderilmez.

Aşağıdaki kodda, bu intent için bir yayın alıcısının nasıl dinamik olarak kaydedileceği gösterilmektedir:

Kotlin

val restrictionsFilter = IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED)

val restrictionsReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {

        // Get the current configuration bundle
        val appRestrictions = myRestrictionsMgr.applicationRestrictions

        // Check current configuration settings, change your app's UI and
        // functionality as necessary.
    }
}

registerReceiver(restrictionsReceiver, restrictionsFilter)

Java

IntentFilter restrictionsFilter =
    new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);

BroadcastReceiver restrictionsReceiver = new BroadcastReceiver() {
  @Override public void onReceive(Context context, Intent intent) {

    // Get the current configuration bundle
    Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

    // Check current configuration settings, change your app's UI and
    // functionality as necessary.
  }
};

registerReceiver(restrictionsReceiver, restrictionsFilter);

Not: Uygulamanızın duraklatıldığında yapılandırma değişiklikleri hakkında bilgilendirilmesi genellikle gerekmez. Bunun yerine, uygulama duraklatıldığında yayın alıcınızın kaydını silmeniz gerekir. Uygulama devam ettiğinde, önce mevcut yönetilen yapılandırmaları kontrol edin (Yönetilen Yapılandırmaları Kontrol Etme bölümünde açıklandığı gibi) ve ardından uygulama etkinken gerçekleşen yapılandırma değişiklikleri hakkında bilgilendirilmenizi sağlamak için yayın alıcınızı kaydedin.

Yönetilen yapılandırma geri bildirimlerini EMM'lere gönderme

Uygulamanıza yönetilen yapılandırma değişiklikleri uyguladıktan sonra EMM'leri değişikliğin durumu hakkında bilgilendirmeniz önerilir. Android, uygulamanız yönetilen yapılandırma değişikliklerini uygulamaya her çalıştığında geri bildirim göndermek için kullanabileceğiniz anahtarlanmış uygulama durumları adlı bir özelliği destekler. Bu geri bildirim, uygulamanızın yönetilen yapılandırmaları başarıyla ayarladığını onaylayabilir veya uygulamanız belirtilen değişiklikleri uygulayamadıysa bir hata mesajı içerebilir.

EMM sağlayıcılar bu geri bildirimleri alıp BT yöneticilerinin görüntüleyebilmesi için konsollarında gösterebilir. Uygulamanıza geri bildirim desteği eklemeyle ilgili ayrıntılı bir kılavuz da dahil olmak üzere konuyla ilgili daha fazla bilgi için EMM'lere uygulama geri bildirimi gönderme başlıklı makaleyi inceleyin.

Diğer kod örnekleri

ManagedConfigurations örneği, bu sayfada ele alınan API'lerin kullanımını daha ayrıntılı bir şekilde gösterir.

Kişisel profilde uygulamaları izin verilenler veya engellenenler listesine ekleme

Üçüncü taraf uygulama mağazaları, hem kişisel profile hem de kullanıcıların hassas uygulamalarını saklayabilecekleri ek bir kişisel alan olan Özel Alan tüketici özelliğine uygulama engellenenler listesi veya izin verilenler listesi uygulamanın güvenilir bir yoluna sahip olmak için Yönetilen Yapılandırmalar'ı kullanmak isteyebilir. Kurumsal kullanıma yönelik bir uygulama mağazası geliştiriyorsanız ve bu özelliği kullanmak istiyorsanız ilginizi belirtmek için bu formu gönderin ve formdaki Yanıtlama Nedeni olarak 3. taraf uygulama mağazasında izin verilenler listesine eklenme isteği'ni seçin.