الملفات الشخصية للعمل

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

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

نظرة عامة

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

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

إذا كان الجهاز يحتوي على ملف شخصي للعمل، ستكون هناك تأثيرات على التطبيقات التي يتم تشغيلها على الجهاز، بغض النظر عن الملف الشخصي الذي يتم تشغيل التطبيق بموجبه:

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

منع العناصر غير الناجحة

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

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

قبل أن يبدأ تطبيقك نشاطًا، يجب التحقق من وجود حل مناسب. يمكنك التأكد من وجود حل مقبول من خلال الاتصال بـ Intent.resolveActivity(). وإذا لم تكن هناك طريقة لحل الغرض، تعرض الطريقة null. إذا عرضت الطريقة قيمة غير فارغة، تكون هناك طريقة واحدة على الأقل لحل الغرض، وتكون آمنة لإطلاق الغرض. في هذه الحالة، يمكن أن يكون القصد قابلاً للحل إما نظرًا لوجود معالج على الملف الشخصي الحالي، أو لأن الغرض مسموح له بالانتقال إلى المعالج على الملف الشخصي الآخر. (لمزيد من المعلومات عن تحديد الأهداف، راجِع الأهداف الشائعة).

على سبيل المثال، إذا كان تطبيقك يحتاج إلى ضبط موقّتات، يجب التأكّد من توفّر معالج صالح للغرض ACTION_SET_TIMER. وإذا لم يتمكن التطبيق من حل المشكلة، يجب أن يتّخذ الإجراء المناسب (مثل عرض رسالة خطأ).

Kotlin

fun startTimer(message: String, seconds: Int) {

    // Build the "set timer" intent
    val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(packageManager) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent)

    }
}

Java

public void startTimer(String message, int seconds) {

    // Build the "set timer" intent
    Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(getPackageManager()) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent);

    }
}

مشاركة الملفات بين الملفات الشخصية

في بعض الأحيان، يحتاج أحد التطبيقات إلى تزويد تطبيقات أخرى بإمكانية الوصول إلى ملفاته الخاصة. على سبيل المثال، قد يرغب تطبيق معرض صور في مشاركة صوره مع برامج تحرير الصور. هناك طريقتان لمشاركة الملف عادةً: باستخدام file URI أو content URI.

ويبدأ معرّف الموارد المنتظم (URI) للملف بالبادئة file:، متبوعًا بالمسار المطلق للملف على مساحة التخزين في الجهاز. ومع ذلك، نظرًا لاستخدام الملف الشخصي للعمل والملف الشخصي الشخصي لمساحة تخزين منفصلة، لن يكون معرّف الموارد المنتظم (URI) للملف الصالح على أحد الملفات الشخصية صالحًا في الملف الشخصي الآخر. يعني هذا الموقف أنه في حالة إرفاق معرف URI لملف بمهمة، وتم التعامل مع الغرض على الملف الشخصي الآخر، فلن يتمكن المعالج من الوصول إلى الملف.

وبدلاً من ذلك، عليك مشاركة الملفات باستخدام معرّفات الموارد المنتظمة (URI) للمحتوى. تحدد معرفات الموارد المنتظمة للمحتوى الملف بطريقة أكثر أمانًا وقابلة للمشاركة. يشتمل معرف الموارد المنتظم للمحتوى على مسار الملف وكذلك المرجع الذي يوفر الملف ورقم المعرف الذي يحدد الملف. ويمكنك إنشاء Content ID لأي ملف باستخدام FileProvider. يمكنك بعد ذلك مشاركة معرّف المحتوى هذا مع تطبيقات أخرى (حتى في الملف الشخصي الآخر). يمكن للمستلم استخدام Content ID للوصول إلى الملف الفعلي.

على سبيل المثال، إليك كيفية الحصول على معرف الموارد المنتظم للمحتوى لعنوان URI لملف معين:

Kotlin

// Open File object from its file URI
val fileToShare = File(fileUriToShare)

val contentUriToShare: Uri = FileProvider.getUriForFile(
        context,
        "com.example.myapp.fileprovider",
        fileToShare
)

Java

// Open File object from its file URI
File fileToShare = new File(fileUriToShare);

Uri contentUriToShare = FileProvider.getUriForFile(getContext(),
        "com.example.myapp.fileprovider", fileToShare);

عند استدعاء الطريقة getUriForFile()، يجب تضمين مرجع موفّر الملف (في هذا المثال، "com.example.myapp.fileprovider")، المحدد في عنصر <provider> في بيان التطبيق. لمزيد من المعلومات حول مشاركة الملفات باستخدام معرّفات الموارد المنتظمة (URI) للمحتوى، راجِع مشاركة الملفات.

الاستماع إلى الإشعارات

يوفّر التطبيق عادةً فئة فرعية NotificationListenerService لتلقّي معاودة الاتصال من النظام بشأن التغييرات التي يتم إجراؤها على الإشعارات. قد تؤثر الأجهزة التي تتضمّن ملفات شخصية للعمل في طريقة عمل NotificationListenerService مع تطبيقك.

