Enterprise Android App Config - 应用程序限制 - 未按预期工作
Enterprise Android App Config - Application Restrictions - Not working as expected
真的可以使用一些指导来调试/解决我遇到的这个问题。
我构建了我的第一个应用程序,旨在通过企业 MDM/EMM 服务进行配置。我创建了 app_restrictions.xml 文件,并设置了我的 Bundle 以便从该文件中读取限制。
当 运行 在连接到我的计算机的设备上进行调试时,我可以成功地从 XML 文件中读取所有值
然而,一旦我将其投入生产,问题就出现了。
我已将应用发布到 Play 商店,并将应用添加到 EMM/MDM。
我可以看到托管配置设置都出现在 EMM/MDM 中 - 所以到目前为止我已经掌握了所有内容。
然而,一旦应用程序以备用配置推送到设备,读入的值就不是 EMM/MDM 中的自定义值 - 它们是我在 XML 中的默认值我开发的。
我找不到任何关于对这部分过程进行故障排除的好资源。
有人做过这个有什么想法吗?
当您使用此方法时:getManifestRestriction restriction manager gets XML app restrictions, but when you use this method: getApplicationRestrictions 应用会读取您的限制 EMM/MDM,此外,您必须配置一个广播接收器来侦听您的政策中的任何更改。
还有一件事:在我的例子中,我必须创建一个包含所有应用程序限制的共享首选项,以保存当前设置并避免设备在重启后删除它们。
我最近一直在创建大量 B2B 应用程序,为客户提供在每台设备或每台部署的基础上自定义应用程序的能力至关重要。
这是我的指南,用于将 App Config 设置添加到您的应用程序中,以便任何 MDM 能够通过托管 Google Play 商店利用这些设置:
清单:
您必须在部分中包含此内容:
<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
尽情享受吧!!!
真的可以使用一些指导来调试/解决我遇到的这个问题。
我构建了我的第一个应用程序,旨在通过企业 MDM/EMM 服务进行配置。我创建了 app_restrictions.xml 文件,并设置了我的 Bundle 以便从该文件中读取限制。
当 运行 在连接到我的计算机的设备上进行调试时,我可以成功地从 XML 文件中读取所有值
然而,一旦我将其投入生产,问题就出现了。
我已将应用发布到 Play 商店,并将应用添加到 EMM/MDM。
我可以看到托管配置设置都出现在 EMM/MDM 中 - 所以到目前为止我已经掌握了所有内容。
然而,一旦应用程序以备用配置推送到设备,读入的值就不是 EMM/MDM 中的自定义值 - 它们是我在 XML 中的默认值我开发的。
我找不到任何关于对这部分过程进行故障排除的好资源。
有人做过这个有什么想法吗?
当您使用此方法时:getManifestRestriction restriction manager gets XML app restrictions, but when you use this method: getApplicationRestrictions 应用会读取您的限制 EMM/MDM,此外,您必须配置一个广播接收器来侦听您的政策中的任何更改。
还有一件事:在我的例子中,我必须创建一个包含所有应用程序限制的共享首选项,以保存当前设置并避免设备在重启后删除它们。
我最近一直在创建大量 B2B 应用程序,为客户提供在每台设备或每台部署的基础上自定义应用程序的能力至关重要。
这是我的指南,用于将 App Config 设置添加到您的应用程序中,以便任何 MDM 能够通过托管 Google Play 商店利用这些设置:
清单: 您必须在部分中包含此内容:
<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
尽情享受吧!!!