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çinRestrictionsManager
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:
- Uygulamanın
onResume()
yönteminde başlatıldığında veya devam ettirildiğinde - Uygulama, Yönetilen Yapılandırma Değişikliklerini Dinleme bölümünde açıklandığı gibi bir yapılandırma değişikliğiyle ilgili bildirim aldığında
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.