إعداد عمليات الضبط المُدارة

إذا كنت تطوّر تطبيقات لسوق المؤسسات، قد تحتاج إلى لتلبية متطلبات معينة تحددها سياسات المؤسسة. عمليات الضبط المُدارة، التي كانت تُعرف سابقًا باسم قيود التطبيق، تسمح لمشرف تكنولوجيا المعلومات في المؤسسة بتحديد إعدادات التطبيقات. هذه الإمكانية مفيدة بشكل خاص للمنصات التي تعتمدها التطبيقات المنشورة في ملف العمل.

على سبيل المثال، قد تطلب إحدى المؤسسات أن تسمح التطبيقات التي تمت الموافقة عليها مشرف تكنولوجيا المعلومات لتنفيذ ما يلي:

  • السماح بعناوين URL أو حظرها في متصفِّح ويب
  • يمكنك ضبط ما إذا كان مسموحًا للتطبيق بمزامنة المحتوى عبر شبكة الجوّال أو فقط باستخدام Wi-Fi
  • ضبط إعدادات البريد الإلكتروني للتطبيق

يعرض هذا الدليل كيفية تنفيذ إعدادات الضبط المُدارة في تطبيقك. لعرض نماذج التطبيقات باستخدام إعدادات مُدَارة، يُرجى الاطّلاع على ManagedConfigurations. إذا كنت مطوّر برامج لإدارة الخدمات الجوّالة للمؤسسات (EMM)، راجع دليل واجهة برمجة التطبيقات لإدارة Android.

ملاحظة: لأسباب سابقة، تُعرف إعدادات الضبط هذه باسم القيود، ويتم تنفيذها مع الملفات والفئات التي تستخدم هذا مصطلح (مثل RestrictionsManager). ومع ذلك، فإن هذه القيود تنفيذ مجموعة واسعة من خيارات التهيئة، وليس فقط القيود على وظائف التطبيق.

نظرة عامة على الإعدادات عن بُعد

تحدِّد التطبيقات خيارات الضبط المُدارة التي يمكن إجراؤها عن بُعد التي ضبطها أحد مشرفي تكنولوجيا المعلومات. وهذه هي الإعدادات العشوائية التي يمكن تم تغييره من خلال موفِّر ضبط مُدار. إذا كان تطبيقك يعمل في ملف شخصي للعمل، يمكن لمشرف تكنولوجيا المعلومات تغيير الإعدادات المُدارة لتطبيقك.

موفِّر الإعدادات المُدارة هو تطبيق آخر يتم تشغيله على الجهاز نفسه. يتحكّم مشرف تكنولوجيا المعلومات عادةً في هذا التطبيق. تشير رسالة الأشكال البيانية يُبلغ مشرف تكنولوجيا المعلومات بالتغييرات التي تم إجراؤها على الإعدادات في الحسابات المُدارة تطبيق موفر الضبط. وهذا التطبيق، بدوره، يغيّر الإعدادات في تطبيقك.

لتقديم عمليات ضبط مُدارة خارجيًا:

  • يُرجى تعريف الإعدادات المُدارة في بيان التطبيق. التنفيذ لذا فهي تتيح لمشرف تكنولوجيا المعلومات قراءة من خلال واجهات برمجة تطبيقات Google Play.
  • عند استئناف التطبيق، استخدِم كائن RestrictionsManager للتحقّق من الإعدادات المُدارة وتغيير واجهة المستخدم وسلوك التطبيق إلى والتوافق مع هذه التكوينات.
  • استمع إلى هدف واحد (ACTION_APPLICATION_RESTRICTIONS_CHANGED). عندما تتلقى هذه الرسالة الْإِعْلَانْ عَلَى كُلِّ الْأَجْهِزَة، مُمْكِنْ إِلْقَاءْ نَظْرَة عَلَى RestrictionsManager لِمَعْرِفِةْ الإعدادات المُدارة الحالية وإجراء أي تغييرات ضرورية على سلوك التطبيق.

تحديد عمليات الضبط المُدارة

