Jeśli tworzysz aplikacje na rynek korporacyjny, być może trzeba będzie w celu spełnienia określonych wymagań określonych w zasadach organizacji. Konfiguracje zarządzane (znane wcześniej jako ograniczenia aplikacji), zezwól administratorowi IT organizacji na zdalne określanie ustawień aplikacji. Ta funkcja jest szczególnie przydatna w przypadku organizacji zatwierdzonych aplikacji wdrożonych w profilu służbowym.
Na przykład organizacja może wymagać, aby zatwierdzone aplikacje zezwalały na Administrator IT do:
- Zezwalanie na adresy URL w przeglądarce i blokowanie ich
- Określ, czy aplikacja może synchronizować treści przez sieć komórkową czy tylko przez Wi-Fi
- Konfigurowanie ustawień poczty e-mail w aplikacji
Z tego przewodnika dowiesz się, jak wdrożyć ustawienia konfiguracji zarządzanej w do aplikacji. Przykładowe aplikacje z konfiguracją zarządzaną znajdziesz na stronie ManagedConfigurations (Konfiguracje zarządzane). Jeśli jesteś deweloperem usług zarządzania urządzeniami mobilnymi (EMM), zapoznaj się z przewodnikiem po interfejsie Android Management API.
Uwaga: ze względów historycznych te ustawienia konfiguracji są nazywane
są zaimplementowane za pomocą plików i klas,które korzystają z tego ograniczenia.
(np. RestrictionsManager
). Jednak te
pozwalają implementować szeroką gamę opcji konfiguracji,
nie tylko ograniczenia funkcji aplikacji.
Omówienie konfiguracji zdalnej
Aplikacje definiują opcje konfiguracji zarządzanej, które można zdalnie ustawione przez administratora IT. Są to dowolne ustawienia, których zmienione przez dostawcę konfiguracji zarządzanej. Jeśli aplikacja działa w profilu służbowym, administrator IT może zmienić konfigurację zarządzaną aplikacji.
Dostawca konfiguracji zarządzanych to inna aplikacja uruchomiona na tym samym urządzeniu. Tą aplikacją zwykle zarządza administrator IT. administrator IT przekazuje zmiany w konfiguracji do zarządzanego aplikacji dostawcy konfiguracji. Aplikacja z kolei zmieni konfigurację.
Aby udostępnić konfiguracje zarządzane zewnętrznie:
- Zadeklaruj konfiguracje zarządzane w manifeście aplikacji. Wykonuję więc administrator IT może odczytać za pomocą interfejsów Google Play API.
- Przy każdym wznowieniu aplikacji użyj obiektu
RestrictionsManager
, aby sprawdzić bieżącą konfiguracjach zarządzanych oraz zmienić UI i działanie aplikacji na zgodne z tymi konfiguracjami. - Posłuchaj:
Intencja
ACTION_APPLICATION_RESTRICTIONS_CHANGED
. Po otrzymaniu prześlij wiadomość, sprawdźRestrictionsManager
, aby zobaczyć co i wprowadź niezbędne zmiany w zachowanie aplikacji.
Definiowanie konfiguracji zarządzanych
Aplikacja może obsługiwać dowolną konfigurację zarządzaną, którą chcesz zdefiniować. Deklarujesz zarządzanych konfiguracji aplikacji w pliku konfiguracji zarządzanych i zadeklarować pliku konfiguracji w pliku manifestu. Utworzenie pliku konfiguracji umożliwia do przeanalizowania konfiguracji zarządzanych udostępnianych przez Twoją aplikację. Partnerzy EMM może odczytywać konfiguracje aplikacji przy użyciu interfejsów API Google Play.
Aby określić opcje zdalnej konfiguracji aplikacji, umieść następujący element
w pliku manifestu
Element <application>
:
<meta-data android:name="android.content.APP_RESTRICTIONS" android:resource="@xml/app_restrictions" />
Utwórz plik o nazwie app_restrictions.xml
w folderze aplikacji
res/xml
. Struktura tego pliku jest opisana tutaj:
plik referencyjny RestrictionsManager
. Plik zawiera
pojedynczy element <restrictions>
najwyższego poziomu, który zawiera
po 1 elemencie podrzędnym <restriction>
dla każdej konfiguracji
z dostępnych dla aplikacji opcji.
Uwaga: nie twórz zlokalizowanych wersji interfejsu pliku konfiguracji zarządzanej. Aplikacja może mieć tylko jeden plik konfiguracji zarządzanej, dlatego konfiguracje będą spójne dla aplikacji we wszystkich regionach.
W środowisku firmowym dostawca usług EMM zwykle używa zarządzanych schemat konfiguracji do generowania konsoli zdalnej dla działu IT administratorzy będą mogli zdalnie konfigurować aplikacji.
Dostawca konfiguracji zarządzanej może wysyłać zapytania do aplikacji, aby znaleźć szczegóły na temat dostępnych konfiguracji aplikacji, w tym ich opisu tekstu. Dostawca konfiguracji i administrator IT może zmienić ustawienia konfiguracje zarządzane w każdej chwili, nawet wtedy, gdy aplikacja nie jest uruchomiona.
Załóżmy na przykład, że aplikację można zdalnie skonfigurować w taki sposób, aby zezwalać na dostęp lub go blokować.
, by pobierać dane przez sieć komórkową. Aplikacja może mieć
<restriction>
element podobny do tego:
<?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>
Atrybutu android:key
każdej konfiguracji używasz do:
odczytuje jego wartość z pakietu konfiguracji zarządzanej. Z tego powodu
każda konfiguracja musi mieć unikalny ciąg klucza, a ciąg
nie można zlokalizować. Musi być określona za pomocą literału ciągu.
Uwaga: w produkcyjnej aplikacji funkcje android:title
oraz
android:description
należy pobrać ze zlokalizowanego zasobu
zgodnie z opisem w
Lokalizacja przy użyciu zasobów.
Aplikacja definiuje ograniczenia za pomocą pakietów w obrębie bundle_array
.
Na przykład aplikacja z wieloma opcjami połączeń VPN może zdefiniować każdy serwer VPN.
konfiguracja w: bundle
z wieloma
pakiety w tablicy pakietów:
<?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>
Obsługiwane typy elementu android:restrictionType
zostały wymienione w tabeli 1 i udokumentowane w
referencyjnym dla RestrictionsManager
i
RestrictionEntry
.
Typ | android:typ ograniczenia | Typowe zastosowanie |
---|---|---|
TYPE_BOOLEAN
|
"bool" |
Wartość logiczna (prawda lub fałsz). |
TYPE_STRING
|
"string" |
Wartość będąca ciągiem znaków, np. nazwa. |
TYPE_INTEGER
|
"integer" |
Liczba całkowita z wartością od
MIN_VALUE do
MAX_VALUE
|
TYPE_CHOICE
|
"choice" |
Wartość typu ciąg znaków wybrana z pola android:entryValues ,
zwykle przedstawiane na liście jednokrotnego wyboru.
|
TYPE_MULTI_SELECT
|
"multi-select" |
Tablica ciągu z wartościami wybranymi z android:entryValues .
Służy do przedstawiania listy wielokrotnego wyboru, na której znajduje się więcej niż jedna
wpisu, np. aby wybrać konkretne tytuły do listy dozwolonych.
|
TYPE_NULL
|
"hidden" |
Ukryty typ ograniczenia. Zastosuj ten typ danych do informacji, które: muszą być przesyłane między usługami, ale nie powinny być prezentowane użytkownika w interfejsie. Zapisuje pojedynczą wartość ciągu znaków. |
TYPE_BUNDLE_ARRAY
|
"bundle_array" |
Służy do przechowywania tablic z ograniczeniami
bundles Dostępne w Androidzie 6.0 (poziom API 23).
|
Uwaga: android:entryValues
są czytelne dla komputera, więc nie
i zlokalizowanego. Użyj android:entries
, aby przedstawić zrozumiałe dla człowieka wartości, które można zlokalizować.
Każdy wpis musi mieć odpowiedni indeks w polu android:entryValues
.
Sprawdzanie konfiguracji zarządzanych
Aplikacja nie jest automatycznie powiadamiana, gdy inne aplikacje zmienią jej ustawienia konfiguracji. Zamiast tego musisz sprawdzić, co zarządza konfiguracji to moment uruchomienia lub wznawiania aplikacji i nasłuchiwać intencja systemu, by sprawdzić, czy konfiguracje zmieniają się jest uruchomiona aplikacja.
Aby poznać bieżące ustawienia konfiguracji, aplikacja używa
RestrictionsManager
obiekt. Aplikacja powinna
sprawdź bieżące konfiguracje zarządzane w tych godzinach:
- Przy uruchomieniu lub wznowieniu działania aplikacji
onResume()
metoda - Gdy aplikacja zostanie powiadomiona o zmianie konfiguracji, tak jak to opisano w sekcji Nasłuchuj konfiguracji zarządzanej Zmiany
Aby uzyskać obiekt RestrictionsManager
, pobierz bieżącą
aktywność z użytkownikiem getActivity()
, a potem
wywołaj metodę Activity.getSystemService()
tej aktywności:
Kotlin
var myRestrictionsMgr = activity?.getSystemService(Context.RESTRICTIONS_SERVICE) as RestrictionsManager
Java
RestrictionsManager myRestrictionsMgr = (RestrictionsManager) getActivity() .getSystemService(Context.RESTRICTIONS_SERVICE);
Gdy już będziesz mieć RestrictionsManager
, możesz uzyskać dostęp do
bieżących ustawień konfiguracji przez wywołanie
Metoda getApplicationRestrictions()
:
Kotlin
var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions
Java
Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();
Uwaga: dla wygody możesz też pobrać aktualną
konfiguracji z parametrem UserManager
, wywołując
UserManager.getApplicationRestrictions()
Ta metoda działa dokładnie
taka sama jak RestrictionsManager.getApplicationRestrictions()
.
Metoda getApplicationRestrictions()
wymaga odczytu z magazynu danych, więc
robić to z umiarem. Nie wywołuj tej metody za każdym razem, gdy chcesz
aby poznać bieżącą konfigurację. Wywołuj je raz, gdy aplikacja
uruchamia lub wznawia działanie oraz zapisuje w pamięci podręcznej pobrany pakiet konfiguracji zarządzanych. Potem słuchaj
dla intencji ACTION_APPLICATION_RESTRICTIONS_CHANGED
, by sprawdzić, czy konfiguracja
zmienia się, gdy aplikacja jest aktywna, zgodnie z opisem na stronie
Nasłuchuj zmian konfiguracji zarządzanej.
Odczytywanie i stosowanie konfiguracji zarządzanych
Metoda getApplicationRestrictions()
zwraca Bundle
zawierające pary klucz-wartość dla każdej ustawionej konfiguracji.
wszystkie wartości to Boolean
, int
,
String
i String[]
. Po zainstalowaniu wersji
konfiguracje zarządzane Bundle
, możesz sprawdzić bieżącą
ze standardowymi metodami Bundle
dla
tych typów danych, takich jak getBoolean()
lub
getString()
Uwaga: konfiguracje zarządzane Bundle
zawiera po jednym elemencie dla każdej konfiguracji, która została jawnie ustawiona przez
dostawcy konfiguracji zarządzanych. Nie można jednak założyć, że
będzie podana w pakiecie tylko dlatego, że masz zdefiniowaną wartość domyślną
w pliku XML konfiguracji zarządzanych.
Aplikacja podejmuje odpowiednie działania na podstawie
ustawieniami konfiguracji zarządzanej. Jeśli na przykład aplikacja ma
określającą, czy może ona pobierać dane przez
i okazuje się, że jest ustawiona na połączenie z siecią komórkową.
false
, musisz wyłączyć pobieranie danych, chyba że
urządzenie jest połączone z siecią Wi-Fi, tak jak w tym przykładowym kodzie:
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 }
Aby zastosować wiele ograniczeń zagnieżdżonych, przeczytaj artykuł
bundle_array
wpis ograniczenia jako zbiór Parcelable
obiektów
i przesyłać ją jako Bundle
. W tym przykładzie konfiguracja każdej sieci VPN
dane są analizowane i wykorzystywane do tworzenia listy dostępnych połączeń z serwerem:
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 }
Nasłuchuj zmian konfiguracji zarządzanej
Po każdej zmianie konfiguracji zarządzanej aplikacji system uruchamia
Intencja ACTION_APPLICATION_RESTRICTIONS_CHANGED
. Aplikacja musi nasłuchiwać
tę intencję, dzięki czemu możesz zmienić działanie aplikacji, gdy ustawienia konfiguracji
.
Uwaga: intencja ACTION_APPLICATION_RESTRICTIONS_CHANGED
jest wysyłana tylko do detektorów
zarejestrowanych dynamicznie, a nie dla detektorów zadeklarowanych.
w manifeście aplikacji.
Poniższy kod pokazuje, jak dynamicznie zarejestrować odbiornik tę intencję:
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);
Uwaga: zwykle nie trzeba powiadamiać aplikacji. o zmianach konfiguracji po jego wstrzymaniu. Zamiast tego wyrejestruj na odbiorniku, gdy aplikacja jest wstrzymana. Po wznowieniu działania aplikacji najpierw sprawdź bieżące konfiguracje zarządzane (jak omówiono w Sprawdź konfiguracje zarządzane), a następnie zarejestruj Twojego odbiornika, aby upewnić się, że będziesz otrzymywać powiadomienia o zmianach w konfiguracji które pojawiają się, gdy aplikacja jest aktywna.
Wysyłanie do usług EMM opinii o konfiguracji zarządzanej
Po zastosowaniu w aplikacji zmian w konfiguracji zarządzanej warto powiadomić dostawców usług EMM o: stan zmiany. Android obsługuje funkcję o nazwie stany aplikacji z kluczami, którą możesz służy do przesyłania opinii za każdym razem, gdy aplikacja próbuje zastosować zmiany konfiguracji zarządzanej. Ten mogą stanowić potwierdzenie, że aplikacja poprawnie ustawiła konfiguracje zarządzane, jeśli w aplikacji nie zastosowano określonych zmian, pojawi się komunikat o błędzie.
Dostawcy usług EMM mogą pobrać te opinie i wyświetlać je w konsolach dla działu IT do wyświetlenia przez administratorów. Więcej informacji znajdziesz w artykule Przesyłanie opinii o aplikacji do dostawców usług EMM. informacje na dany temat, w tym szczegółowy przewodnik na temat dodawania do aplikacji informacji zwrotnych.
Dodatkowe przykłady kodu
Parametr ManagedConfigurations przykład dokładniej przedstawia wykorzystanie interfejsów API opisanych na tej stronie.