Конфигурация корпоративного приложения 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, вы также должны настроить широковещательный приемник для прослушивания любых изменений в ваших политиках.

Еще одна вещь: в моем случае мне пришлось создать общие настройки со всеми ограничениями приложений, чтобы сохранить текущие настройки и избежать их стирания устройством после перезагрузки.

Другие вопросы по тегам