يمكن أن يتيح تطبيقك أي إعدادات مُدارة تريد تحديدها. أنت تعلن عن الإعدادات المُدارة للتطبيق في ملف عمليات إعداد مُدار، مع الإفصاح عن ملف الإعدادات في البيان. يسمح إنشاء ملف تهيئة التطبيقات الأخرى لفحص الإعدادات المُدارة التي يوفّرها تطبيقك. شركاء إدارة الخدمات الجوّالة للمؤسسات (EMM) قراءة إعدادات تطبيقك باستخدام واجهات برمجة تطبيقات Google Play.

لتحديد خيارات الضبط عن بُعد في تطبيقك، أضِف العنصر التالي في بيان التطبيق العنصر <application>:

<meta-data android:name="android.content.APP_RESTRICTIONS"
    android:resource="@xml/app_restrictions" />

عليك إنشاء ملف باسم "app_restrictions.xml" في ملف دليل res/xml. يتم وصف بنية هذا الملف في كمرجع لـ RestrictionsManager. يحتوي الملف على عنصر <restrictions> واحد بمستوى أعلى، والذي يحتوي على عنصر <restriction> ثانوي واحد لكل إعداد التي يمتلكها التطبيق.

ملاحظة: لا تنشئ نُسخًا مترجمة من ملف إعداد مُدار. لا يُسمح لتطبيقك إلا بالحصول على ملف تكوين واحد مُدار، بحيث تكون عمليات التهيئة متناسقة لتطبيقك بجميع اللغات.

وفي بيئة مؤسسية، عادةً ما تستخدم إدارة الخدمات الجوّالة للمؤسسات (EMM) واجهة برمجة التطبيقات مخطط الإعداد لإنشاء وحدة تحكم عن بُعد لتكنولوجيا المعلومات حتى يتمكن المشرفون من تهيئة التطبيق.

يمكن لموفِّر خدمة الضبط المُدار طلب البحث عن التطبيق للعثور على التفاصيل على الإعدادات المتاحة للتطبيق، بما في ذلك وصفها النص. يمكن لمقدِّم عمليات الضبط ومشرف تكنولوجيا المعلومات تغيير إعدادات تطبيقك. عمليات الإعداد المُدارة في أي وقت، حتى في حال عدم تشغيل التطبيق.

على سبيل المثال، لنفترض أنّه يمكن ضبط تطبيقك عن بُعد للسماح أو حظر لتنزيل البيانات عبر اتصال شبكة خلوية. قد يحتوي تطبيقك على عنصر <restriction> مثل هذا:

<?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>

يمكنك استخدام سمة android:key لكل إعداد من أجل: قراءة قيمتها من حزمة ضبط مُدارة. لهذا السبب، ويجب أن يكون لكل تهيئة سلسلة مفاتيح فريدة، كما أن السلسلة لا يمكن أقلمته. يجب تحديدها بسلسلة حرفية.

ملاحظة: في تطبيق الإنتاج، لا يمكن لـ android:title يجب الحصول على الحقل android:description من مورد مترجَم. كما هو موضح في الأقلمة باستخدام الموارد:

يحدّد التطبيق القيود باستخدام الحِزم داخل bundle_array. على سبيل المثال، يمكن لتطبيق به خيارات متعددة لاتصال VPN تحديد كل خادم من خوادم VPN والضبط في bundle، مع عدة خيارات مجموعات مجمعة معًا في مصفوفة حزمة:

<?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 مدرجة في الجدول 1 وموثقة في مرجع RestrictionsManager RestrictionEntry

الجدول 1. أنواع إدخالات القيود والاستخدام

النوع android:restrictionType معدّل الاستخدام
TYPE_BOOLEAN "bool" قيمة منطقية، صواب أم خطأ.
TYPE_STRING "string" قيمة سلسلة، مثل الاسم.
TYPE_INTEGER "integer" عدد صحيح بقيمة من من MIN_VALUE إلى MAX_VALUE
TYPE_CHOICE "choice" قيمة سلسلة تم اختيارها من android:entryValues، يتم تقديمها عادةً كقائمة محددة واحدة.
TYPE_MULTI_SELECT "multi-select" مصفوفة سلسلة تحتوي على قيم تم اختيارها من android:entryValues استخدِم هذا الخيار لعرض قائمة متعددة الاختيارات، حيث تتضمّن أكثر من قائمة. إمكانية اختيار إدخال، مثل اختيار عناوين محدَّدة لإدراجها في القائمة المسموح بها.
TYPE_NULL "hidden" نوع القيود المخفية استخدم هذا النوع للمعلومات التي يجب نقلها ولكن لا ينبغي تقديمها إلى المستخدم في واجهة المستخدم. تخزن قيمة سلسلة واحدة.
TYPE_BUNDLE_ARRAY "bundle_array" استخدِم هذا الخيار لتخزين مجموعات القيود. bundles تتوفّر هذه الميزة في الإصدار Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات).