في الملف الشخصي للعمل

لا يمكنك استخدام NotificationListenerService من تطبيق يعمل في الملف الشخصي للعمل. عند تشغيل تطبيقك في ملف شخصي للعمل، يتجاهل النظام عنصر NotificationListenerService لتطبيقك. ومع ذلك، يمكن للتطبيقات التي تعمل في الملف الشخصي الاستماع إلى الإشعارات.

في ملف شخصي

عند تشغيل تطبيقك في الملف الشخصي، قد لا تتلقّى إشعارات للتطبيقات التي يتم تشغيلها في الملف الشخصي للعمل. تتلقّى جميع تطبيقات الملف الشخصي تلقائيًا استدعاءات، ولكن يمكن لمشرف تكنولوجيا المعلومات إضافة تطبيق واحد أو أكثر من تطبيقات الملف الشخصي إلى القائمة المسموح بها للسماح بالاستماع إلى التغييرات في الإشعارات. يحظر النظام بعد ذلك التطبيقات غير المدرَجة في القائمة المسموح بها. في نظام التشغيل Android 8.0 (مستوى واجهة برمجة التطبيقات 26) أو الإصدارات الأحدث، قد تمنع وحدة التحكّم بسياسة الجهاز (DPC) التي تدير ملفًّا شخصيًا للعمل منع تطبيقك من الاستماع إلى إشعارات الملف الشخصي للعمل باستخدام طريقة DevicePolicyManagersetPermittedCrossProfileNotificationListeners(). سيظل تطبيقك يتلقى استدعاءات بشأن الإشعارات المنشورة في الملف الشخصي.

اختبار تطبيقك للتوافُق مع الملفات الشخصية للعمل

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

لقد قدّمنا نموذج تطبيق، TestDPC، يمكنك استخدامه لإعداد ملف شخصي للعمل على جهاز Android يعمل بالإصدار Android 5.0 (المستوى 21 من واجهة برمجة التطبيقات) والإصدارات الأحدث. يقدم لك هذا التطبيق طريقة بسيطة لاختبار تطبيقك في بيئة الملف الشخصي للعمل. يمكنك أيضًا استخدام هذا التطبيق لضبط الملف الشخصي للعمل على النحو التالي:

  • تحديد التطبيقات التلقائية المتاحة في الملف الشخصي المُدار
  • يمكنك تحديد الأغراض التي يُسمح لها بالانتقال من ملف شخصي إلى ملف آخر.

إذا ثبَّت تطبيقًا يدويًا عبر كابل USB على جهاز يحتوي على ملف شخصي للعمل، سيتم تثبيت التطبيق على كل من الملف الشخصي والملف الشخصي للعمل. بمجرد تثبيت التطبيق، يمكنك اختباره وفقًا للشروط التالية:

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

الاختبار في الملفات الشخصية للعمل: نصائح

هناك بعض الحيل التي قد تجدها مفيدة في الاختبار على جهاز الملف الشخصي للعمل.

  • وكما هو موضّح، عند تحميل تطبيق جانبيًا على جهاز ملف شخصي للعمل، يتم تثبيته على كلا الملفين الشخصيين. إذا أردت، يمكنك حذف التطبيق من أحد الملفات الشخصية وتركه على الملف الشخصي الآخر.
  • تتوافق معظم أوامر مدير النشاط المتوفّرة في واجهة أوامر Android Debug Bridge (adb) مع العلامة --user التي تتيح لك تحديد المستخدم الذي سيتم تشغيل التطبيق به. من خلال تحديد حساب مستخدم، يمكنك اختيار ما إذا كنت تريد تشغيله كمستخدم أساسي غير مُدار أو ملف شخصي للعمل. لمزيد من المعلومات، يُرجى الاطّلاع على أوامر ADBShell.
  • للعثور على المستخدمين النشطين على أحد الأجهزة، استخدِم الأمر list users في مدير حِزم adb. الرقم الأول في سلسلة الإخراج هو رقم تعريف المستخدم، الذي يمكنك استخدامه مع العلامة --user لمزيد من المعلومات، يُرجى الاطّلاع على أوامر ADB Shell.

على سبيل المثال، للبحث عن المستخدمين على أحد الأجهزة، يمكنك تنفيذ الأمر التالي:

$ adb shell pm list users
UserInfo{0:Drew:13} running
UserInfo{10:Work profile:30} running

في هذه الحالة، يكون لدى المستخدم الأساسي("Drew") رقم تعريف المستخدم 0، ويحتوي الملف الشخصي للعمل على رقم تعريف المستخدم 10. لتشغيل تطبيق في الملف الشخصي للعمل، يمكنك استخدام أمر مثل هذا:

$ adb shell am start --user 10 \
-n "com.example.myapp/com.example.myapp.testactivity" \
-a android.intent.action.MAIN -c android.intent.category.LAUNCHER