Конфигурация корпоративного приложения Android - Ограничения приложений - Не работает должным образом
На самом деле можно использовать некоторые рекомендации по отладке / устранению этой проблемы, с которой я столкнулся.
Я создал свое первое приложение, предназначенное для настройки службой Enterprise MDM / EMM. Я создал файл app_restrictions.xml и настроил свой Bundle так, чтобы ограничения считывались из этого файла.
При запуске отладки на устройстве, подключенном к моему компьютеру, я могу успешно прочитать все значения из файла XML.
Однако проблема возникает, когда я запускаю его в производство.
Я опубликовал приложение в магазине игр и добавил приложение в EMM / MDM.
Я вижу, что все параметры управляемой конфигурации появляются внутри EMM / MDM, так что у меня все правильно до этого момента.
Однако, как только приложение отправляется с альтернативной конфигурацией на устройство, считываемые значения не являются пользовательскими значениями из EMM / MDM - они являются моими значениями по умолчанию внутри разработанного мной XML.
Я не могу найти хороших ресурсов по устранению неполадок на этой части процесса.
Кто-нибудь делал это раньше, есть идеи?
2 ответа
В последнее время я создаю множество приложений B2B, и очень важно предоставить заказчику возможность настраивать приложение для каждого устройства или развертывания.
Вот мое руководство по добавлению настроек App Config в ваше приложение, чтобы любой MDM мог использовать их через Managed Google Play Store:
Манифест: у вас должно быть это внутри раздела:
<meta-data android:name="android.content.APP_RESTRICTIONS"
android:resource="@xml/app_restrictions" />
app_restrictions.xml Этот файл будет содержать ограничения вашего приложения. Есть только несколько вариантов ограничений приложений, но вы можете заставить это работать самыми разными творческими способами. вот базовый набор ограничений:
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">
<restriction
android:key="LicenseKey"
android:title="@string/LicenseKey"
android:restrictionType="string"
android:description="@string/LicenseKey_Description"
android:defaultValue="" />
<restriction
android:key="Section1"
android:title="Settings"
android:restrictionType="bundle">
<restriction
android:key="Setting1"
android:title="Setting 1"
android:description="More descriptive description here"
android:restrictionType="choice"
android:entryValues="@array/setting_1_array_values"
android:entries="@array/setting_1_array_choices"
android:defaultValue="@string/setting_1"/>
<restriction
android:key="Setting2"
android:title="Setting 2"
android:description="More descriptive description here"
android:restrictionType="string"
android:defaultValue="Some default string value here" />
<restriction
android:key="Setting3"
android:title="Setting 3"
android:description="More descriptive description here"
android:restrictionType="integer"
android:defaultValue="20" />
</restriction>
<restriction
android:key="Section 2"
android:title="Group things in more sections to make it easier to manage if you have lots of settings"
android:restrictionType="bundle">
<restriction
android:key="Setting4"
android:title="Setting 4"
android:description="More descriptive description here"
android:restrictionType="integer"
android:defaultValue="20" />
<restriction
android:key="Setting5"
android:title="Setting 5"
android:description="More descriptive description here"
android:restrictionType="integer"
android:defaultValue="20" />
</restriction>
Для некоторых из ваших ограничений вам может понадобиться предварительно определенный список элементов в раскрывающемся селекторе стилей - как показано выше, вы можете использовать для этого массив и поместить следующее в свой Strings.xml
Strings.xml:
<string-array name="setting_1_array_choices">
<item>"Choose This for Option A"</item>
<item>"Choose This for Option B"</item>
</string-array>
<string-array name="setting_1_array_values">
<item>option_a</item>
<item>option_b</item>
</string-array>
Теперь - загружаем эти ограничения в ваше приложение:
RestrictionsManager manager = (RestrictionsManager) getSystemService(this.RESTRICTIONS_SERVICE);
Bundle restrictions = manager.getApplicationRestrictions();
loadRestrictions(restrictions);
Чтобы загрузить их, я создал этот пример loadRestrictions:
private void loadRestrictions (Bundle bundle) {
Set<String> keys = bundle.keySet();
if (keys.isEmpty()) {
//empty key set here
//nothing sent via MDM App Config
} else {
//we've got keys to process
for (String k : keys) {
Object value = bundle.get(k);
String valueString = "";
if (value != null) {
valueString = value.toString();
}
switch (k) {
case "Section1":
if (value != null) {
loadRestrictions((Bundle) value);
}
break;
case "Section2":
if (value != null) {
loadRestrictions((Bundle) value);
}
break;
case "Setting1":
//Setting 1
// this is an array of choices
String optionChoice = "";
if(valueString.equals("option_a")) {
optionChoice = "Option A Was Chosen";
} else if (valueString.equals("option_b")) {
optionChoice = "Option B Was Chosen";
} else {
//we should not ever get here?
optionChoice = "ERROR?";
}
break;
case "Setting2":
//Setting 1
// value for this key is in valueString
String setting2 = (String) valueString;
break;
case "Setting3":
//Setting 3
// INTEGER value for this key is in value
int setting3 = (int) value;
break;
case "Setting4":
//Setting 4
// INTEGER value for this key is in value
int setting4 = (int) value;
break;
case "Setting5":
//Setting 5
// INTEGER value for this key is in value
int setting5 = (int) value;
break;
default:
//another odd error occurred here
break;
} //switch
} //for keys
}
}//load restrictions
Наслаждаться!!!
Когда вы используете этот метод: диспетчер ограничений getManifestRestriction получает ограничения приложения XML, но когда вы используете этот метод: getApplicationRestrictions, приложение считывает ограничения из вашего EMM / MDM, вы также должны настроить широковещательный приемник для прослушивания любых изменений в ваших политиках.
Еще одна вещь: в моем случае мне пришлось создать общие настройки со всеми ограничениями приложений, чтобы сохранить текущие настройки и избежать их стирания устройством после перезагрузки.