ملاحظة: android:entryValues قابلة للقراءة آليًا ولا يمكن مترجَمة. استخدِم android:entries لتقديم قيم يفهمها الإنسان ويمكن ترجمتها. يجب أن يكون لكل إدخال فهرس مقابل في android:entryValues.

التحقّق من الإعدادات المُدارة

لا يتم إرسال إشعار إلى تطبيقك تلقائيًا عند تغيير تطبيقات أخرى له. إعدادات الضبط. بدلاً من ذلك، تحتاج إلى التحقق من بيئة إدارة الإعدادات هي عند بدء تشغيل التطبيق أو استئنافه، والاستماع والنظام لمعرفة ما إذا كانت التكوينات تتغير أثناء تطبيقك قيد التشغيل.

لمعرفة إعدادات الضبط الحالية، يستخدم تطبيقك عنصر RestrictionsManager. يجب أن تحقَّق من الإعدادات المُدارة الحالية في الأوقات التالية:

للحصول على عنصر RestrictionsManager، احصل على العنصر الحالي النشاط باستخدام "getActivity()"، ثم لاستدعاء طريقة Activity.getSystemService() لهذا النشاط:

Kotlin

var myRestrictionsMgr =
        activity?.getSystemService(Context.RESTRICTIONS_SERVICE) as RestrictionsManager

Java

RestrictionsManager myRestrictionsMgr =
    (RestrictionsManager) getActivity()
        .getSystemService(Context.RESTRICTIONS_SERVICE);

بعد الحصول على RestrictionsManager، يمكنك الحصول على إعدادات التهيئة الحالية من خلال استدعاء طريقة getApplicationRestrictions():

Kotlin

var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions

Java

Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

ملاحظة: لتسهيل الأمر، يمكنك أيضًا استرجاع الملف الإعدادات باستخدام UserManager، من خلال استدعاء UserManager.getApplicationRestrictions() تعمل هذه الطريقة بالضبط مماثلة لـ RestrictionsManager.getApplicationRestrictions().

تتطلب الطريقة getApplicationRestrictions() القراءة من مساحة تخزين البيانات، لذلك فيجب القيام به باعتدال. لا تستدعي هذه الطريقة في كل مرة تحتاج فيها إلى التعرف على التكوين الحالي. بدلاً من ذلك، يجب عليك طلبه مرة واحدة عندما لا يكون تطبيقك تبدأ أو تستأنف، وتخزّن مؤقتًا حزمة الإعدادات المُدارة التي تم جلبها. ثم استمِع لهدف ACTION_APPLICATION_RESTRICTIONS_CHANGED لمعرفة ما إذا كانت الإعدادات التغيير عندما يكون تطبيقك نشطًا، كما هو موضّح في الاستماع إلى تغييرات الإعدادات المُدارة

قراءة الإعدادات المُدارة وتطبيقها

تُرجع الطريقة getApplicationRestrictions() القيمة Bundle يحتوي على زوج المفتاح/القيمة لكل إعداد تم تعيينه. تشير رسالة الأشكال البيانية القيم كلها من النوع Boolean أو int String، وString[]. بمجرد حصولك على Bundle، يمكنك مراجعة الإعدادات الحالية إعدادات الضبط باستخدام طرق Bundle العادية أنواع البيانات هذه، مثل getBoolean() أو getString()

ملاحظة: عمليات الضبط المُدارة Bundle على عنصر واحد لكل إعداد تم ضبطه صراحةً من قِبل عمليات الإعداد المُدارة. ومع ذلك، لا يمكنك افتراض أن سيكون التكوين موجودًا في الحزمة لمجرد أنك حددت القيمة التلقائية في ملف XML لعمليات الضبط المُدارة.

