Yönetilen yapılandırmaları kurulumu

Kurumsal pazar için uygulama geliştiriyorsanız kuruluşun politikaları tarafından belirlenen belirli gereksinimleri 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 ve kuruluş onaylı uygulamalar için yararlıdır.

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

  • Web tarayıcılarında 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 etmesine izin verileceğini yapılandırın
  • Uygulamanın e-posta ayarlarını yapılandırın

Bu kılavuzda, yönetilen yapılandırma ayarlarının uygulamanızda nasıl uygulanacağı gösterilmektedir. Yönetilen yapılandırmaya sahip örnek uygulamaları görüntülemek için ManagedConfigurations bölümüne bakın. Kurumsal Mobilite Yönetimi (EMM) geliştiricisiyseniz Android Management API kılavuzuna bakın.

Not: Geçmişteki nedenlerle, bu yapılandırma ayarları kısıtlamalar olarak bilinir ve bu terimi kullanan dosyalar ve sınıflarla (RestrictionsManager gibi) uygulanır. Ancak bu kısıtlamalar aslında yalnızca uygulama işlevselliğine yönelik kısıtlamalar değil, çok çeşitli yapılandırma seçenekleri de uygulayabilir.

Uzaktan yapılandırmaya genel bakış

Uygulamalar, BT yöneticisi tarafından uzaktan ayarlanabilen, yönetilen yapılandırma seçeneklerini tanımlar. Bunlar, yönetilen bir yapılandırma sağlayıcı tarafından değiştirilebilen rastgele 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ısı, 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 bildirir. Ardından bu uygulama, uygulamanızdaki yapılandırmaları değiştirir.

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

  • Uygulama manifestinizde yönetilen yapılandırmaları bildirin. Böylece BT yöneticisinin, Google Play API'leri aracılığıyla uygulama yapılandırmalarını okumasına izin verilir.
  • Uygulama devam ettirildiğinde, mevcut yönetilen yapılandırmaları kontrol etmek için RestrictionsManager nesnesini kullanın ve uygulamanızın kullanıcı arayüzü ile davranışını bu yapılandırmalara uyacak şekilde değiştirin.
  • ACTION_APPLICATION_RESTRICTIONS_CHANGED amacını dinleyin. Bu yayını aldığınızda, mevcut yönetilen yapılandırmaların neler olduğunu görmek için RestrictionsManager öğesini 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 beyan edersiniz. Yapılandırma dosyası oluşturmak, diğer uygulamaların kendi 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 uzaktan yapılandırma seçeneklerini tanımlamak için aşağıdaki öğeyi manifest <application> öğesine yerleştirin:

<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 referansında açıklanmaktadır. Dosyada tek bir üst düzey <restrictions> öğesi bulunur. Bu öğe, uygulamanın sahip olduğu her yapılandırma seçeneği için bir <restriction> alt öğesi içerir.

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ı bulunmasına izin verilir. Böylece yapılandırmalar, uygulamanız için tüm yerel ayarlarda tutarlı olacaktır.

Kurumsal ortamlarda EMM, BT yöneticileri için uzak konsol oluşturmak amacıyla genellikle yönetilen yapılandırma şemasını kullanır. Böylece yöneticiler, uygulamanızı uzaktan yapılandırabilir.

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

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

<?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 yapılandırmanın android:key özelliğini, yönetilen yapılandırma paketinden değeri okumak için kullanırsınız. Bu nedenle, her yapılandırmanın benzersiz bir anahtar dizesi olmalıdır ve dize yerelleştirilemez. Bir dize değişmez değeriyle 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 çizilmelidir.

Bir uygulama, kısıtlamaları bir bundle_array içindeki paketleri kullanarak tanımlıyor. Örneğin, birden fazla VPN bağlantı seçeneği sunan bir uygulama, bir paket dizisinde birlikte gruplandırılmış birden fazla paketle bundle içinde her bir VPN sunucu yapılandırmasını tanımlayabilir:

<?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ş ve RestrictionsManager ile RestrictionEntry referansında belgelenmiştir.

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

Tür android:restrictionType Tipik kullanım
TYPE_BOOLEAN "bool" True veya false olmak üzere bir boole değeridir.
TYPE_STRING "string" Ad gibi bir dize değeri.
TYPE_INTEGER "integer" MIN_VALUE ile MAX_VALUE arasında değere sahip bir tam sayı.
TYPE_CHOICE "choice" android:entryValues arasından seçilen ve genellikle tek seçimli bir liste şeklinde sunulan bir dize değeri.
TYPE_MULTI_SELECT "multi-select" android:entryValues öğesinden seçilen değerlere sahip bir dize dizisi. Birden fazla girişin seçilebileceği çoklu seçim listesini sunmak için (örneğin, izin verilenler listesine eklenecek belirli başlıkları seçmek için) bunu kullanın.
TYPE_NULL "hidden" Gizli kısıtlama türü. Bu türü, aktarılması gereken ancak kullanıcı arayüzünde kullanıcıya sunulmaması gereken bilgiler için kullanın. Tek bir dize değerini depolar.
TYPE_BUNDLE_ARRAY "bundle_array" bundles kısıtlama dizilerini depolamak için bunu kullanın. Android 6.0'da (API düzeyi 23) kullanılabilir.

