إذا كنت تطوّر تطبيقات لسوق المؤسسات، قد تحتاج إلى لتلبية متطلبات معينة تحددها سياسات المؤسسة. عمليات الضبط المُدارة، التي كانت تُعرف سابقًا باسم قيود التطبيق، تسمح لمشرف تكنولوجيا المعلومات في المؤسسة بتحديد إعدادات التطبيقات. هذه الإمكانية مفيدة بشكل خاص للمنصات التي تعتمدها التطبيقات المنشورة في ملف العمل.
على سبيل المثال، قد تطلب إحدى المؤسسات أن تسمح التطبيقات التي تمت الموافقة عليها مشرف تكنولوجيا المعلومات لتنفيذ ما يلي:
- السماح بعناوين 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
النوع | 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
. يجب أن
تحقَّق من الإعدادات المُدارة الحالية في الأوقات التالية:
- عند تشغيل التطبيق أو استئناف تشغيله،
طريقة واحدة (
onResume()
) - عندما يتم إشعار التطبيق بتغيير في الإعدادات، كما هو موضّح في الاستماع إلى الإعدادات المُدارة التغييرات
للحصول على عنصر 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 يوضح العينة أيضًا استخدام واجهات برمجة التطبيقات التي تتناولها هذه الصفحة.