يرجع الأمر إلى تطبيقك في اتخاذ الإجراء المناسب استنادًا إلى إعدادات الضبط المُدَارة. على سبيل المثال، إذا كان تطبيقك يحتوي على إعدادات تحديد ما إذا كان يمكن تنزيل البيانات عبر الاتصال الخلوي، وتجد أن التهيئة تم تعيينها على false، سيكون عليك إيقاف تنزيل البيانات إلا في الحالات التالية: اتصال الجهاز بشبكة Wi-Fi، كما هو موضح في المثال التالي:

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
}

لتطبيق العديد من القيود المتداخلة، يُرجى الاطّلاع على bundle_array إدخال قيود كمجموعة من Parcelable من العناصر والإرسال كـ Bundle. في هذا المثال، قد توصلت تهيئة كل شبكة VPN يتم تحليل البيانات واستخدامها لإنشاء قائمة بخيارات اتصال الخادم:

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
}

رصد التغييرات في الإعدادات المُدارة

وعندما يتم تغيير عمليات الضبط المُدارة لأحد التطبيقات، ينشط النظام هدف واحد (ACTION_APPLICATION_RESTRICTIONS_CHANGED). يجب أن يصغي تطبيقك إلى هذا الغرض حتى تتمكن من تغيير سلوك التطبيق عند ضبط إعدادات التغيير.

ملاحظة: يتم إرسال هدف ACTION_APPLICATION_RESTRICTIONS_CHANGED إلى المستمعين فقط. يتم تسجيلها ديناميكيًا، وليس للمستمعين الذين تم تعريفهم في بيان التطبيق.

يوضح الرمز التالي كيفية التسجيل الديناميكي لجهاز استقبال البث هذا القصد:

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);

ملاحظة: لا يحتاج تطبيقك عادةً إلى إشعار حول تغييرات الضبط عند إيقافه مؤقتًا. بدلاً من ذلك، يجب إلغاء التسجيل جهاز استقبال البث عندما يكون التطبيق متوقفًا مؤقتًا. عند استئناف التطبيق، يمكنك التحقق أولاً من عمليات الضبط المُدارة الحالية (كما تمت مناقشته في راجِع الإعدادات المُدارة)، ثم سجِّل للتأكّد من تلقّي إشعارات بشأن تغييرات الإعدادات التي تحدث عندما يكون التطبيق نشطًا.

إرسال ملاحظات بشأن الإعدادات المُدارة إلى موفِّري إدارة الخدمات الجوّالة للمؤسسات (EMM)

بعد تطبيق تغييرات الضبط المُدارة على تطبيقك، من أفضل الممارسات إبلاغ إدارة الخدمات الجوّالة للمؤسسات (EMM) بشأن حالة التغيير. يتوافق Android مع ميزة حالات التطبيقات المرتبطة بمفتاح، والتي يمكنك استخدامها لإرسال ملاحظات في كل مرة يحاول فيها تطبيقك تطبيق تغييرات الإعدادات المُدارة. هذا النمط يمكن أن تكون الملاحظات بمثابة تأكيد على أنّ تطبيقك ضبط الإعدادات المُدارة بنجاح أو يمكن أن تضمين رسالة خطأ إذا تعذّر على تطبيقك تطبيق التغييرات المحدّدة.

بإمكان موفِّري إدارة الخدمات الجوّالة للمؤسسات (EMM) استرداد هذه الملاحظات وعرضها في وحدات التحكّم الخاصة بهم لتكنولوجيا المعلومات. المشرفين لعرضها. اطَّلِع على إرسال تعليقات التطبيق إلى إدارة الخدمات الجوّالة للمؤسسات (EMM) لمعرفة المزيد. معلومات حول الموضوع، بما في ذلك دليل تفصيلي حول كيفية إضافة دعم الملاحظات إلى تطبيقك.

عيّنات تعليمات برمجية إضافية

managedConfigurations يوضح العينة أيضًا استخدام واجهات برمجة التطبيقات التي تتناولها هذه الصفحة.