Not: android:entryValues, makine tarafından okunabilir ve yerelleştirilemez. Kullanıcıların okuyabileceği, yerelleştirilebilecek değerler sunmak için android:entries kullanın. android:entryValues içinde her girişe karşılık gelen bir dizin olmalıdır.

Yönetilen yapılandırmaları kontrol edin

Diğer uygulamalar yapılandırma ayarlarını değiştirdiğinde uygulamanız otomatik olarak bildirim almaz. Bunun yerine, uygulamanız başladığı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ını dinlemeniz gerekir.

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

Bir RestrictionsManager nesnesi almak için mevcut etkinliği getActivity() ile 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 edindikten sonra, getApplicationRestrictions() yöntemini çağırarak geçerli yapılandırma ayarlarını alabilirsiniz:

Kotlin

var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions

Java

Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

Not: Kolaylık sağlaması açısından UserManager.getApplicationRestrictions() yöntemini çağırarak mevcut yapılandırmaları bir UserManager ile de alabilirsiniz. Bu yöntem, RestrictionsManager.getApplicationRestrictions() ile tam olarak aynı şekilde davranır.

getApplicationRestrictions() yöntemi, veri depolama alanından okumayı gerektirdiğinden tutumlu bir şekilde yapılmalıdır. Mevcut yapılandırmayı bilmeniz gerektiğinde bu yöntemi çağırmayın. Bunun yerine, bu satır öğesini, uygulamanız başladığında veya devam ettirildiğinde bir kez çağırmalı ve getirilen yönetilen yapılandırmalar paketini önbelleğe almalısınız. Ardından, uygulamanız etkinken yapılandırmanın değişip değişmediğini öğrenmek için Yönetilen Yapılandırma Değişikliklerini Dinleme bölümünde açıklandığı gibi ACTION_APPLICATION_RESTRICTIONS_CHANGED niyetini dinleyin.

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

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

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

Mevcut yönetilen yapılandırma ayarlarına bağlı olarak uygun işlemi yapmak, uygulamanıza bağlıdır. Örneğin, uygulamanızda verileri hücresel bağlantı üzerinden indirip indiremeyeceğini belirten bir yapılandırma varsa ve bu yapılandırmanın false olarak ayarlandığını görüyorsanız, aşağıdaki örnek kodda gösterildiği gibi cihazın kablosuz bağlantısı olduğu durumlar dışında veri indirmeyi devre dışı bırakmanız gerekir:

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 çok iç içe yerleştirilmiş kısıtlama uygulamak için bundle_array kısıtlama girişini Parcelable nesne koleksiyonu olarak okuyun ve Bundle olarak yayınlayın. Bu örnekte, her bir VPN'nin yapılandırma verileri ayrıştırılır ve sunucu bağlantısı seçeneklerinin bir listesini 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 amacını tetikler. Yapılandırma ayarları değiştiğinde uygulamanın davranışını değiştirebilmeniz için uygulamanızın bu amacı dinlemesi gerekir.

Not: ACTION_APPLICATION_RESTRICTIONS_CHANGED amacı yalnızca dinamik olarak kayıtlı olan dinleyicilere gönderilir, uygulama manifestinde beyan edilen dinleyicilere değil.

Aşağıdaki kod, bu amaç için bir yayın alıcısını dinamik olarak nasıl kaydedeceğinizi gösterir:

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: Normalde, uygulamanız duraklatıldığında yapılandırma değişiklikleri hakkında bildirim alması gerekmez. Bunun yerine, uygulama duraklatıldığında yayın alıcınızın kaydını iptal etmeniz gerekir. Uygulama devam ettirildiğinde önce mevcut yönetilen yapılandırmaları kontrol edin (Yönetilen Yapılandırmaları Kontrol Etme bölümünde açıklandığı gibi), ardından yayın alıcınızı kaydederek uygulama etkin durumdayken yapılan yapılandırma değişiklikleri hakkında bilgilendirildiğinizden emin olun.

EMM'lere yönetilen yapılandırma geri bildirimi gönderme

Yönetilen yapılandırma değişikliklerini uygulamanıza uyguladıktan sonra, en iyi yöntem EMM'lere değişikliğin durumu hakkında bilgi vermektir. Android, anahtarlı uygulama durumları adlı bir özelliği destekler. Uygulamanız, yönetilen yapılandırma değişikliklerini uygulamaya her çalıştığında geri bildirim göndermek için bu özelliği kullanabilirsiniz. Bu geri bildirim, uygulamanızın yönetilen yapılandırmaları başarıyla ayarladığını onaylayan bir onay işlevi görebilir veya uygulamanız belirtilen değişiklikleri uygulayamıyorsa hata mesajı içerebilir.

EMM sağlayıcıları bu geri bildirimi alıp BT yöneticilerinin görüntülemesi için konsollarında gösterebilir. Uygulamanıza geri bildirim desteği ekleme konusunda ayrıntılı bir kılavuz da dahil olmak üzere konuyla ilgili daha fazla bilgi için EMM'lere uygulama geri bildirimi gönderme bölümüne göz atın.

Ek kod örnekleri

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