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