ویژگی نقشهای برنامه به یک سرپرست فناوری اطلاعات اجازه میدهد تا امتیازات ویژهای را به یک برنامه مدیریتشده در دستگاه مجهز به اندروید اعطا کند. با اختصاص یک نقش خاص، یک برنامه میتواند از محدودیتهای برق و پسزمینه، تعلیق، خواب زمستانی (در Android 14 و بالاتر) معاف شود و کنترلهای کاربر (یعنی شامل اقدامات کاربر مانند توقف اجباری و پاک کردن دادههای برنامه) غیرفعال شود (در Android 11+)، به آن اجازه میدهد عملکرد حیاتی خود را بدون وقفه انجام دهد. علاوه بر این، برنامه می تواند از نقش های اختصاص داده شده خود مطلع شود، که به آن اجازه می دهد بدون دخالت کاربر، خود را بوت استرپ کند.
پیش نیازها
دستگاه توسط یک EMM مبتنی بر AMAPI مدیریت می شود (EMM هایی که از DPC سفارشی پشتیبانی نمی شوند).
برنامه خود را برای استفاده از ویژگی آماده کنید
ادغام با AMAPI SDK تنها زمانی مورد نیاز است که برنامه بخواهد از نقش های اختصاص داده شده خود مطلع شود که به آن اجازه می دهد خود را بوت استرپ کند (یعنی راه اندازی خودکار بدون تعامل کاربر).
با AMAPI SDK در برنامه خود یکپارچه شوید
میتوانید اطلاعات بیشتری درباره AMAPI SDK و نحوه افزودن آن به برنامه خود در راهنمای ادغام AMAPI SDK بیابید.
متادیتای مورد نیاز را به مانیفست برنامه اضافه کنید
سیاست دستگاه Android (ADP) باید ComponentName
کلاس شما را بداند که NotificationReceiverService
را اجرا می کند تا برنامه شما را از نقش های اختصاص داده شده خود مطلع کند. شما باید سرویس خود را به طور مناسب در AndroidManifest.xml
برچسب گذاری کنید تا به طور خودکار توسط ADP کشف شود.
- برنامه شما باید دقیقاً یک سرویس
enabled
داشته باشد و دارایmeta-data
باandroid:name
برابر باcom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES
باشد. - این سرویس باید
android:exported
رویtrue
تنظیم کند -
android:value
meta-data
باید روی یک رشته خالی تنظیم شود
<service
android:name=".MyNotificationReceiverService"
android:exported="true">
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>
اگر نقش COMPANION_APP
را آزمایش میکنید، باید meta-data
زیر را نیز به سرویس خود اضافه کنید تا سیاست دستگاه Android بتواند بهروزرسانیهای وضعیت فرمان محلی را به برنامه شما ارسال کند:
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_COMMAND_STATUS" android:value="" />
ایجاد سرویسی برای گسترش NotificationReceiverService (یا به روز رسانی موجود)
NotificationReceiverService
موجود خود را ایجاد یا به روز کنید و یک AppRolesListener
برای گوش دادن به نقش های اختصاص داده شده به برنامه خود پیاده سازی کنید. فقط getAppRolesListener()
برای گوش دادن به نقش های اختصاص داده شده به برنامه شما مورد نیاز است. اگر به برنامه شما یک نقش COMPANION_APP
اختصاص داده شده است، باید getCommandListener()
نیز پیاده سازی کنید:
import android.util.Log
import com.google.android.managementapi.approles.AppRolesListener
import com.google.android.managementapi.approles.model.AppRolesSetRequest
import com.google.android.managementapi.approles.model.AppRolesSetResponse
import com.google.android.managementapi.commands.CommandListener
import com.google.android.managementapi.commands.model.Command
import com.google.android.managementapi.notification.NotificationReceiverService
class MyNotificationReceiverService : NotificationReceiverService() {
// If your app wants to listen for roles assigned
override fun getAppRolesListener(): AppRolesListener =
object : AppRolesListener {
override fun onAppRolesSet(request: AppRolesSetRequest): AppRolesSetResponse {
val roleTypes = request.roles.map { role -> role.roleType }
Log.i(TAG, "onAppRolesSet: $roleTypes")
return AppRolesSetResponse.getDefaultInstance()
}
}
// If your app wants to listen for local command status updates
// Only relevant for COMPANION_APP role
override fun getCommandListener(): CommandListener {
return object : CommandListener {
override fun onCommandStatusChanged(command: Command) {
Log.i(TAG, "onCommandStatusChanged")
}
}
}
private companion object {
const val TAG = "MyNotificationReceiverService"
}
}
اگر نقشهای آن چندین بار تغییر کند، میتواند چندین بار به برنامه شما اطلاع داده شود. اگر همه نقشها حذف شوند، برنامه شما همچنان با یک لیست خالی از نقشها مطلع میشود. این اعلان برنامه شما را از حالت توقف خارج می کند و همراه با معافیت های اعطا شده برای برنامه شما، برنامه شما می تواند خود را بدون هیچ گونه تعامل با کاربر بوت استرپ کند. به لطف اعلان نقشهای برنامه و معافیتها، برنامه شما میتواند به پخشهای ACTION_BOOT_COMPLETED
گوش دهد. اگر برنامه شما به تنظیمات مدیریت شده خود برای بوت استرپ بستگی دارد، به تنظیم تنظیمات مدیریت شده در مورد نحوه خواندن و گوش دادن به تغییرات مراجعه کنید.
خطمشیهای نقش برنامه را به دستگاه ارائه دهید
توسعهدهندگان برنامه میتوانند با استفاده از و EMM یا پیروی از شروع سریع API مدیریت Android، تخصیص نقشهای برنامه را به برنامه خود آزمایش کنند. نوت بوک AMAPI Colab به شما امکان می دهد یک شرکت را ثبت نام کنید، یک خط مشی ایجاد کنید و یک دستگاه تهیه کنید.
خط مشی برنامه خود را با نقش های برنامه تنظیم کنید
با استفاده از ApplicationPolicy.roles
policy
با نقشهای برنامهای که برنامه شما در نظر گرفته شده است داشته باشد، تنظیم کنید.
مثال زیر نحوه پیکربندی نقش را برای برنامه های MTD نشان می دهد:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
قبل از تخصیص نقشها همانطور که در خطمشی مشخص شده است، سیستم بررسی میکند که اثر انگشت گواهی کلید امضای برنامه در دستگاه با اثر انگشت Play Store مطابقت داشته باشد. اگر اثر انگشت متفاوت باشد، نقشها به برنامه و NonComplianceReason.APP_SIGNING_CERT_MISMATCH
اختصاص داده نمیشود. عدم انطباق APP_SIGNING_CERT_MISMATCH به EMM گزارش میشود.
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"signingKeyCerts": [
{ "signingKeyCertFingerprintSha256": "base64-encoded-sha256" }
],
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
اگر برنامه شما پیکربندی مدیریت شده داشته باشد، سرپرست فناوری اطلاعات میتواند یک پیکربندی اولیه برای restriction
مربوطه در خطمشی برنامه تنظیم کند:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
],
"managedConfiguration": {
"<key>": "<value>"
}
}
]
}