Microsoft Intune guía para desarrolladores de SDK de aplicaciones para Android
Nota
Es posible que desee leer primero la introducción al SDK de aplicaciones de Intune, que trata las características actuales del SDK y describe cómo prepararse para la integración en cada plataforma compatible.
Para descargar el SDK, consulte Descargar los archivos del SDK.
Si tienes problemas con la integración del SDK de aplicaciones de Intune en tus aplicaciones, envía una solicitud de asistencia en GitHub.
El Microsoft Intune SDK de aplicaciones para Android te permite incorporar directivas de protección de aplicaciones de Intune (también conocidas como directivas DE APLICACIONES o MAM) en tu aplicación nativa de Android. Una aplicación administrada por Intune es una que está integrada con intune App SDK. Los administradores de Intune pueden implementar fácilmente directivas de protección de aplicaciones en la aplicación administrada por Intune cuando Intune administra activamente la aplicación.
Qué hay en el SDK
Intune App SDK consta de los siguientes archivos:
- Microsoft.Intune.MAM.SDK.aar: los componentes del SDK, excepto los archivos JAR de la biblioteca de soporte técnico.
- Microsoft.Intune.MAM.SDK.DownlevelStubs.aar: este AAR contiene códigos auxiliares para las clases del sistema Android, que solo están presentes en dispositivos más recientes, pero a los que los métodos de MAMActivity hacen referencia. Los dispositivos más recientes omitirán estas clases de código auxiliar. Este AAR solo es necesario si la aplicación realiza una reflexión sobre las clases derivadas de
MAMActivity
y la mayoría de las aplicaciones no necesitan incluirla. El AAR contiene reglas de ProGuard para excluir todas sus clases. - com.microsoft.intune.mam.build.jar: un complemento Gradle, que ayuda a integrar el SDK.
- CHANGELOG.md: proporciona un registro de los cambios realizados en cada versión del SDK.
- THIRDPARTYNOTICES.TXT: un aviso de atribución que reconoce código de terceros o sistema operativo que se compilará en la aplicación.
Requisitos
Versiones de Android
El SDK es totalmente compatible con la API de Android 28 (Android 9.0) a través de la API de Android 31 (Android 12.0). Para tener como destino la API de Android 31, debes usar Intune App SDK v8.0 o posterior. Las API del 23 al 27 tienen compatibilidad limitada. El uso de MAM y Portal de empresa no se admiten debajo de la API de Android 23. Si la aplicación se declara en un nivel de API inferior a la API 23, el SDK de MAM no bloqueará el uso de la aplicación para los usuarios que no están dirigidos minSdkVersion
por la directiva de MAM.
AndroidX
A partir de Intune APP SDK 8.0.0, ya no se admite la biblioteca de soporte técnico de Android heredada. Se espera que las aplicaciones usen AndroidX (ya sea directamente o a través del Jetifier) si necesitan la funcionalidad de la biblioteca de soporte técnico.
Aplicación Portal de empresa
Intune App SDK para Android se basa en la presencia de la Portal de empresa aplicación en el dispositivo para habilitar directivas de protección de aplicaciones. El Portal de empresa recupera las directivas de protección de aplicaciones del servicio de Intune. Cuando la aplicación se inicializa, carga la directiva y el código para aplicar esa directiva desde el Portal de empresa.
Nota
Cuando la Portal de empresa no está en el dispositivo, una aplicación administrada por Intune se comporta igual que una aplicación normal que no admite directivas de protección de aplicaciones de Intune.
Para la protección de aplicaciones sin inscripción de dispositivos __, no es necesario que el usuario inscriba el dispositivo mediante Portal de empresa aplicación.
Integración de SDK
Importante
Intune publica periódicamente actualizaciones del SDK de aplicaciones de Intune. Compruebe periódicamente el SDK de aplicaciones de Intune para Android para obtener actualizaciones e incorpore al ciclo de lanzamiento de desarrollo de software para asegurarse de que las aplicaciones admiten la configuración de directiva de protección de aplicaciones más reciente.
Aplicaciones de ejemplo
Algunos ejemplos de cómo integrar correctamente con intune App SDK son:
- Taskr: un ejemplo Microsoft Intune SDK de MAM de Android. En este ejemplo se usa el complemento de compilación gradle.
- Taskr: un ejemplo Microsoft Intune React Native SDK de MAM de Android
Referencia a bibliotecas de aplicaciones de Intune
Intune App SDK es una biblioteca estándar de Android sin dependencias externas. Microsoft.Intune.MAM.SDK.aar contiene las interfaces necesarias para la habilitación de una directiva de protección de aplicaciones y el código necesario para interoperar con la Microsoft Intune Portal de empresa aplicación.
Microsoft.Intune.MAM.SDK.aar debe especificarse como referencia de biblioteca de Android. Para ello, abra el proyecto de aplicación en Android Studio y vaya a Archivo > Nuevo > Nuevo módulo y seleccione Importar . JAR/. Paquete AAR. A continuación, seleccione nuestro paquete de archivo de Android Microsoft.Intune.MAM.SDK.aar para crear un módulo para . Tipo de archivo AAR . Haga clic con el botón secundario en el módulo o módulos que contienen el código de la aplicación y vaya a Módulo Configuración > Dependencies tab > + dependencia iconModule > > Seleccione el módulo AAR del SDK de MAM que acaba de crear > Aceptar. Esto garantizará que el módulo se compile con el SDK de MAM al compilar el proyecto.
ProGuard
Si ProGuard (o cualquier otro mecanismo de reducción o ofuscación) se usa como paso de compilación, el SDK tiene reglas de configuración adicionales, que deben incluirse. Al incluir el archivo . AAR en la compilación, nuestras reglas se integran automáticamente en el paso proguard y se mantienen los archivos de clase necesarios.
La Biblioteca de autenticación de Microsoft (MSAL) puede tener sus propias restricciones de ProGuard. Si la aplicación integra MSAL, debes seguir la documentación de MSAL sobre estas restricciones.
Aplicación de directivas
Intune App SDK es una biblioteca de Android, que permite que la aplicación admita y participe en la aplicación de directivas de Intune.
La mayoría de las directivas se aplican semiautormente, pero determinadas directivas requieren la participación explícita de la aplicación para aplicarlas. Independientemente de si realiza la integración de origen o usa herramientas de compilación para la integración, las directivas que requieren participación explícita tendrán que codificarse.
Para las directivas que se aplican automáticamente, es necesario que las aplicaciones reemplacen la herencia de varias clases base de Android por herencia de equivalentes de MAM y reemplacen de forma similar las llamadas a determinadas clases de servicio del sistema Android por llamadas a equivalentes mam. Los reemplazos específicos necesarios se detallan a continuación y se pueden realizar manualmente con la integración de origen o realizarse automáticamente a través de herramientas de compilación.
Crear herramientas
El SDK proporciona herramientas de compilación (un complemento para compilaciones de Gradle y una herramienta de línea de comandos para compilaciones que no son gradle) que realizan reemplazos equivalentes de MAM automáticamente. Estas herramientas transforman los archivos de clase generados Java compilación y no modifican el código fuente original.
Las herramientas solo realizan reemplazos directos . No realizan integraciones de SDK más complejas, como la directiva de guardar como, la identidad múltiple, el registro mam, las modificaciones de AndroidManifest o la configuración de MSAL , por lo que deben completarse antes de que la aplicación esté totalmente habilitada para Intune. Revise detenidamente el resto de esta documentación para ver los puntos de integración relevantes para la aplicación.
Nota
Es adecuado ejecutar las herramientas en un proyecto que ya ha realizado la integración parcial o completa del SDK de MAM mediante reemplazos manuales. El proyecto debe seguir enumerando el SDK de MAM como dependencia.
Complemento de compilación de Gradle
Si la aplicación no se compila con gradle, vaya a Integración con la herramienta de línea de comandos.
El complemento sdk de aplicaciones se distribuye como parte del SDK como GradlePlugin/com.microsoft.intune.mam.build.jar. Para que Gradle pueda encontrar el complemento, debe agregarse a la ruta de clase buildscript. El complemento depende de Javassist, que también debe agregarse. Para agregarlos a la ruta de clase, agregue lo siguiente a la raíz build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "org.javassist:javassist:3.27.0-GA"
classpath files("$PATH_TO_MAM_SDK/GradlePlugin/com.microsoft.intune.mam.build.jar")
}
}
A continuación, en el build.gradle
archivo de su proyecto APK, simplemente aplique el complemento como
apply plugin: 'com.microsoft.intune.mam'
De forma predeterminada, el complemento funcionará en dependencias project
y bibliotecas externas. Desde SDK 8.0, ya no es posible procesar bibliotecas de forma selectiva: todas se procesan.
La compilación de pruebas no se ve afectada. La configuración se puede proporcionar a la lista
- Proyectos que se excluirán
- Clases específicas para excluir del procesamiento
- Variantes que se excluirán del procesamiento. Estos pueden hacer referencia a un nombre de variante completo o a un único sabor. Por ejemplo
- si tu aplicación tiene tipos de compilación
debug
yrelease
con los sabores {savory
,sweet
} y {vanilla
,chocolate
} podrías especificar savory
para excluir todas las variantes con el sabor salado osavoryVanillaRelease
para excluir solo esa variante exacta.
- si tu aplicación tiene tipos de compilación
Ejemplo de build.gradle parcial
apply plugin: 'com.microsoft.intune.mam'
dependencies {
implementation project(':product:FooLib')
implementation project(':product:foo-project')
implementation "com.microsoft.bar:baz:1.0.0"
// Include the MAM SDK
implementation files("$PATH_TO_MAM_SDK/Microsoft.Intune.MAM.SDK.aar")
}
intunemam {
excludeProjects = [':product:FooLib']
excludeClasses = ['com.contoso.SplashActivity']
excludeVariants=['savory']
}
Esto tendría los siguientes efectos:
:product:FooLib
no se reescribirá porque se incluye enexcludeProjects
:product:foo-project
se reescribirácom.contoso.SplashActivity
, excepto por lo que se omite porque está enexcludeClasses
com.microsoft.bar:baz.1.0.0
se reescribirá porque todas las bibliotecas externas se incluyen para su procesamiento.
Generación de informes
El complemento de compilación puede generar un informe html de los cambios que realiza. Para solicitar la generación de este informe, especifique report = true
en el bloque intunemam
de configuración. Si se genera, el informe se escribirá en outputs/logs
el directorio de compilación.
intunemam {
report = true
}
Verificación
El complemento de compilación puede ejecutar una comprobación adicional para buscar posibles errores en las clases de procesamiento. Para solicitar esto, especifique verify = true
en el bloque intunemam
de configuración. Ten en cuenta que esto puede agregar varios segundos al tiempo que tarde la tarea del complemento.
intunemam {
verify = true
}
Compilaciones incrementales
Para habilitar la compatibilidad con la creación incremental, especifique incremental = true
en el bloque intunemam
de configuración. Se trata de una característica experimental destinada a aumentar el rendimiento de la compilación procesando solo los archivos de entrada que han cambiado. La configuración predeterminada es false
.
intunemam {
incremental = true
}
Dependencias
El complemento gradle tiene una dependencia en Javassist, que debe estar disponible para la resolución de dependencias de Gradle (como se describió anteriormente). Javassist se usa únicamente en tiempo de compilación al ejecutar el complemento. No se agregará código Javassist a la aplicación.
Nota
Debes usar la versión 3.6.1 o posterior del complemento Gradle de Android y Gradle 5.6.4 o posterior.
Al consumir EL SDK de MAM 8.0.0+, debe asegurarse de que se establece lo siguiente en la configuración de Gradle:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Herramienta de compilación de línea de comandos
Si la compilación usa Gradle, vaya a la sección siguiente.
La herramienta de compilación de línea de comandos está disponible en la BuildTool
carpeta de la colocación del SDK. Realiza la misma función que el complemento Gradle detallado anteriormente, pero se puede integrar en sistemas de compilación personalizados o que no sean gradle. Como es más genérico, es más complejo invocar, por lo que el complemento Gradle debe usarse cuando sea posible hacerlo.
Uso de la Command-Line de búsqueda
La herramienta de línea de comandos se puede invocar mediante los scripts auxiliares proporcionados ubicados en el BuildTool\bin
directorio.
La herramienta espera los siguientes parámetros.
Parámetro | Obligatorio | Descripción |
---|---|---|
--input |
Sí | Una lista delimitada con punto y coma de archivos jar y directorios de archivos de clase que se deben modificar. Esto debe incluir todos los jars/directorios que desea reescribir. |
--output |
Sí | Una lista delimitada de punto y coma de archivos y directorios de jar para almacenar las clases modificadas. Debe haber una entrada de salida por entrada y se deben enumerar en orden. |
--classpath |
Sí | Ruta de clase de compilación. Esto puede contener tanto los jars como los directorios de clase. |
--processed |
No | Una lista delimitada con punto y coma de archivos jar y directorios que contienen clases que ya han sido procesadas por una invocación anterior de la herramienta de compilación. |
--excludeClasses |
No | Una lista delimitada con punto y coma que contiene los nombres de las clases que deben excluirse de la reescritura. |
--report |
No | Directorio en el que se escribirá un informe HTML sobre las clases modificadas. Si no se especifica, no se escribe ningún informe. |
La opción --processed
opcional se usa para habilitar compilaciones incrementales. El conjunto de archivos/directorios enumerados aquí debe estar unirse con las listas de entrada y ruta de clase.
Nota
En sistemas unix-like semi-dos puntos es un separador de comandos. Para evitar que el shell divida comandos, asegúrese de escapar cada punto y coma con '' o ajustar el parámetro completo entre comillas.
Ejemplo Command-Line de la herramienta
> BuildTool\bin\BuildTool.bat --input build\product-foo-project;libs\bar.jar --output mam-build\product-foo-project;mam-build\libs\bar.jar --classpath build\zap.jar;libs\Microsoft.Intune.MAM.SDK\classes.jar;%ANDROID_SDK_ROOT%\platforms\android-27\android.jar --excludeClasses com.contoso.SplashActivity
Esto tendría los siguientes efectos:
- el
product-foo-project
directorio se reescribirá enmam-build\product-foo-project
bar.jar
se reescribirá enmam-build\libs\bar.jar
zap.jar
no se reescribirá porque solo aparece en--classpath
- La
com.contoso.SplashActivity
clase no se reescrita incluso si está en--input
Nota
La herramienta de compilación actualmente no admite archivos aar. Si el sistema de compilación aún no extrae al classes.jar
tratar con archivos aar, deberá hacerlo antes de invocar la herramienta de compilación.
Reemplazos de clase y método
Nota
Las aplicaciones deben integrarse con las herramientas de compilación del SDK, que realizarán todos estos reemplazos automáticamente (excepto para reemplazos de manifiestos
Las clases base de Android deben reemplazarse por sus equivalentes mam correspondientes para habilitar la administración de Intune. Las clases sdk viven entre la clase base de Android y la propia versión derivada de la aplicación de esa clase. Por ejemplo, una actividad de aplicación puede terminar con una jerarquía de herencia similar a: Activity
> >
MAMActivity``AppSpecificActivity
. La capa MAM filtra las llamadas a las operaciones del sistema para proporcionar a la aplicación una vista administrada del mundo sin problemas.
Además de las clases base, algunas clases que la aplicación puede usar sin derivar ( MediaPlayer
por ejemplo, ) también tienen equivalentes de MAM necesarios y algunas llamadas a métodos también deben reemplazarse. Los detalles precisos se indican a continuación.
Nota
Si la aplicación se integra con las herramientas de compilación del SDK, las siguientes sustituciones de clase y método se realizan automáticamente.
Clase base de Android | Reemplazo del SDK de aplicaciones de Intune |
---|---|
android.app.Activity | MAMActivity |
android.app.ActivityGroup | MAMActivityGroup |
android.app.AliasActivity | MAMAliasActivity |
android.app.Application | MAMApplication |
android.app.Dialog | MAMDialog |
android.app.AlertDialog.Builder | MAMAlertDialogBuilder |
android.app.DialogFragment | MAMDialogFragment |
android.app.ExpandableListActivity | MAMExpandableListActivity |
android.app.Fragment | MAMFragment |
android.app.IntentService | MAMIntentService |
android.app.LauncherActivity | MAMLauncherActivity |
android.app.ListActivity | MAMListActivity |
android.app.ListFragment | MAMListFragment |
android.app.NativeActivity | MAMNativeActivity |
android.app.PendingIntent | MAMPendingIntent (vea Pending Intent) |
android.app.Service | MAMService |
android.app.TabActivity | MAMTabActivity |
android.app.TaskStackBuilder | MAMTaskStackBuilder |
android.app.backup.BackupAgent | MAMBackupAgent |
android.app.backup.BackupAgentHelper | MAMBackupAgentHelper |
android.app.backup.FileBackupHelper | MAMFileBackupHelper |
android.app.backup.SharePreferencesBackupHelper | MAMSharedPreferencesBackupHelper |
android.content.BroadcastReceiver | MAMBroadcastReceiver |
android.content.ContentProvider | MAMContentProvider |
android.os.Binder | MAMBinder (Solo es necesario si el enlazador no se genera desde una interfaz de Lenguaje de definición de interfaz Android (AIDL) |
android.media.MediaPlayer | MAMMediaPlayer |
android.media.MediaMetadataRetriever | MAMMediaMetadataRetriever |
android.media.MediaRecorder | MAMMediaRecorder |
android.provider.DocumentsProvider | MAMDocumentsProvider |
android.preference.PreferenceActivity | MAMPreferenceActivity |
android.support.multidex.MultiDexApplication | MAMMultiDexApplication |
android.widget.PopupWindow | MAMPopupMenu |
android.widget.PopupWindow | MAMPopupWindow |
android.widget.ListPopupWindow | MAMListPopupWindow |
android.widget.TextView | MAMTextView |
android.widget.AutoCompleteTextView | MAMAutoCompleteTextView |
android.widget.CheckedTextView | MAMCheckedTextView |
android.widget.EditText | MAMEditText |
android.inputmethodservice.ExtractEditText | MAMExtractEditText |
android.widget.MultiAutoCompleteTextView | MAMMultiAutoCompleteTextView |
android.view.ViewGroup | MAMViewGroup |
Nota
Incluso si la aplicación no necesita su propia clase Application
derivada, vea a continuación MAMApplication
Métodos con nombre
En muchos casos, un método disponible en la clase Android se ha marcado como final en la clase de reemplazo MAM. En este caso, la clase de reemplazo MAM proporciona un método con un nombre similar (generalmente MAM
con sufijo ) que se debe invalidar en su lugar. Por ejemplo, al derivar de MAMActivity, onCreate()
en lugar de invalidar y llamar super.onCreate()
a , debe Activity
invalidar onMAMCreate()
y llamar a super.onMAMCreate()
. El Java debe aplicar las restricciones finales para evitar la invalidación accidental del método original en lugar del equivalente de MAM.
MAMApplication
Si la aplicación crea una subclase de android.app.Application
, el complemento de compilación transformará la clase de aplicación. Si la aplicación no tiene subclaseandroid.app.Application
, debes "com.microsoft.intune.mam.client.app.MAMApplication"
"android:name"
establecerlo como el atributo en la etiqueta AndroidManifest.xml <application>
la aplicación.
PendingIntent
En lugar PendingIntent.get*
de , debe usar el MAMPendingIntent.get*
método. Después de esto, puede usar el resultado como PendingIntent
de costumbre.
Servicios del sistema ajustados
Para algunas clases de servicio del sistema, es necesario llamar a un método estático en una clase contenedora MAM en lugar de invocar directamente el método deseado en la instancia de servicio. Por ejemplo, una llamada a debe getSystemService(ClipboardManager.class).getPrimaryClip()
convertirse en una llamada MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class)
a . No se recomienda realizar estos reemplazos manualmente. En su lugar, deje que BuildPlugin lo haga.
Clase Android | Reemplazo del SDK de aplicaciones de Intune |
---|---|
android.content.ClipboardManager | MAMClipboard |
android.content.ContentProviderClient | MAMContentProviderClientManagement |
android.content.ContentResolver | MAMContentResolverManagement |
android.content.pm.PackageManager | MAMPackageManagement |
android.app.DownloadManager | MAMDownloadManagement |
android.print.PrintManager | MAMPrintManagement |
android.support.v4.print.PrintHelper | MAMPrintHelperManagement |
android.view.View | MAMViewManagement |
android.view.Window | MAMWindowManagement |
android.view.DragEvent | MAMDragEventManagement |
android.app.NotificationManager | MAMNotificationManagement |
android.support.v4.app.NotificationManagerCompat | MAMNotificationCompatManagement |
android.app.blob.BlobStoreManager | MAMBlobStoreManager |
android.app.blob.BlobStoreManager.Session | MAMBlobStoreManager.Session |
Algunas clases tienen la mayoría de sus métodos ajustados, por ejemplo, ClipboardManager
, , ContentProviderClient
y PackageManager
ContentResolver
mientras que otras clases solo tienen uno o dos métodos ajustados, por ejemplo, DownloadManager
, PrintManager
, PrintHelper``View
, , DragEvent
y NotificationManager
NotificationManagerCompat
. Consulte las API expuestas por las clases equivalentes de MAM para obtener el método exacto si no usa BuildPlugin.
Reemplazos de manifiesto
Es posible que sea necesario realizar algunos de los reemplazos de clase anteriores en el manifiesto, así como en Java código. De nota especial:
- Las referencias de manifiesto
android.support.v4.content.FileProvider
a deben reemplazarse porcom.microsoft.intune.mam.client.support.v4.content.MAMFileProvider
.
Bibliotecas AndroidX
Con Android P, Google anunció un nuevo conjunto (con nombre) de bibliotecas de soporte técnico denominado AndroidX y la versión 28 es la última versión principal de las bibliotecas android.support existentes.
A diferencia de las libs de compatibilidad con Android, no proporcionamos variantes MAM de las bibliotecas AndroidX. En su lugar, AndroidX se trata como cualquier otra biblioteca externa y se vuelve a escribir. Para las compilaciones de Gradle, esto se realiza automáticamente. Las invocaciones de la herramienta de líneas de comandos deben enumerar explícitamente todos los archivos jar.
Solución de problemas de migración de AndroidX
Al migrar la aplicación integrada del SDK a AndroidX, es posible que encuentres un error como el siguiente:
incompatible types: android.support.v7.app.ActionBar cannot be converted to androidx.appcompat.app.ActionBar
Estos errores pueden producirse porque la aplicación hace referencia a las clases de soporte técnico de MAM. Las clases de soporte técnico de MAM encapsulan las clases de soporte técnico de Android que se han movido en AndroidX. Para combatir estos errores, reemplace todas las referencias de clase de soporte de MAM por sus equivalentes AndroidX. Esto se puede lograr quitando primero las dependencias de la biblioteca de compatibilidad de MAM de los archivos de compilación de Gradle. Las líneas en cuestión tendrán un aspecto parecido al siguiente:
implementation "com.microsoft.intune.mam:android-sdk-support-v4:$intune_mam_version"
implementation "com.microsoft.intune.mam:android-sdk-support-v7:$intune_mam_version"
A continuación, corrija los errores de tiempo de compilación resultantes reemplazando todas las referencias a clases MAM com.microsoft.intune.mam.client.support.v7
en los paquetes y com.microsoft.intune.mam.client.support.v4
por sus equivalentes AndroidX. Por ejemplo, las referencias a MAMAppCompatActivity
deben cambiarse a .AppCompatActivity
Como se mencionó anteriormente, el complemento/herramienta de compilación mam reescribirá automáticamente las clases en las bibliotecas AndroidX con los equivalentes mam correspondientes en tiempo de compilación.
Registro
El registro debe inicializarse de forma anticipada para obtener el máximo valor de los datos registrados. Application.onMAMCreate()
suele ser el mejor lugar para inicializar el registro.
Para recibir registros mam en la aplicación, crea un controlador de Java y agréalo al MAMLogHandlerWrapper. Esto invocará en publish()
el controlador de aplicaciones para cada mensaje de registro.
/**
* Global log handler that enables fine grained PII filtering within MAM logs.
*
* To start using this you should build your own log handler and add it via
* MAMComponents.get(MAMLogHandlerWrapper.class).addHandler(myHandler, false);
*
* You may also remove the handler entirely via
* MAMComponents.get(MAMLogHandlerWrapper.class).removeHandler(myHandler);
*/
public interface MAMLogHandlerWrapper {
/**
* Add a handler, PII can be toggled.
*
* @param handler handler to add.
* @param wantsPII if PII is desired in the logs.
*/
void addHandler(final Handler handler, final boolean wantsPII);
/**
* Remove a handler.
*
* @param handler handler to remove.
*/
void removeHandler(final Handler handler);
}
Información de diagnóstico
Las aplicaciones pueden invocar un MAMPolicyManager.showDiagnostics(context)
método que inicia una actividad que muestra la interfaz de usuario para recopilar Portal de empresa registros y ver diagnósticos de MAM.
Esta es una característica opcional que puede ayudar en la depuración.
Cuando Portal de empresa no está instalado en el dispositivo, se pedirá un cuadro de diálogo para informar al usuario de que esta información no está disponible actualmente. Cuando las aplicaciones se administran mediante la directiva MAM, se mostrará una configuración de directiva de MAM detallada.
Modo estricto mam
El modo estricto mam proporciona un mecanismo para detectar "oler" en el uso de aplicaciones de API de MAM o API de plataformas restringidas por MAM. Está con patrones sueltos después de StrictMode de Android y ejecuta un conjunto de comprobaciones que producen errores cuando se producen errores. No está pensado para dejarla habilitada en las compilaciones de producción, pero se te recomienda encarecidamente que la uses en las compilaciones de desarrollo interno, depuración o dogfood de la aplicación.
Para habilitar, llame
MAMStrictMode.enable();
inicio de la inicialización de la aplicación (por ejemplo, Application.onCreate
).
Cuando se produce un error en una comprobación del modo estricto de MAM, intenta determinar si se trata de un problema real que se puede solucionar en la aplicación o de un falso positivo. Si crees que es un falso positivo o no estás seguro, deja que el equipo mam de Intune lo sepa. Esto nos permitirá asegurarnos de que estamos de acuerdo con la determinación de falsos positivos e intentar mejorar la detección para futuras versiones. Para suprimir falsos positivos, deshabilita la comprobación con error (más información a continuación).
Control de infracciones
Cuando se produce un error en una comprobación, se ejecuta mamstrictViolationHandler. El controlador predeterminado inicia un Error
, que se espera que bloquea la aplicación. Esto es para hacer que los errores sean lo más ruidosos posibles y se ajuste a la intención de que el modo estricto no se habilite en las compilaciones de producción.
Si la aplicación quiere controlar las infracciones de forma diferente, puede proporcionar su propio controlador llamando a:
MAMStrictMode.global().setHandler(handler);
donde handler
implementa MAMStrictViolationHandler
.
Supresión de comprobaciones
Si se produce un error en una comprobación en la que la aplicación no hace nada incorrecto, den como se mencionó anteriormente. Sin embargo, en algunos momentos puede ser necesario deshabilitar la comprobación que encuentre un falso positivo, al menos mientras espera un SDK actualizado. La comprobación que produjo un error se mostrará en el error que genera el controlador predeterminado o se pasará a un controlador personalizado si se establece.
La supresión se puede realizar globalmente, pero se prefiere deshabilitar temporalmente por subproceso en el sitio de llamada específico. Los ejemplos siguientes muestran varias formas de deshabilitar MAMStrictCheck.IDENTITY_NO_SUCH_FILE MAMStrictCheck (se genera si se intenta proteger un archivo que no existe).
Per-Thread supresión temporal
Este es el mecanismo de supresión preferido.
try (StrictScopedDisable disable = MAMStrictMode.thread().disableScoped(MAMStrictCheck.IDENTITY_NO_SUCH_FILE)) {
// Perform the operation which raised a violation here
}
// The check is no longer disabled once the block exits
Per-Thread supresión permanente
MAMStrictMode.thread().disable(MAMStrictCheck.IDENTITY_NO_SUCH_FILE);
Supresión global (todo el proceso)
MAMStrictMode.global().disable(MAMStrictCheck.IDENTITY_NO_SUCH_FILE);
Habilitar características que requieren la participación de la aplicación
Hay algunas directivas de protección de aplicaciones que el SDK no puede aplicar por sí solo:
- Aplicar restricciones al guardar archivos en el almacenamiento local o en la nube.
- Aplicar restricciones para abrir archivos desde el almacenamiento local o en la nube.
- Aplicar restricciones al contenido en las notificaciones.
La aplicación debe usar los métodos de la interfaz AppPolicy para preguntar si estas acciones están permitidas. Para comprobar si se permite guardar o abrir un archivo o documento, use getIsSaveToLocationAllowed y getIsOpenFromLocationAllowed. Para determinar las restricciones en el contenido de notificación, use getNotificationRestriction
. Los ejemplos expandido para todos estos escenarios se proporcionan más adelante en esta sección.
Ten en cuenta que los métodos de AppPolicy que no pertenecen a las directivas anteriores proporcionan información que la aplicación puede usar para presentar una mejor experiencia de usuario, pero no son necesarios para la aplicación de directivas. Por ejemplo, AppPolicy expone información sobre las directivas de PIN y captura de pantalla, pero se aplican automáticamente.
Para recuperar una instancia AppPolicy
, use uno de los [métodos MAMPolicyManager] .
Nota
MAMPolicyManager
siempre devolverá una directiva de aplicación que no sea nula, incluso si el dispositivo o la aplicación no se encuentra en una directiva de administración de Intune.
Ejemplo: determinar si el PIN es necesario para la aplicación
Si la aplicación tiene su propia experiencia de usuario de PIN, es posible que quieras deshabilitarla si el administrador de TI ha configurado el SDK para solicitar un PIN de aplicación. Para determinar si el administrador de TI ha implementado la directiva de PIN de la aplicación en esta aplicación, para el usuario final actual, llame al siguiente método:
MAMPolicyManager.getPolicy(currentActivity).getIsPinRequired();
Ejemplo: Determinar el usuario principal de Intune
Además de las API expuestas en AppPolicy, el nombre principal de usuario (UPN) también se expone mediante la API getPrimaryUser()SaveLocation definida dentro de la interfaz MAMUserInfo . Para obtener el UPN, llame a lo siguiente:
MAMComponents.get(MAMUserInfo.class).getPrimaryUser();
Ejemplo: transferencia de datos entre aplicaciones y ubicaciones de almacenamiento en la nube o dispositivo
Muchas aplicaciones implementan características que permiten al usuario final guardar o abrir datos desde el almacenamiento de archivos local o los servicios de almacenamiento en la nube. Intune App SDK permite a los administradores de TI protegerse contra la entrada y filtración de datos mediante la aplicación de restricciones de directiva según se les parezca conveniente en su organización.
La participación de la aplicación es necesaria para habilitar la característica. Si la aplicación permite guardar en ubicaciones personales o en la nube directamente desde la aplicación o permite que los datos se abran directamente en la aplicación, debes implementar la característica respectiva para garantizar que el administrador de TI pueda controlar si se permite guardar o abrir desde una ubicación.
Guardar en el almacenamiento en la nube o dispositivo
La API siguiente permite a la aplicación saber si la directiva del administrador actual de Intune permite guardar en un almacén personal.
Para determinar si se aplica la directiva, realice la siguiente llamada:
MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(
SaveLocation service, String username);
El service
parámetro debe ser uno de los siguientes valores de SaveLocation :
SaveLocation.ONEDRIVE_FOR_BUSINESS
SaveLocation.SHAREPOINT
SaveLocation.LOCAL
SaveLocation.ACCOUNT_DOCUMENT
SaveLocation.OTHER
Para determinar si se ACCOUNT_DOCUMENT
debe OTHER
pasar a ubicaciones getIsSaveToLocationAllowed
desconocidas o no para obtener más información.
Para el parámetro username
, vea Username for data transfer para obtener más información.
El método anterior de determinar si la directiva de un usuario les permitía guardar datos en varias ubicaciones estaba getIsSaveToPersonalAllowed()
dentro de la misma clase AppPolicy .
Esta función ya está en desuso y no debe usarse, la siguiente invocación equivale a getIsSaveToPersonalAllowed()
:
MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(SaveLocation.LOCAL, null);
Abrir datos desde una ubicación de almacenamiento local o en la nube
La API siguiente permite a la aplicación saber si la directiva del administrador actual de Intune permite abrir desde un almacén personal.
Para determinar si se aplica la directiva, realice la siguiente llamada:
MAMPolicyManager.getPolicy(currentActivity).getIsOpenFromLocationAllowed(
OpenLocation location, String username);
El location
parámetro debe ser uno de los siguientes valores de OpenLocation :
OpenLocation.ONEDRIVE_FOR_BUSINESS
OpenLocation.SHAREPOINT
OpenLocation.CAMERA
OpenLocation.LOCAL
OpenLocation.ACCOUNT_DOCUMENT
OpenLocation.OTHER
La OpenLocation.CAMERA
ubicación debe pasarse cuando la aplicación abra los datos de la cámara.
La OpenLocation.LOCAL
ubicación debe pasarse cuando la aplicación abra los datos del almacenamiento externo en el dispositivo local.
La OpenLocation.ACCOUNT_DOCUMENT
ubicación debe pasarse cuando la aplicación abra los datos que pertenecen a una cuenta AAD inicio de sesión en la aplicación.
Para determinar si se ACCOUNT_DOCUMENT
debe OTHER
pasar a ubicaciones getIsOpenFromLocationAllowed
desconocidas o no para obtener más información.
Para el parámetro username
, vea Username for data transfer para obtener más información.
Ubicaciones desconocidas o no listas
Cuando la ubicación deseada no aparece en SaveLocation
las enumeraciones OpenLocation
o es desconocida, hay dos opciones para el service``location
/parámetro y . ACCOUNT_DOCUMENT
OTHER
ACCOUNT_DOCUMENT
debe usarse cuando los datos pertenecen a una cuenta de AAD ha iniciado sesión en la aplicación, ONEDRIVE_FOR_BUSINESS
SHAREPOINT
OTHER
pero no lo es o, si bien debe usarse cuando ese no es el caso.
Es importante dejar clara la distinción entre la cuenta administrada y una cuenta que comparte el UPN de la cuenta administrada.
Por ejemplo, una cuenta administrada con UPN "user@contoso.com" que ha iniciado sesión en OneDrive no es la misma que una cuenta con UPN "user@contoso.com" que ha iniciado sesión Dropbox.
Si se tiene acceso a un servicio desconocido o no registrado iniciando sesión en la cuenta administrada (por ejemplo, "user@contoso.com" que ha iniciado sesión en OneDrive), ACCOUNT_DOCUMENT
debe estar representado por la ubicación.
Si el servicio desconocido o no registrado inicia sesión a través de otra cuenta (por ejemplo, "user@contoso.com" ha iniciado sesión en Dropbox), no tiene acceso a OTHER
la ubicación con una cuenta administrada y debe estar representada por la ubicación.
Nombre de usuario para la transferencia de datos
Al comprobar la directiva de guardado, username
debe ser el UPN/nombre de usuario/correo electrónico asociado al servicio en la nube en el que se guarda (no necesariamente el mismo que el usuario propietario del documento que se va a guardar).
SaveLocation.LOCAL
no es un servicio en la nube, por lo que siempre debe usarse con un parámetro null
username.
Al comprobar la directiva abierta, debe username
ser el UPN/nombre de usuario/correo electrónico asociado con el archivo o servicio en la nube desde el que se abre. OpenLocation.LOCAL
no es una ubicación de servicio en la nube, pero puede etiquetarse con una identidad para indicar la propiedad. Al abrir un archivo desde el almacenamiento local, el propietario del archivo siempre debe tenerse en cuenta, ya que la directiva de guardar como del propietario del archivo puede o no permitir que otros usuarios abran el archivo. Para los archivos etiquetados con identidad, username
debe ser la identidad del propietario del archivo. Para los archivos sin una etiqueta de identidad, username
debe ser null.
Nota
Para mayor comodidad, proporcionamos un método SDK que AppPolicy.isOpenFromLocalStorageAllowed
toma un File
parámetro para un archivo en el almacenamiento local. Los términos de aplicación de la directiva, son funcionalmente idénticos AppPolicy.isOpenFromLocationAllowed(OpenLocation.LOCAL, username)
a las llamadas, excepto que controla el análisis del propietario del archivo username
desde el File
archivo .
OpenLocation.CAMERA
no es una ubicación de servicio en la nube, por lo que siempre debe usarse con un parámetro null
username.
Las siguientes ubicaciones siempre esperarán un nombre de usuario que contenga una asignación entre el upn AAD y el nombre de usuario del servicio en la nube: ONEDRIVE_FOR_BUSINESS
, SHAREPOINT
y ACCOUNT_DOCUMENT
.
Si no existe una asignación entre AAD UPN y el nombre de usuario del servicio en la nube o si no se conoce el uso del nombre de usuarionull
.
Cuadro de diálogo De uso compartido bloqueado
El SDK proporciona un cuadro de diálogo para notificar al usuario que la directiva mam bloqueó una acción de transferencia de datos.
El cuadro de diálogo debe mostrarse al usuario cuando la llamada a la API [isSaveToAllowedForLocation] o [isOpenFromAllowedForLocation] da como resultado que se bloquee la acción guardar o abrir.
El cuadro de diálogo muestra un mensaje genérico y volverá a la llamada Activity
cuando se descarte.
Para mostrar el cuadro de diálogo, realice la siguiente llamada:
MAMUIHelper.showSharingBlockedDialog(currentActivity)
Permitir el uso compartido de archivos
Si no se permite guardar en ubicaciones de almacenamiento público, la aplicación debe permitir que el usuario pueda ver los archivos descargándolos en el almacenamiento privado de la aplicación y, a continuación, abrirlos con el elegidor del sistema.
Ejemplo: determinar si es necesario restringir las notificaciones con datos de la organización
Si la aplicación muestra notificaciones, debes comprobar la directiva de restricción de notificaciones para el usuario asociado con la notificación antes de mostrar la notificación. Para determinar si se aplica la directiva, realice la siguiente llamada.
NotificationRestriction notificationRestriction =
MAMPolicyManager.getPolicyForIdentity(notificationIdentity).getNotificationRestriction();
Si la restricción es BLOCKED
, la aplicación no debe mostrar ninguna notificación para el usuario asociado a esta directiva. Si BLOCK_ORG_DATA
, la aplicación debe mostrar una notificación modificada que no contiene datos de la organización. Si UNRESTRICTED
se permiten todas las notificaciones.
Si getNotificationRestriction
no se invoca, el SDK de MAM hará todo lo posible para restringir las notificaciones automáticamente para las aplicaciones de identidad única. Si el bloqueo automático está habilitado y BLOCK_ORG_DATA
está establecido, la notificación no se mostrará en absoluto. Para obtener un control más preciso, comprueba el valor getNotificationRestriction
de y modifica las notificaciones de la aplicación correctamente.
Omitir restricciones de inicio condicional
En escenarios muy raros, es posible que sea necesario omitir las restricciones de inicio condicional para una actividad determinada. Por ejemplo, es posible que una aplicación de marcado desee permitir que se conteste una llamada entrante sin que el usuario tenga que escribir su PIN primero. Para una aplicación de identidad múltiple (consulta Multi-Identity a continuación), esto se puede lograr estableciendo la identidad asociada con la actividad en una identidad no administrada. Para permitir una omisión similar de las restricciones de inicio condicional en una aplicación de identidad única, se puede registrar una actividad para omitir con MAMPolicyManager.
MAMPolicyManager.bypassConditionalLaunchChecks(this);
Se debe llamar a este método antes de onMAMCreate()
que se llame, para omitir eficazmente las comprobaciones de inicio condicional. Por ejemplo, se puede llamar desde el constructor de Activity, o desde una invalidación a attachBaseContext()
. Si decide invalidar attachBaseContext()
, recuerde llamar a la superclase attachBaseContext()
o podría producirse pérdidas de datos.
Nota
Dado que este método permite omitir las comprobaciones de directivas de inicio condicional, solo debe usarse después de consultar con Microsoft para confirmar que no hay otra forma compatible de lograr el comportamiento deseado de la aplicación.
Registrarse para recibir notificaciones desde el SDK
Información general
Intune App SDK permite que la aplicación controle el comportamiento de determinadas directivas, como la eliminación selectiva, cuando el administrador de TI las implementa. Cuando un administrador de TI implementa dicha directiva, el servicio de Intune envía una notificación al SDK.
La aplicación debe registrarse para recibir notificaciones del SDK creando un MAMNotificationReceiver y registrándose con MAMNotificationReceiverRegistry. Esto se realiza proporcionando el receptor y el tipo de notificación deseado en App.onCreate
, como se muestra en el ejemplo siguiente:
@Override
public void onCreate() {
super.onCreate();
MAMComponents.get(MAMNotificationReceiverRegistry.class)
.registerReceiver(
new ToastNotificationReceiver(),
MAMNotificationType.WIPE_USER_DATA);
}
MAMNotificationReceiver
La interfaz MAMNotificationReceiver simplemente recibe notificaciones del servicio de Intune. Algunas notificaciones las controla el SDK directamente, mientras que otras requieren la participación de la aplicación. Una aplicación debe devolver true o false de una notificación. Siempre debe devolver true a menos que se haya intentado realizar alguna acción como resultado de un error en la notificación.
- Este error se puede reportar al servicio de Intune. Un ejemplo de un escenario que se va a notificar es si la aplicación no elimina los datos de usuario después de que el administrador de TI inicie una eliminación.
Nota
Es seguro bloquear porque su MAMNotificationReceiver.onReceive
devolución de llamada no se está ejecutando en el subproceso de la interfaz de usuario.
Tipos de notificaciones
Las siguientes notificaciones MAMNotificationType se envían a la aplicación y algunas de ellas pueden requerir la participación de la aplicación:
WIPE_USER_DATA: esta notificación se envía en un MAMUserNotification. Cuando se recibe esta notificación, la aplicación debe eliminar todos los datos asociados con la identidad administrada (de
MAMUserNotification.getUserIdentity()
). La notificación puede producirse por diversos motivos, como cuando la aplicación llama a unregisterAccountForMAM, cuando un administrador de TI inicia una eliminación o cuando no se cumplen las directivas de acceso condicional requeridas por el administrador. Si la aplicación no se registra para esta notificación, se realizará el comportamiento de borrado predeterminado. El comportamiento predeterminado eliminará todos los archivos de una aplicación de identidad única o todos los archivos etiquetados con la identidad administrada de una aplicación de identidad múltiple. Esta notificación nunca se enviará en el subproceso de interfaz de usuario.WIPE_USER_AUXILIARY_DATA: las aplicaciones pueden registrarse para esta notificación si quieren que el SDK de aplicaciones de Intune realice el comportamiento de borrado selectivo predeterminado, pero todavía les gustaría quitar algunos datos auxiliares cuando se produzca el borrado. Esta notificación no está disponible para las aplicaciones de identidad única: solo se enviará a aplicaciones de identidad múltiple. Esta notificación nunca se enviará en el subproceso de interfaz de usuario.
REFRESH_POLICY: esta notificación se envía en un MAMUserNotification. Cuando se recibe esta notificación, cualquier decisión de directiva de Intune almacenada en caché por la aplicación debe invalidarse y actualizarse. Si la aplicación no almacena ningún supuesto de directiva, no necesita registrarse para esta notificación. No se garantiza en qué subproceso se enviará esta notificación.
REFRESH_APP_CONFIG: esta notificación se envía en un MAMUserNotification. Cuando se recibe esta notificación, los datos de configuración de la aplicación almacenados en caché deben invalidarse y actualizarse. No se garantiza en qué subproceso se enviará esta notificación.
MANAGEMENT_REMOVED: esta notificación se envía en un MAMUserNotification e informa a la aplicación de que está a punto de convertirse en no administrada. Una vez no administrado, ya no podrá leer archivos cifrados, leer datos cifrados con MAMDataProtectionManager, interactuar con el portapapeles cifrado o participar de otro modo en el ecosistema de aplicaciones administradas. Vea más detalles a continuación. Esta notificación nunca se enviará en el subproceso de interfaz de usuario.
MAM_ENROLLMENT_RESULT: esta notificación se envía en un MAMEnrollmentNotification para informar a la aplicación de que se ha completado un intento de inscripción de APP-WE y para proporcionar el estado de ese intento. No se garantiza en qué subproceso se enviará esta notificación.
COMPLIANCE_STATUS: esta notificación se envía en un MAMComplianceNotification para informar a la aplicación del resultado de un intento de corrección de cumplimiento. No se garantiza en qué subproceso se enviará esta notificación.
Nota
Una aplicación nunca debe registrarse para las notificaciones WIPE_USER_DATA
y WIPE_USER_AUXILIARY_DATA
.
MANAGEMENT_REMOVED
La MANAGEMENT_REMOVED
notificación indica que un usuario administrado anteriormente por directivas ya no se administrará mediante la directiva MAM de Intune. Esto no requiere borrar los datos de usuario ni firmar la sesión del usuario (si se requiere una eliminación, WIPE_USER_DATA
se enviará una notificación). Es posible que muchas aplicaciones no necesiten controlar esta notificación en absoluto, pero las aplicaciones que usan MAMDataProtectionManager deben tomar nota especial de esta notificación.
Cuando MAM llama al receptor de la MANAGEMENT_REMOVED
aplicación, se cumple lo siguiente:
- MAM ya descifra archivos cifrados anteriormente (pero no búferes de datos protegidos) pertenecientes a la aplicación. Los archivos en ubicaciones públicas de la tarjeta SD que no pertenecen directamente a la aplicación (por ejemplo, las carpetas Documentos o Descargar) no se descifran.
- Los archivos nuevos o búferes de datos protegidos creados por el método receptor (o cualquier otro código que se ejecute después de que se inicie el receptor) no se cifrarán.
- La aplicación todavía tiene acceso a claves de cifrado, por lo que las operaciones como los búferes de datos de descifrado se realizarán correctamente.
Una vez que el receptor de la aplicación vuelva, ya no tendrá acceso a las claves de cifrado.
Configurar biblioteca de autenticación de Microsoft (MSAL)
Nota
Azure Active Directory biblioteca de autenticación (ADAL) está en desuso. Para obtener más información, vea [Update your applications to use Microsoft Authentication Library (MSAL)]. Para migrar la aplicación de ADAL a MSAL, consulta Migrar Android ADAL a MSAL y Diferencias entre ADAL y MSAL.
En primer lugar, lea las directrices de integración de MSAL que se encuentran en el repositorio [MSAL en GitHub]. Para obtener más información, vea [Overview of Microsoft Authentication Library (MSAL)] and the MSAL Wiki.
Debido a la desuso de ADAL, las aplicaciones deben integrarse con MSAL.
Sin embargo, el SDK todavía depende de [ADAL para] sus escenarios de autenticación e inicio condicional.
Los valores de configuración necesarios se comunican al SDK a través de metadatos AndroidManifest
.
Para asegurarse de que la directiva de autenticación de Intune se puede aplicar correctamente, agregue lo siguiente al nodo de la aplicación en AndroidManifest.xml
.
Algunas de estas configuraciones solo son necesarias (consulta configuraciones MSAL comunes a continuación) si la aplicación usa MSAL para la autenticación en general; en ese caso, necesitarás los valores específicos que usa la aplicación para registrarte con AAD.
Esto se hace para asegurarse de que el usuario final no recibe solicitudes de autenticación dos veces, debido AAD reconocer dos valores de registro independientes: uno de la aplicación y otro del SDK.
<meta-data
android:name="com.microsoft.intune.mam.aad.Authority"
android:value="https://AAD authority/" />
<meta-data
android:name="com.microsoft.intune.mam.aad.ClientID"
android:value="your-client-ID-GUID" />
<meta-data
android:name="com.microsoft.intune.mam.aad.NonBrokerRedirectURI"
android:value="your-redirect-URI" />
<meta-data
android:name="com.microsoft.intune.mam.aad.SkipBroker"
android:value="[true | false]" />
Metadatos de MSAL
La autoridad es la AAD en uso. Si este valor no está presente, AAD se usa el entorno público.
Nota
No establezca este campo si la aplicación es consciente de la nube soberana.
ClientID es el AAD ClientID (también conocido como Id. de aplicación) que se va a usar. Debes usar el ClientID de tu propia aplicación si está registrada con Azure AD o aprovechar la inscripción predeterminada si no integra MSAL.
NonBrokerRedirectURI es el URI AAD [redirigir para] usarlo en casos sin agente. Si no se especifica ninguno, se usa un valor predeterminado de
urn:ietf:wg:oauth:2.0:oob
. Este valor predeterminado es adecuado para la mayoría de las aplicaciones.- NonBrokerRedirectURI solo se usa cuando SkipBroker es "true".
SkipBroker se usa para invalidar el comportamiento predeterminado de participación de SSO de MSAL. SkipBroker solo debe especificarse para aplicaciones que especifiquen un ClientID y no admitan autenticación de agente o SSO en todo el dispositivo. En este caso, debe establecerse en "true". La mayoría de las aplicaciones no deben establecer el parámetro SkipBroker.
Un ClientID debe especificarse en el manifiesto para especificar un valor SkipBroker.
Cuando se especifica un ClientID, el valor predeterminado es "false".
Cuando SkipBroker es "true", se usará NonBrokerRedirectURI. Las aplicaciones que no integran MSAL (y por lo tanto no tienen ClientID) también tendrán el valor predeterminado "true".
Configuraciones comunes de MSAL
Las siguientes son formas comunes de configurar una aplicación con MSAL. Busca la configuración de la aplicación y asegúrate de establecer los parámetros de metadatos MSAL (explicados anteriormente) en los valores necesarios. En todos los casos, la autoridad puede especificarse si se desea para entornos no predeterminados. Si no se especifica, se usará la AAD de producción pública.
1. La aplicación no integra MSAL o ADAL
Los metadatos MSAL/ADAL no deben estar presentes en el manifiesto.
2. La aplicación integra MSAL
Parámetro MSAL requerido | Valor |
---|---|
ClientID | ClientID de la aplicación (generado por Azure AD cuando se registra la aplicación) |
La autoridad puede especificarse si es necesario.
Debes registrar la aplicación con Azure AD y dar acceso a la aplicación al servicio de directivas de protección de aplicaciones:
- Consulte Registrar la aplicación con Azure Active Directory para obtener información sobre cómo registrar una aplicación con Azure AD.
- Asegúrate de que se siguen los pasos para conceder permisos de la aplicación Android al servicio de directiva de protección de aplicaciones (APP). Use las instrucciones de la guía "Introducción al SDK de aplicaciones de Intune" en "Dar acceso a la aplicación al servicio de protección de aplicaciones de [Intune (opcional)"].
Vea también los requisitos para el acceso condicional a continuación.
3. La aplicación integra MSAL, pero no admite autenticación intermediada o SSO en todo el dispositivo
Parámetro MSAL requerido | Valor |
---|---|
ClientID | ClientID de la aplicación (generado por Azure AD cuando se registra la aplicación) |
SkipBroker | True |
La autoridad y NonBrokerRedirectURI pueden especificarse si es necesario.
Aplicaciones administradas mam
Información general
MAM admite dispositivos inscritos y no inscritos. El Portal de empresa es necesario que se instale en el dispositivo, pero el usuario no necesita iniciar sesión en el Portal de empresa inscribir el dispositivo.
Flujo de trabajo
Cuando una aplicación crea una nueva cuenta de usuario, debe registrar la cuenta para su administración con intune App SDK. El SDK controlará los detalles de la inscripción de la aplicación en el servicio APP-WE; si es necesario, volverá a intentar las inscripciones en intervalos de tiempo adecuados si se producen errores.
La aplicación también puede consultar el SDK de aplicaciones de Intune para determinar el estado de un usuario registrado para determinar si se debe bloquear el acceso al contenido corporativo. Es posible que se registren varias cuentas para la administración, pero actualmente solo se puede inscribir activamente una cuenta con el servicio APP-WE a la vez. Esto significa que solo una cuenta de la aplicación puede recibir una directiva de protección de aplicaciones a la vez.
La aplicación es necesaria para proporcionar una devolución de llamada para adquirir el token de acceso adecuado de la Biblioteca de autenticación de Microsoft (MSAL) o la Biblioteca de autenticación de Azure Active Directory (ADAL) en nombre del SDK. Se supone que la aplicación ya usa MSAL o ADAL para la autenticación de usuario y para adquirir sus propios tokens de acceso.
Cuando la aplicación quita una cuenta por completo, debe anular el registro de esa cuenta para indicar que la aplicación ya no debe aplicar la directiva para ese usuario. Si el usuario se inscribió en el servicio MAM, el usuario se dará de baja y se borrará la aplicación.
Información general sobre los requisitos de la aplicación
Para implementar la integración de APP-WE, la aplicación debe registrar la cuenta de usuario con el SDK de MAM:
La aplicación debe implementar y registrar una instancia de la interfaz [MAMServiceAuthenticationCallback]. La instancia de devolución de llamada debe estar registrada en el
onCreate()
método (oonMAMCreate()
) de la subclase Application.Cuando se crea una cuenta de usuario y el usuario inicia sesión correctamente con MSAL, la aplicación debe llamar a registerAccountForMAM.
Cuando se quita una cuenta de usuario, la aplicación debe llamar a unregisterAccountForMAM para quitar la cuenta de la administración de Intune.
Nota
La llamada puede iniciar un borrado para quitar completamente los datos corporativos del usuario.
MAMEnrollmentManager
Todas las API de autenticación y registro necesarias se pueden encontrar en la interfaz MAMEnrollmentManager . A reference to the MAMEnrollmentManager
can be obtained as follows:
MAMEnrollmentManager mgr = MAMComponents.get(MAMEnrollmentManager.class);
// make use of mgr
Se MAMEnrollmentManager
garantiza que la instancia devuelta no sea null. Los métodos de API se divide en dos categorías: autenticación y registro de cuentas.
Autenticación de cuentas
En esta sección se describen los métodos de la API de autenticación y MAMEnrollmentManager
cómo usarlos.
interface MAMServiceAuthenticationCallback {
String acquireToken(String upn, String aadId, String resourceId);
}
void registerAuthenticationCallback(MAMServiceAuthenticationCallback callback);
void updateToken(String upn, String aadId, String resourceId, String token);
La aplicación debe implementar la interfaz [MAMServiceAuthenticationCallback] para permitir que el SDK solicite un token de AAD para el identificador de usuario y recurso determinado. La instancia de devolución de llamada debe proporcionarse al llamar
MAMEnrollmentManager
a su método registerAuthenticationCallback. Es posible que se necesite un token al principio del ciclo de vida de la aplicación para los reintentos de inscripción o las protecciones de actualización de directivas de protección de aplicaciones,onCreate()
por lo que la devolución de llamada debe registrarse en el método (onMAMCreate()
o ) de la subclase Application de la aplicación.El método acquireToken debe adquirir el token de acceso para el identificador de recurso solicitado para el usuario determinado. Si no puede adquirir el token solicitado, debe devolver null.
Nota
Asegúrate de que la aplicación usa los
resourceId
parámetrosaadId
pasadosacquireToken()
para que se adquiera el token correcto. SeresourceId
debe usar para generar los ámbitos adecuados yaadId
se debe usar para pasar a lo largo de la cuenta correcta.class MAMAuthCallback implements MAMServiceAuthenticationCallback { public String acquireToken(String upn, String aadId, String resourceId) { final String[] scopes = {resourceId + "/.default"}; final IAccount account = getAccount(aadId); if (account == null) { callback.onError( new MsalUiRequiredException(MsalUiRequiredException.NO_ACCOUNT_FOUND, "no account found for " + aadId)); return; } AcquireTokenSilentParameters params = new AcquireTokenSilentParameters.Builder() .forAccount(account) .fromAuthority(account.getAuthority()) .withScopes(Arrays.asList(scopes)) .withCallback(callback) .build(); return mMsalClientApplication.acquireTokenSilent(params); } private static IAccount getAccount(String aadId) throws InterruptedException, MsalException { IAccount account = null; if (mMsalClientApplication instanceof IMultipleAccountPublicClientApplication) { IMultipleAccountPublicClientApplication multiAccountPCA = (IMultipleAccountPublicClientApplication) mMsalClientApplication; account = multiAccountPCA.getAccount(aadId); } else { ISingleAccountPublicClientApplication singleAccountPCA = (ISingleAccountPublicClientApplication) mMsalClientApplication; ICurrentAccountResult accountResult = singleAccountPCA.getCurrentAccount(); if (accountResult != null) { account = accountResult.getCurrentAccount(); // make sure this is the correct user if (account != null && !account.getId().equals(aadId)) account = null; } } return account; } }
En caso de que la aplicación no pueda proporcionar un token cuando el SDK
acquireToken()
llame (por ejemplo, si se produce un error en la autenticación silenciosa y es un momento inconveniente para mostrar una interfaz de usuario), la aplicación puede proporcionar un token más adelante llamando al método updateToken . El mismo UPN, AAD id. de usuarioacquireToken()
updateToken()
e id. de recurso solicitados por la llamada anterior a debe pasarse a , junto con el token que se adquirió finalmente. La aplicación debe llamar a este método tan pronto como sea posible después de devolver null de la devolución de llamada proporcionada.Nota
No llame desde
updateToken()
dentro de la implementación deacquireToken()
.updateToken()
debe usarse en caso de queacquireToken()
no pueda adquirir un token.Nota
El SDK llamará periódicamente
acquireToken()
para obtener el token, por lo que la llamadaupdateToken()
no es estrictamente necesaria. Sin embargo, se recomienda encarecidamente, ya que puede ayudar a que las inscripciones y las protecciones de directivas de protección de aplicaciones se completen de forma oportuna.
Registro de cuenta
En esta sección se describen los métodos de la API de registro de cuentas en MAMEnrollmentManager y cómo usarlos.
void registerAccountForMAM(String upn, String aadId, String tenantId);
void registerAccountForMAM(String upn, String aadId, String tenantId, String authority);
void unregisterAccountForMAM(String upn);
Result getRegisteredAccountStatus(String upn);
Para registrar una cuenta para la administración, la aplicación debe llamar a
registerAccountForMAM()
. Una cuenta de usuario se identifica mediante su UPN y su AAD de usuario. El identificador de inquilino también es necesario para asociar los datos de inscripción con el inquilino AAD usuario. También se puede proporcionar la autoridad del usuario para permitir la inscripción en nubes soberanas específicas; Para obtener más información, consulte Sovereign Cloud Registration. El SDK puede intentar inscribir la aplicación para el usuario determinado en el servicio MAM; si se produce un error en la inscripción, reintentará periódicamente la inscripción hasta que la cuenta no se haya registrado. El período de reintento suele ser de 12 a 24 horas. El SDK proporciona el estado de los intentos de inscripción de forma asincrónica a través de notificaciones.Dado AAD autenticación, el mejor momento para registrar la cuenta de usuario es después de que el usuario haya iniciado sesión en la aplicación y se autentique correctamente con MSAL. El identificador de AAD de usuario y el identificador de inquilino se devuelven de la llamada de autenticación MSAL [
IAccount
] como parte de la relación con .[IAuthenticationResult
]- La cuenta proviene del método
IAuthenticationResult.getAccount()
y contiene la información de usuario pertinente. - El identificador de inquilino proviene del
IAccount.getTenantId()
método. - El AAD de usuario proviene del
IAccount.getId()
método.
- La cuenta proviene del método
Para anular el registro de una cuenta de la administración de Intune, la aplicación debe llamar a
unregisterAccountForMAM()
. Si la cuenta se ha inscrito correctamente y se administra, el SDK desenrollará la cuenta y borrará sus datos. Se detendrán los reintentos de inscripción periódicos para la cuenta. El SDK proporciona el estado de la solicitud de anulación de inscripción de forma asincrónica mediante notificación.
Registro de nube soberana
Las aplicaciones que [son conscientes de nubes] soberanas proporcionan la authority
to registerAccountForMAM()
.
Instrucciones de MSAL
Para MSAL, se establece multiple_clouds_supported
en en true
el archivo [de configuración de MSAL].
{
"multiple_clouds_supported": true,
}
Instrucciones de ADAL
Nota
La compatibilidad con el registro en la nube soberana requiere la versión 1.14.0 (o superior) de la biblioteca ADAL.
Para ADAL, pase instance_aware=true
a acquireToken
como un parámetro extraQueryParameters
seguido de invocar getAuthority()
el AuthenticationCallback
AuthenticationResult
archivo .
mAuthContext.acquireToken(this, RESOURCE_ID, CLIENT_ID, REDIRECT_URI, PromptBehavior.FORCE_PROMPT, "instance_aware=true",
new AuthenticationCallback<AuthenticationResult>() {
@Override
public void onError(final Exception exc) {
// authentication failed
}
@Override
public void onSuccess(final AuthenticationResult result) {
mAuthority = result.getAuthority();
// handle other parts of the result
}
});
Nota
No establezca el elemento com.microsoft.intune.mam.aad.Authority
de metadatos en AndroidManifest.xml.
Nota
Asegúrese de que la autoridad está establecida correctamente en el MAMServiceAuthenticationCallback::acquireToken()
método.
Nubes soberanas admitidas actualmente
- Nube de Azure US Government
- Microsoft Azure operado por 21Vianet (Azure China)
Notas importantes de implementación
Autenticación
Cuando la aplicación llama a [registerAccountForMAM], puede recibir una devolución de llamada en su interfaz [MAMServiceAuthenticationCallback] poco después, en un subproceso diferente. Idealmente, la aplicación adquirió su propio token AAD antes de registrar la cuenta para acelerar la adquisición del token solicitado. Si la aplicación devuelve un token válido de la devolución de llamada, la inscripción continuará y la aplicación obtiene el resultado final a través de una notificación.
Si la aplicación no devuelve un token de AAD válido, el resultado final del intento de inscripción será
AUTHORIZATION_NEEDED
. Si la aplicación recibe este resultado mediante notificación, se recomienda encarecidamente acelerar el proceso de inscripción adquiriendo el token para el usuario y el recurso previamente solicitados de acquireToken y llamando al método updateToken para iniciar de nuevo el proceso de inscripción.También se llamará a los registrados
MAMServiceAuthenticationCallback
de la aplicación para adquirir un token para las revisiones periódicas de actualización de directivas de protección de aplicaciones. Si la aplicación no puede proporcionar un token cuando se solicita, no recibirá una notificación, pero debe intentar adquirir un tokenupdateToken()
y llamar en el siguiente momento conveniente para acelerar el proceso de protección. Si no se proporciona un token, se llamará a la devolución de llamada en el siguiente intento de check-in.La compatibilidad con nubes soberanas requiere proporcionar la autoridad.
Registro
Para su comodidad, los métodos de registro son idempotent; por ejemplo, [registerAccountForMAM] solo registrará una cuenta e intentará inscribir la aplicación si la cuenta aún no está registrada, y unregisterAccountForMAM solo anulará el registro de una cuenta si está registrada actualmente. Las llamadas posteriores no son operaciones, por lo que no hay ningún daño en llamar a estos métodos más de una vez. Además, no se garantiza la correspondencia entre llamadas a estos métodos y notificaciones de resultados:
registerAccountForMAM()
es decir, si se llama a una identidad que ya está registrada, es posible que no se vuelva a enviar la notificación para esa identidad. Es posible que se envíen notificaciones que no corresponden a ninguna llamada a estos métodos, ya que el SDK puede probar las inscripciones periódicamente en segundo plano y las anulaciones de inscripción pueden desencadenarse por solicitudes de eliminación recibidas desde el servicio de Intune.Se puede llamar a los métodos de registro para cualquier número de identidades diferentes, pero actualmente solo una cuenta de usuario puede inscribirse correctamente. Si varias cuentas de usuario con licencia para Intune y dirigidas por la directiva de protección de aplicaciones se registran al mismo tiempo o casi al mismo tiempo, no hay ninguna garantía de cuál ganará la carrera.
Por último, puede consultar mamenrollmentManager para ver si una cuenta determinada está registrada y obtener su estado actual mediante el método getRegisteredAccountStatus . Si la cuenta proporcionada no está registrada, este método devolverá null. Si la cuenta está registrada, este método devolverá el estado de la cuenta como uno de los miembros de la enumeración MAMEnrollmentManager.Result .
Códigos de resultado y estado
Cuando se registra por primera vez una cuenta, PENDING
comienza en el estado, lo que indica que el intento inicial de inscripción del servicio MAM está incompleto. Una vez que finalice el intento de inscripción, se enviará una notificación con uno de los códigos de resultados de la tabla siguiente. Además, el método getRegisteredAccountStatus devolverá el estado de la cuenta para que la aplicación siempre pueda determinar si el acceso al contenido corporativo está bloqueado para ese usuario. Si se produce un error en el intento de inscripción, el estado de la cuenta puede cambiar con el tiempo a medida que el SDK reintemple la inscripción en segundo plano.
Código de resultados | Explicación |
---|---|
AUTHORIZATION_NEEDED |
Este resultado indica que la instancia de [MAMServiceAuthenticationCallback] registrada de la aplicación no proporcionó un token o que el token proporcionado no era válido. La aplicación debe adquirir un token válido y llamar a updateToken si es posible. |
NOT_LICENSED |
El usuario no tiene licencia para Intune o error al intentar ponerse en contacto con el servicio MAM de Intune. La aplicación debe continuar en un estado no administrado (normal) y el usuario no debe bloquearse. Las inscripciones se volverán a realizar periódicamente en caso de que el usuario tenga licencia en el futuro. |
ENROLLMENT_SUCCEEDED |
El intento de inscripción se ha hecho correctamente o el usuario ya está inscrito. En el caso de una inscripción correcta, se envían REFRESH_POLICY REFRESH_APP_CONFIG las notificaciones correspondientes y correspondientes antes de esta notificación. Se debe permitir el acceso a datos corporativos. |
ENROLLMENT_FAILED |
Error en el intento de inscripción. Se pueden encontrar más detalles en los registros del dispositivo. La aplicación no debe permitir el acceso a datos corporativos en este estado, ya que se determinó previamente que el usuario tiene licencia para Intune. Todas las aplicaciones deben asegurarse de que el acceso a datos corporativos no esté autorizado hasta ENROLLMENT_SUCCEEDED que la aplicación lo obtenga. |
WRONG_USER |
Solo un usuario por dispositivo puede inscribir una aplicación con el servicio MAM. Este resultado indica que el usuario para el que se entregó este resultado (el segundo usuario) está dirigido con la directiva MAM, pero un usuario diferente ya está inscrito. Dado que no se puede aplicar la directiva MAM para el segundo usuario, la aplicación no debe permitir el acceso a los datos de este usuario (posiblemente quitando al usuario de la aplicación) a menos que la inscripción de este usuario se haga correctamente más adelante. Simultáneamente con la entrega de WRONG_USER este resultado, MAM pedirá la opción de quitar la cuenta existente. Si el usuario humano responde afirmativamente, será posible inscribir al segundo usuario poco después. Mientras el segundo usuario permanezca registrado, MAM reintente la inscripción periódicamente. |
UNENROLLMENT_SUCCEEDED |
La inscripción se ha realizado correctamente. |
UNENROLLMENT_FAILED |
Error en la solicitud de anulación de inscripción. Se pueden encontrar más detalles en los registros del dispositivo. En general, esto no se producirá mientras la aplicación pase un UPN válido (ni nulo ni vacío). No hay ninguna corrección directa y confiable que la aplicación pueda tomar. Si este valor se recibe al anular el registro de un UPN válido, informe como un error al equipo mam de Intune. |
PENDING |
El intento de inscripción inicial del usuario está en curso. La aplicación puede bloquear el acceso a datos corporativos hasta que se conozca el resultado de la inscripción, pero no es necesario hacerlo. |
COMPANY_PORTAL_REQUIRED |
El usuario tiene licencia para Intune, pero la aplicación no se puede inscribir hasta que Portal de empresa aplicación esté instalada en el dispositivo. Intune App SDK intentará bloquear el acceso a la aplicación para el usuario determinado y dirigirlo a instalar la aplicación Portal de empresa (vea más adelante para obtener más información). |
Portal de empresa del símbolo del sistema de requisitos (opcional)
Si se COMPANY_PORTAL_REQUIRED
recibe el resultado, el SDK bloqueará el uso de actividades que usen la identidad para la que se solicitó la inscripción. En su lugar, el SDK hará que esas actividades muestren un mensaje para descargar el Portal de empresa. Si quieres evitar este comportamiento en la aplicación, las actividades pueden implementar MAMActivity.onMAMCompanyPortalRequired.
Se llama a este método antes de que el SDK muestre su interfaz de usuario de bloqueo predeterminada. Si la aplicación cambia la identidad de la actividad o anula el registro del usuario que intentó inscribirse, el SDK no bloqueará la actividad. En esta situación, la aplicación debe evitar la pérdida de datos corporativos. Solo las aplicaciones de identidad múltiple (que se debata más adelante) podrán cambiar la identidad de la actividad.
Si no hereda explícitamente MAMActivity (porque las herramientas de compilación harán que cambie), pero aún necesita controlar esta notificación, puede implementar MAMActivityBlockingListener.
Notificaciones
Si la aplicación se registra para notificaciones de tipo MAM_ENROLLMENT_RESULT, se enviará una MAMEnrollmentNotification para informar a la aplicación de que la solicitud de inscripción se ha completado. Se MAMEnrollmentNotification
recibirá a través de la interfaz MAMNotificationReceiver , tal como se describe en la sección Registrar para notificaciones desde el SDK .
public interface MAMEnrollmentNotification extends MAMUserNotification {
MAMEnrollmentManager.Result getEnrollmentResult();
}
El método getEnrollmentResult devuelve el resultado de la solicitud de inscripción. Dado MAMEnrollmentNotification
que se extiende MAMUserNotification
, la identidad del usuario para el que se intentó la inscripción también está disponible. La aplicación debe implementar la interfaz MAMNotificationReceiver
para recibir estas notificaciones, detallada en la sección Registrar para notificaciones de la sección SDK .
El estado de la cuenta de usuario registrada puede cambiar cuando se recibe una notificación de inscripción, pero no cambiará en todos los casos (por ejemplo, AUTHORIZATION_NEEDED
WRONG_USER
si la notificación se recibe después de un resultado más informativo como , el resultado más informativo se mantendrá como estado de la cuenta). Una vez que la cuenta se inscriba correctamente, ENROLLMENT_SUCCEEDED
el estado permanecerá como hasta que la cuenta se anuló o se borrará.
Acceso condicional
El acceso condicional (CA) es una característica Azure Active Directory que se puede usar para controlar el acceso a AAD recursos. Los administradores de Intune pueden definir reglas de CA que permiten el acceso a recursos solo desde dispositivos o aplicaciones administrados por Intune. Para garantizar que la aplicación pueda acceder a los recursos cuando corresponda, es necesario seguir los pasos que se indican a continuación. Si la aplicación no adquiere ningún token de AAD de acceso o solo obtiene acceso a recursos que no pueden estar protegidos por ca, puede omitir estos pasos.
- Registrar la aplicación con Azure Active Directory. Esto generará un identificador de cliente para la aplicación.
- Siga los pasos para [usar MSAL] y Configurar MSAL para usar un agente.
- Establece los parámetros de metadatos de manifiesto por configuraciones MSAL comunes para MSAL integra aplicaciones, consulta más arriba.
App Protection CA
Información general
Con la CA de App Protection (acceso condicional), el acceso a los recursos se condicionaliza en la aplicación de directivas de Protección de aplicaciones de Intune. AAD esto exige que la aplicación se inscriba y se administra mediante APP antes de conceder un token para tener acceso a un recurso protegido por ca.
Nota
La compatibilidad con la CA de App Protection requiere la versión 1.0.0 (o posterior) de la biblioteca MSAL.
Controlar el incumplimiento de MSAL
Al adquirir un token para un usuario, la biblioteca MSAL MsalIntuneAppProtectionPolicyRequiredException
puede devolver o iniciar una para indicar el incumplimiento de la administración de APLICACIONES. Se pueden extraer parámetros adicionales de la excepción para su uso en la corrección del cumplimiento (vea MAMComplianceManager). Una vez que la corrección se realiza correctamente, la aplicación puede volver a intentar la adquisición de tokens a través de MSAL.
MAMComplianceManager
La interfaz MAMComplianceManager se usa cuando se recibe el error necesario para la directiva de MSAL. Contiene el método remediateCompliance al que se debe llamar para intentar poner la aplicación en un estado compatible. A reference to the MAMComplianceManager
can be obtained as follows:
MAMComplianceManager mgr = MAMComponents.get(MAMComplianceManager.class);
// make use of mgr
Se MAMComplianceManager
garantiza que la instancia devuelta no sea null.
package com.microsoft.intune.mam.policy;
public interface MAMComplianceManager {
void remediateCompliance(String upn, String aadId, String tenantId, String authority, boolean showUX);
}
Se remediateCompliance()
llama al método para intentar poner la aplicación bajo administración para satisfacer las condiciones para AAD conceder el token solicitado.
Los cuatro primeros parámetros se pueden extraer de la excepción recibida por el método MSAL AuthenticationCallback.onError()
(vea el ejemplo de código siguiente).
El parámetro final es un valor booleano que controla si se muestra una experiencia de usuario durante el intento de cumplimiento.
Se trata de una interfaz de estilo de progreso de bloqueo sencilla que se proporciona como valor predeterminado para aplicaciones que no tienen necesidad de mostrar experiencia de usuario personalizada durante esta operación.
Solo bloqueará mientras la corrección de cumplimiento esté en curso y no mostrará el resultado final.
La aplicación debe registrar un receptor de notificaciones para controlar el éxito o el error del intento de corrección de cumplimiento (vea a continuación).
El remediateCompliance()
método puede realizar una inscripción de MAM como parte del establecimiento del cumplimiento. La aplicación puede recibir una notificación de inscripción si ha registrado un receptor de notificaciones para notificaciones de inscripción. [MAMServiceAuthenticationCallback] registrado de la aplicación tendrá su método acquireToken llamado para obtener un token para la inscripción de MAM. acquireToken()
se llamará antes de que la aplicación haya adquirido su propio token, por lo que es posible que las tareas de contabilidad o creación de cuentas que realiza la aplicación después de una adquisición de tokens correcta no se hayan realizado todavía. La devolución de llamada debe poder adquirir un token en este caso. Si no puedes devolver un token de acquireToken()
, se producirá un error en el intento de corrección de cumplimiento. Si llama a updateToken más adelante con un token válido para el recurso solicitado, la corrección de cumplimiento se volverá a realizar inmediatamente con el token especificado.
Nota
La adquisición de tokens silenciosos seguirá siendo posible porque acquireToken()
MsalIntuneAppProtectionPolicyRequiredException
el usuario ya se habrá guiado para instalar el agente y registrar el dispositivo antes de que se reciba la excepción.
Esto hace que el agente tenga un token de actualización válido en su caché, lo que permite que la adquisición silenciosa del token solicitado se haga correctamente.
Este es un ejemplo de cómo recibir el error AuthenticationCallback.onError()
requerido por la directiva en el método y llamar al MAMComplianceManager para controlar el error.
public void onError(@Nullable MsalException exc) {
if (exc instanceof MsalIntuneAppProtectionPolicyRequiredException) {
final MsalIntuneAppProtectionPolicyRequiredException policyRequiredException =
(MsalIntuneAppProtectionPolicyRequiredException) ex;
final String upn = policyRequiredException.getAccountUpn();
final String aadId = policyRequiredException.getAccountUserId();
final String tenantId = policyRequiredException.getTenantId();
final String authority = policyRequiredException.getAuthorityURL();
MAMComplianceManager complianceManager = MAMComponents.get(MAMComplianceManager.class);
complianceManager.remediateCompliance(upn, aadId, tenantId, authority, showUX);
}
}
Notificaciones de estado
Si la aplicación se registra para notificaciones de tipo COMPLIANCE_STATUS, se enviará una MAMComplianceNotification para informar a la aplicación del estado final del intento de corrección de cumplimiento. Se MAMComplianceNotification
recibirá a través de la interfaz MAMNotificationReceiver , tal como se describe en la sección Registrar para notificaciones desde el SDK .
public interface MAMComplianceNotification extends MAMUserNotification {
MAMCAComplianceStatus getComplianceStatus();
String getComplianceErrorTitle();
String getComplianceErrorMessage();
}
El getComplianceStatus()
método devuelve el resultado del intento de corrección de cumplimiento como un valor de la enumeración MAMCAComplianceStatus .
Código de estado | Explicación |
---|---|
UNKNOWN | El estado es desconocido. Esto podría indicar un motivo de error imprevisto. Puede encontrar información adicional en los registros Portal de empresa datos. |
COMPATIBLE | La corrección de cumplimiento se ha correcto y la aplicación ahora cumple con la directiva. La adquisición de tokens MSAL debe volver a realizarse. |
NOT_COMPLIANT | Error en el intento de corregir el cumplimiento. La aplicación no es compatible y la adquisición de tokens MSAL no debe volver a realizarse hasta que se corrija la condición de error. Se envía información de error adicional con MAMComplianceNotification. |
SERVICE_FAILURE | Hubo un error al intentar recuperar datos de cumplimiento del servicio de Intune. Puede encontrar información adicional en los registros Portal de empresa datos. |
NETWORK_FAILURE | Se produjo un error al conectarse al servicio de Intune. La aplicación debe volver a intentar la adquisición de tokens cuando se restaure la conexión de red. |
CLIENT_ERROR | Error en el intento de corregir el cumplimiento por algún motivo relacionado con el cliente. Por ejemplo, ningún token o usuario incorrecto. Se envía información de error adicional con MAMComplianceNotification. |
PENDIENTE | Error al intentar corregir el cumplimiento porque la respuesta de estado aún no se había recibido del servicio cuando se superó el límite de tiempo. La aplicación debe volver a intentar la adquisición de tokens más adelante. |
COMPANY_PORTAL_REQUIRED | El Portal de empresa debe instalarse en el dispositivo para que la corrección de cumplimiento se cumpla correctamente. Si el Portal de empresa ya está instalado en el dispositivo, la aplicación debe reiniciarse. En este caso, se mostrará un cuadro de diálogo en el que se le pedirá al usuario que reinicie la aplicación. |
Si el estado de cumplimiento es MAMCAComplianceStatus.COMPLIANT
, la aplicación debe volver a iniciar su adquisición de tokens original (para su propio recurso). Si se ha fallado el intento de corrección de cumplimiento, getComplianceErrorTitle()
los métodos and getComplianceErrorMessage()
devolverán cadenas localizadas que la aplicación puede mostrar al usuario final si lo elige. La mayoría de los casos de error no son remediables por parte de la aplicación, por lo que para el caso general puede ser mejor fallar la creación o el inicio de sesión de la cuenta y permitir que el usuario vuelva a intentarlo más adelante. Si un error es persistente, los registros mam pueden ayudar a determinar la causa. El usuario final puede enviar los registros. Para obtener más información, vea Upload y registros de correo electrónico.
Puesto MAMComplianceNotification
que se extiende MAMUserNotification
, la identidad del usuario para el que se intentó la corrección también está disponible.
Este es un ejemplo de registro de un receptor mediante una clase anónima para implementar la interfaz MAMNotificationReceiver:
final MAMNotificationReceiverRegistry notificationRegistry = MAMComponents.get(MAMNotificationReceiverRegistry.class);
// create a receiver
final MAMNotificationReceiver receiver = new MAMNotificationReceiver() {
public boolean onReceive(MAMNotification notification) {
if (notification.getType() == MAMNotificationType.COMPLIANCE_STATUS) {
MAMComplianceNotification complianceNotification = (MAMComplianceNotification) notification;
// take appropriate action based on complianceNotification.getComplianceStatus()
// unregister this receiver if no longer needed
notificationRegistry.unregisterReceiver(this, MAMNotificationType.COMPLIANCE_STATUS);
}
return true;
}
};
// register the receiver
notificationRegistry.registerReceiver(receiver, MAMNotificationType.COMPLIANCE_STATUS);
Nota
El receptor de notificaciones debe registrarse antes de llamar remediateCompliance()
para evitar una condición de carrera que pueda provocar la falta de la notificación.
Declaración de compatibilidad con la CA de la aplicación
Una vez que la aplicación esté lista para administrar la corrección de ca de aplicación, puedes decir a Microsoft Identity que la aplicación está lista para la CA de la aplicación. Para ello en la aplicación MSAL, cree el cliente público con las funcionalidades de cliente de "protapp"
{
"client_id" : "4b0db8c2-9f26-4417-8bde-3f0e3656f8e0",
"authorization_user_agent" : "DEFAULT",
"redirect_uri" : "msauth://com.microsoft.identity.client.sample.local/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D",
"multiple_clouds_supported":true,
"broker_redirect_uri_registered": true,
"account_mode": "MULTIPLE",
"client_capabilities": "protapp",
"authorities" : [
{
"type": "AAD",
"audience": {
"type": "AzureADandPersonalMicrosoftAccount"
}
}
]
}
Notas de implementación
Nota
El método de la aplicación MAMServiceAuthenticationCallback.acquireToken()
debe pasar false para la forceRefresh
marca a acquireTokenSilentAsync()
.
AcquireTokenSilentParameters acquireTokenSilentParameters =
builder.withScopes(Arrays.asList(scopes))
.forceRefresh(false)
.build();
acquireTokenSilentAsync(acquireTokenSilentParameters);
Nota
Si desea mostrar una experiencia de usuario de bloqueo personalizada durante el intento de corrección, debe pasar false para el parámetro showUX a remediateCompliance()
. Debe asegurarse de mostrar la experiencia de usuario y registrar primero el agente de escucha de notificaciones antes de llamar a remediateCompliance()
. Esto evitará una condición de carrera en la que se podría perder la notificación si se produce remediateCompliance()
un error muy rápido. Por ejemplo, el método onCreate()
or onMAMCreate()
de una subclase Activity es el lugar ideal para registrar el agente de escucha de notificaciones y, a continuación, llamar a remediateCompliance()
. Los parámetros para remediateCompliance()
se pueden pasar a la experiencia de usuario como extras de propósito. Cuando se recibe la notificación de estado de cumplimiento, puede mostrar el resultado o simplemente finalizar la actividad.
Nota
remediateCompliance()
registrará la cuenta e intentará la inscripción. Una vez adquirido el token principal, la llamada registerAccountForMAM()
no es necesaria, pero no hay ningún daño al hacerlo. Por otro lado, si la aplicación no puede adquirir su token y desea quitar la cuenta de usuario, unregisterAccountForMAM()
debe llamar para quitar la cuenta y evitar los reintentos de inscripción en segundo plano.
Protección de datos de copia de seguridad
Puedes leer más sobre las opciones de copia de seguridad y restauración de Android en la guía de la API de Android y los cambios introducidos en Android S /12 aquí: Cambiar a copia de seguridad y restauración.
Copia de seguridad automática para aplicaciones
A partir de Android M, Android comenzó a ofrecer copias de seguridad completas automáticas para Google Drive aplicaciones, independientemente de la API de destino de la aplicación.
Intune te permite usar todas las características de copia de seguridad automática disponibles desde Android, incluida la capacidad de definir reglas personalizadas en XML, con instrucciones específicas de integración de Intune para garantizar que se aplique la protección de datos.
Valores de manifiesto
De forma predeterminada, android:allowBackup
se establece en true como se describe en habilitar y deshabilitar la copia de seguridad.
Si la aplicación no requiere la funcionalidad de copia de seguridad y restauración completa, establece android:allowBackup
en false.
En este caso, no es necesario realizar ninguna acción adicional y los datos "corporativos" permanecerán dentro de la aplicación.
Si la aplicación requiere la funcionalidad de copia de seguridad y restauración completa, establece android:allowBackup
en true y realiza los siguientes pasos adicionales:
Si la aplicación no usa su
BackupAgent
propia aplicación personalizada, usa el MAMBackupAgent predeterminado para permitir copias de seguridad completas automáticas compatibles con directivas de Intune. Coloca lo siguiente en el manifiesto de la aplicación:<application ... android:fullBackupOnly="true" android:backupAgent="com.microsoft.intune.mam.client.app.backup.MAMDefaultBackupAgent" ...> </application>
[Opcional] Si implementó un personalizado opcional
BackupAgent
, debe asegurarse de usar MAMBackupAgent o MAMBackupAgentHelper. Vea las secciones siguientes. Considere la posibilidad de cambiar a usar MAMDefaultBackupAgent de Intune, descrito en el paso 1, que proporciona una copia de seguridad sencilla en Android M y versiones posteriores.Cuando decidas qué tipo de copia de seguridad completa debe recibir la aplicación (sin filtrar, filtrada o ninguna),
android:fullBackupContent
tendrás que establecer el atributo en true, false o un recurso XML en la aplicación.A continuación, debe
android:fullBackupContent
com.microsoft.intune.mam.FullBackupContent
copiar el valor de en la etiqueta de metadatos y para las aplicaciones que admiten el nuevo formato de configuración XML agregado en la API 31, en la etiquetacom.microsoft.intune.mam.DataExtractionRules
de metadatos.Ejemplo 1: Si quieres que la aplicación tenga copias de seguridad completas sin exclusiones, debes establecer los atributos y las etiquetas de metadatos en true:
<application ... android:fullBackupContent="true" ...> </application> ... <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="true" /> <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:value="true" />
Ejemplo 2: Si
BackupAgent
desea que la aplicación use su configuración personalizada y no completa, compatible con directivas de Intune, copias de seguridad automáticas, debe establecer los atributos y las etiquetas de metadatos en false:<application ... android:fullBackupContent="false" ...> </application> ... <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="false" /> <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:value="false" />
Ejemplo 3: Si quieres que la aplicación tenga copias de seguridad completas según las reglas personalizadas definidas en un archivo XML, establece la etiqueta de atributo y metadatos en el mismo recurso XML:
<application ... android:fullBackupContent="@xml/my_full_backup_content_scheme" android:dataExtractionRules="@xml/my_data_extraction_rules_scheme" ...> </application> ... <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:resource="@xml/my_full_backup_content_scheme" /> <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:resource="@xml/my_data_extraction_rules_scheme" />
Copia de seguridad clave/valor
La opción Copia de seguridad clave/ valor está disponible para todas las API 8+ y carga los datos de la aplicación en el servicio de copia de seguridad de Android. La cantidad de datos por usuario de la aplicación está limitada a 5 MB. Si usa copia de seguridad clave/valor, debe usar [un BackupAgentHelper] o un BackupAgent.
BackupAgentHelper
[BackupAgentHelper es] más fácil de implementar que BackupAgent tanto en términos de funcionalidad nativa de Android como de integración de MAM de Intune. BackupAgentHelper permite al desarrollador registrar archivos completos y preferencias compartidas en un FileBackupHelper
SharedPreferencesBackupHelper
y (respectivamente) que luego se agregan al BackupAgentHelper al crearse. Siga los pasos siguientes para usar backupAgentHelper con MAM de Intune:
Para usar la copia de seguridad de identidades múltiples con una
BackupAgentHelper
, sigue la guía de Android de Extending BackupAgentHelper.Haga que la clase extienda el equivalente mam de BackupAgentHelper, FileBackupHelper y SharedPreferencesBackupHelper.
Clase Android | Equivalente de MAM |
---|---|
BackupAgentHelper | MAMBackupAgentHelper |
FileBackupHelper | MAMFileBackupHelper |
SharedPreferencesBackupHelper | MAMSharedPreferencesBackupHelper |
Siguiendo estas directrices, se realizará una copia de seguridad y restauración de varias identidades correcta.
BackupAgent
Un BackupAgent le permite ser mucho más explícito sobre qué datos se copian de seguridad. Dado que el desarrollador es bastante responsable de la implementación, hay más pasos necesarios para garantizar la protección de datos adecuada de Intune. Dado que la mayor parte del trabajo se inserta en ti, el desarrollador, la integración de Intune está un poco más implicada.
Integrar MAM:
Lea atentamente la guía de Android para copia de seguridad clave / valor y, específicamente, extender BackupAgent para asegurarse de que la implementación de BackupAgent se corresponda con las directrices de Android.
Que la clase [extienda MAMBackupAgent].
Copia de seguridad de identidad múltiple:
Antes de comenzar la copia de seguridad, compruebe que los archivos o búferes de datos que tiene previsto realizar una copia de seguridad están permitidos por el administrador de TI para realizar una copia de seguridad en escenarios de identidad múltiple. Le proporcionamos la función
isBackupAllowed
en MAMFileProtectionManager y MAMDataProtectionManager para determinar esto. Si no se permite realizar una copia de seguridad del archivo o del búfer de datos, no debe continuar incluyéndolo en la copia de seguridad.En algún momento durante la copia de seguridad, si desea realizar una copia de seguridad de las identidades de los archivos que ha comprobado en el paso 1,
backupMAMFileIdentity(BackupDataOutput data, File … files)
debe llamar con los archivos desde los que tiene previsto extraer datos. Esto creará automáticamente nuevas entidades de copia de seguridad y las escribirá automáticamente en laBackupDataOutput
cuenta. Estas entidades se consumirán automáticamente al restaurarse.
Restauración de identidad múltiple:
La guía de copia de seguridad de datos especifica un algoritmo general para restaurar los datos de la aplicación y proporciona un ejemplo de código en la sección Extender BackupAgent . Para que una restauración de identidad múltiple se realice correctamente, debe seguir la estructura general proporcionada en este ejemplo de código con especial atención a lo siguiente:
Debe usar un bucle
while(data.readNextHeader())
* para recorrer las entidades de copia de seguridad.Debe llamar a
data.skipEntityData()
* sidata.getKey()
* no coincide con la clave que escribió enonBackup
. Sin realizar este paso, es posible que las restauraciones no se realicen correctamente.Evite devolver al consumir entidades de copia de seguridad en la
while(data.readNextHeader())
construcción *, ya que las entidades que escribimos automáticamente se perderán.
- Where
data
is the local variable name for the MAMBackupDataInput that is passed to your app upon restore.
Identidad múltiple (opcional)
Información general
De forma predeterminada, el SDK de aplicaciones de Intune aplicará la directiva a la aplicación en su conjunto. Multi-identity es una característica opcional de protección de aplicaciones de Intune que se puede habilitar para permitir que la directiva se aplique en un nivel por identidad. Esto requiere una participación significativamente mayor que otras características de protección de aplicaciones.
Nota
La falta de la participación correcta de la aplicación puede provocar pérdidas de datos y otros problemas de seguridad.
Una vez que el usuario inscribe el dispositivo o la aplicación, el SDK registra esta identidad y la considera la identidad administrada principal de Intune. Otros usuarios de la aplicación se tratarán como no administrados, con una configuración de directiva sin restricciones.
Nota
Actualmente, solo se admite una identidad administrada de Intune por dispositivo.
Una identidad se define como una cadena. Las identidades no admiten mayúsculas de minúsculas y es posible que las solicitudes al SDK para una identidad no devuelvan la misma mayúscula de minúsculas que se usó originalmente al establecer la identidad.
La aplicación debe informar al SDK cuándo tiene previsto cambiar la identidad activa. En algunos casos, el SDK también notificará a la aplicación cuando se requiera un cambio de identidad. Sin embargo, en la mayoría de los casos, MAM no puede saber qué datos se muestran en la interfaz de usuario o se usan en un subproceso en un momento determinado y se basa en la aplicación para establecer la identidad correcta para evitar la pérdida de datos. En las secciones siguientes, se llamará a algunos escenarios concretos que requieren acción de la aplicación.
Habilitar multi-identidad
De forma predeterminada, todas las aplicaciones se consideran aplicaciones de identidad única. Puedes declarar que una aplicación es multi-identidad mediante la colocación de los siguientes metadatos en AndroidManifest.xml.
<meta-data
android:name="com.microsoft.intune.mam.MAMMultiIdentity"
android:value="true" />
Establecer la identidad
Los desarrolladores pueden establecer la identidad del usuario de la aplicación en los siguientes niveles en prioridad descendente:
- Nivel de subproceso
Context
(por lo generalActivity
) nivel- Nivel de proceso
Un conjunto de identidades en el nivel de subproceso reemplaza a Context
un conjunto de identidades en el nivel, que reemplaza a un conjunto de identidades en el nivel de proceso. Un conjunto de identidades en a Context
solo se usa en escenarios asociados adecuados. Las operaciones de E/S de archivo, por ejemplo, no tienen un archivo Context
. Normalmente, las aplicaciones establecerán la Context
identidad en un Activity
archivo . Una aplicación no debe mostrar datos de una identidad administrada a menos que la Activity
identidad esté establecida en esa misma identidad. En general, la identidad de nivel de proceso solo es útil si la aplicación solo funciona con un solo usuario a la vez en todos los subprocesos. Es posible que muchas aplicaciones no necesiten hacer uso de ella.
Si la aplicación usa Application
el contexto para adquirir servicios del sistema, asegúrate de que se ha establecido la identidad del subproceso o del proceso o que has establecido la identidad de la interfaz de usuario en el contexto de la Application
aplicación.
Si la aplicación usa un Service
contexto para iniciar intenciones, usar solucionadores de contenido o aprovechar otros servicios del sistema, asegúrese de establecer la identidad en el Service
contexto.
Para controlar casos especiales al actualizar la identidad de la interfaz de usuario con setUIPolicyIdentity o switchMAMIdentity, se puede pasar a ambos métodos un conjunto de valores IdentitySwitchOption .
IGNORE_INTENT
: Se usa si se solicita un modificador de identidad que debe omitir la intención asociada a la actividad actual. Por ejemplo:- La aplicación recibe una intención de una identidad administrada que contiene un documento administrado y la aplicación muestra el documento.
- El usuario cambia a su identidad personal, por lo que la aplicación solicita un modificador de identidad de interfaz de usuario. En la identidad personal, la aplicación ya no muestra el documento, por lo que se
IGNORE_INTENT
usa al solicitar el modificador de identidad.
DATA_FROM_INTENT
: se usa si se solicita un modificador de identidad cuando los datos de la intención se mostrarán en la actividad. Lo contrario deIGNORE_INTENT
. Esto hará que la directiva de recepción de la nueva identidad trate la intención como datos entrantes.Por ejemplo: la aplicación recibe una intención que contiene metadatos que la correlacionan con una cuenta específica. La aplicación solicita un modificador de identidad, pero mostrará los datos de la intención original.
Si no se establece ninguno, el comportamiento predeterminado está en algún lugar entre sí para la compatibilidad histórica. DATA_FROM_INTENT
MAM asumirá que la intención más reciente se sigue utilizando en la aplicación como con , sin embargo, un rango de condiciones especiales, incluida la intención que se envió desde la misma aplicación o desde el iniciador del sistema, omitirá la comprobación de entrada de datos.
Nota
Dado que se CLIPBOARD_SERVICE
usa para las operaciones de la interfaz de usuario, el SDK usa la identidad de la interfaz de usuario de la actividad en primer plano para las ClipboardManager
operaciones.
Los siguientes métodos de MAMPolicyManager se pueden usar para establecer la identidad y recuperar los valores de identidad establecidos anteriormente.
public static void setUIPolicyIdentity(final Context context, final String identity, final MAMSetUIIdentityCallback mamSetUIIdentityCallback,
final EnumSet<IdentitySwitchOption> options);
public static String getUIPolicyIdentity(final Context context);
public static MAMIdentitySwitchResult setProcessIdentity(final String identity);
public static String getProcessIdentity();
public static MAMIdentitySwitchResult setCurrentThreadIdentity(final String identity);
public static String getCurrentThreadIdentity();
/**
* Get the current app policy. This does NOT take the UI (Context) identity into account.
* If the current operation has any context (e.g. an Activity) associated with it, use the overload below.
*/
public static AppPolicy getCurrentThreadPolicy();
/**
* Get the current app policy. This DOES take the UI (Context) identity into account.
* If the current operation has any context (e.g. an Activity) associated with it, use this function.
*/
public static AppPolicy getPolicy(final Context context);
public static AppPolicy getPolicyForIdentity(final String identity);
public static boolean getIsIdentityManaged(final String identity);
Nota
Puedes borrar la identidad de la aplicación estableciendola en null.
La cadena vacía puede usarse como una identidad que nunca tendrá directiva de protección de aplicaciones.
Resultados
Todos los métodos usados para establecer los valores de resultados del informe de identidad a través de MAMIdentitySwitchResult. Hay cuatro valores que se pueden devolver:
Valor devuelto | Escenario |
---|---|
SUCCEEDED |
El cambio de identidad se ha realizado correctamente. |
NOT_ALLOWED |
No se permite el cambio de identidad. Esto ocurre si se intenta establecer la identidad de la interfaz de usuario (Context ) cuando se establece una identidad diferente en el subproceso actual. |
CANCELLED |
El usuario canceló el cambio de identidad, por lo general presionando el botón atrás en un pin o símbolo del sistema de autenticación. |
FAILED |
Error en el cambio de identidad por un motivo no especificado. |
La aplicación debe asegurarse de que un cambio de identidad se realiza correctamente antes de mostrar o usar datos corporativos. Actualmente, los modificadores de identidad de procesos y subprocesos siempre tendrán éxito en una aplicación habilitada para varias identidades, pero nos reservamos el derecho de agregar condiciones de error. El modificador de identidad de la interfaz de usuario puede fallar para argumentos no válidos, si entra en conflicto con la identidad del subproceso o si el usuario cancela los requisitos de inicio condicional (por ejemplo, presiona el botón Atrás en la pantalla de PIN). El comportamiento predeterminado de un modificador de identidad de interfaz de usuario con error en una actividad es finalizar la actividad (vea a continuación onSwitchMAMIdentityComplete
).
En el caso de establecer una identidad mediante Context
setUIPolicyIdentity, el resultado se notifica de forma asincrónica. Si el Context
es Activity
un , el SDK no sabe si el cambio de identidad se realizó correctamente hasta después de que se realice el inicio condicional, lo que puede requerir que el usuario escriba un PIN o credenciales corporativas. La aplicación puede implementar una MAMSetUIIdentityCallback para recibir este resultado o puede pasar null para el objeto de devolución de llamada. Tenga en cuenta que si se realiza una llamada mientras el resultado de una llamada anterior a setUIPolicyIdentity
en el mismo contexto aún no se ha entregado, la nueva devolución de llamada reemplazará a la anterior y la devolución de llamada original nunca recibirá un resultado.setUIPolicyIdentity
También puede establecer la identidad de una actividad directamente a través de un método en MAMActivity en lugar de llamar a MAMPolicyManager.setUIPolicyIdentity
. Use el siguiente método para hacerlo:
public final void switchMAMIdentity(final String newIdentity, final EnumSet<IdentitySwitchOption> options);
También puedes invalidar un método si MAMActivity
quieres que se notifique a la aplicación del resultado de los intentos de cambiar la identidad de esa actividad.
public void onSwitchMAMIdentityComplete(final MAMIdentitySwitchResult result);
Si no invalida onSwitchMAMIdentityComplete
(o super
llama al método), un modificador de identidad con error en una actividad dará como resultado que la actividad finalice. Si invalida el método, debe tener cuidado de que los datos corporativos no se muestren después de un modificador de identidad con error.
Nota
Cambiar la identidad puede requerir la recreación de la actividad. En este caso, la devolución onSwitchMAMIdentityComplete
de llamada se entregará a la nueva instancia de la actividad.
Cambios implícitos de identidad
Además de la capacidad de la aplicación para establecer la identidad, un subproceso o la identidad de un contexto puede cambiar en función de la entrada de datos de otra aplicación administrada por Intune que tenga directiva de protección de aplicaciones.
Ejemplos
Si una actividad
Intent
se inicia desde una aplicación mam enviada por otra,Intent
la identidad de la actividad se establecerá en función de la identidad efectiva de la otra aplicación en el momento en que se envió la actividad.Para los servicios, la identidad del subproceso se establecerá de forma similar durante la duración de una llamada
onStart
oonBind
. Las llamadas a losBinder
devueltosonBind
también establecerán temporalmente la identidad del subproceso.Las llamadas a un
ContentProvider
establecerán de forma similar la identidad del subproceso durante su duración.
Además, la interacción del usuario con una actividad puede provocar un cambio de identidad implícito.
Ejemplo: Un usuario que cancele una solicitud de autorización durante Resume
dará como resultado un cambio implícito a una identidad vacía.
La aplicación tiene la oportunidad de ser consciente de estos cambios y, si es necesario, la aplicación puede prohibirlos. MAMService y MAMContentProvider exponen el siguiente método que las subclases pueden invalidar:
public void onMAMIdentitySwitchRequired(final String identity,
final AppIdentitySwitchResultCallback callback);
En la MAMActivity
clase, hay un parámetro adicional presente en el método:
public void onMAMIdentitySwitchRequired(final String identity,
final AppIdentitySwitchReason reason,
final AppIdentitySwitchResultCallback callback);
AppIdentitySwitchReason captura el origen del modificador implícito y puede aceptar los
CREATE
valores ,RESUME_CANCELLED
yNEW_INTENT
. ElRESUME_CANCELLED
motivo se usa cuando la reanudación de actividad hace que se muestre el PIN, la autenticación u otra interfaz de usuario de cumplimiento y el usuario intente cancelar esa interfaz de usuario, por lo general mediante el uso del botón Atrás.AppIdentitySwitchResultCallback es el siguiente:
public interface AppIdentitySwitchResultCallback { /** * @param result * whether the identity switch can proceed. */ void reportIdentitySwitchResult(AppIdentitySwitchResult result); }
Donde AppIdentitySwitchResult es o
SUCCESS
FAILURE
.
Se llama al onMAMIdentitySwitchRequired
método para todos los cambios implícitos de identidad excepto los realizados a través de un enlazador devuelto de MAMService.onMAMBind
. Las implementaciones predeterminadas de onMAMIdentitySwitchRequired
llamada inmediata:
callback.reportIdentitySwitchResult(FAILURE)
cuando el motivo esRESUME_CANCELLED
.callback.reportIdentitySwitchResult(SUCCESS)
en todos los demás casos.No se espera que la mayoría de las aplicaciones deba bloquear o retrasar un cambio de identidad de una manera diferente, pero si una aplicación necesita hacerlo, deben tenerse en cuenta los siguientes puntos:
Si se bloquea un modificador de identidad, el resultado es el mismo que
Receive
si la configuración de uso compartido hubiera prohibido la entrada de datos.Si un servicio se ejecuta en el subproceso principal,
reportIdentitySwitchResult
se debe llamar sincrónicamente o el subproceso de interfaz de usuario deja de responder.Para
Activity
su creación, se llamará a onMAMIdentitySwitchRequired antes deonMAMCreate
. Si la aplicación debe mostrar la interfaz de usuario para determinar si se va a permitir el cambio de identidad, esa interfaz de usuario debe mostrarse con una actividad diferente.In an
Activity
, when a switch to the empty identity is requested with the reason asRESUME_CANCELLED
, the app must modify the resumed activity to display data consistent with that identity switch. Si esto no es posible, la aplicación debe rechazar el cambio y se le pedirá de nuevo al usuario que cumpla con la directiva para la identidad de reanudación (por ejemplo, al presentarse con la pantalla de entrada del PIN de la aplicación).Nota
Una aplicación de identidad múltiple siempre recibirá datos entrantes de aplicaciones administradas y no administradas. Es responsabilidad de la aplicación tratar los datos de identidades administradas de forma administrada.
Si se administra una identidad solicitada (use MAMPolicyManager.getIsIdentityManaged para comprobar), pero la aplicación no puede usar esa cuenta (por ejemplo, porque las cuentas, como las cuentas de correo electrónico, deben configurarse primero en la aplicación), se debe rechazar el modificador de identidad.
Consideraciones sobre el complemento de compilación y la herramienta
Si no hereda explícitamente de MAMActivity, MAMService o MAMContentProvider (porque permite que las herramientas de compilación realicen ese cambio), pero todavía necesita procesar modificadores de identidad, puede implementar MAMActivityIdentityRequirementListener Activity
para una o MAMIdentityRequirementListener para un o Service
ContentProviders
.
Se puede tener acceso MAMActivity.onMAMIdentitySwitchRequired
al comportamiento predeterminado llamando al método estático MAMActivity.defaultOnMAMIdentitySwitchRequired(activity, identity, reason, callback)
.
Del mismo modo, si necesita invalidar MAMActivity.onSwitchMAMIdentityComplete
, puede implementar MAMActivityIdentitySwitchListener
sin heredar explícitamente de MAMActivity
.
Modificadores de identidad y restricciones de captura de pantalla
MAM controla la marca Window
para FLAG_SECURE
aplicar la directiva de captura de pantalla. Algunas aplicaciones también pueden establecerse FLAG_SECURE
para sus propios fines. Cuando la directiva mam no restringe las capturas de pantalla, MAM no modificará FLAG_SECURE
. Al realizar la transición de una identidad cuya directiva requiere deshabilitar capturas de pantalla a una identidad cuya directiva no lo haga, MAM borrará FLAG_SECURE
. Por lo tanto, la aplicación no debe depender del FLAG_SECURE
conjunto restante después de una transición de identidad.
Conservación de identidad en operaciones asincrónicas
Es habitual que las operaciones en el subproceso de interfaz de usuario envíen tareas en segundo plano a otro subproceso. Una aplicación de identidad múltiple querrá asegurarse de que estas tareas en segundo plano funcionan con la identidad adecuada, que suele ser la misma identidad usada por la actividad que las envió. El SDK de MAM proporciona MAMAsyncTask y MAMIdentityExecutors como una comodidad para ayudar a conservar la identidad. Estos deben usarse si la operación asincrónica podría escribir datos corporativos en un archivo o podría comunicarse con otras aplicaciones.
MAMAsyncTask
Para usar MAMAsyncTask
, simplemente hereda de ella en lugar de AsyncTask
reemplazar las invalidaciones de doInBackground
y onPreExecute
con doInBackgroundMAM
y respectivamente onPreExecuteMAM
. El MAMAsyncTask
constructor toma un contexto de actividad. Por ejemplo:
AsyncTask<Object, Object, Object> task = new MAMAsyncTask<Object, Object, Object>(thisActivity) {
@Override
protected Object doInBackgroundMAM(final Object[] params) {
// Do operations.
}
@Override
protected void onPreExecuteMAM() {
// Do setup.
};
}
MAMIdentityExecutors
MAMIdentityExecutors
permite ajustar una instancia o existente Executor
como una conservación de identidad con wrapExecutor
Executor
/ExecutorService
y métodos.wrapExecutorService
ExecutorService
Por ejemplo
Executor wrappedExecutor = MAMIdentityExecutors.wrapExecutor(originalExecutor, activity);
ExecutorService wrappedService = MAMIdentityExecutors.wrapExecutorService(originalExecutorService, activity);
Protección de archivos
Cada archivo tiene una identidad asociada al mismo en el momento de la creación, en función de la identidad del subproceso y del proceso. Esta identidad se usará tanto para el cifrado de archivos como para el borrado selectivo. Solo se cifrarán los archivos cuya identidad se administra y tiene una directiva que requiere cifrado. La eliminación de funcionalidad selectiva predeterminada del SDK solo borrará los archivos asociados con la identidad administrada para la que se ha solicitado una eliminación. La aplicación puede consultar o cambiar la identidad de un archivo mediante la [clase MAMFileProtectionManager] .
Responsabilidad de la aplicación
MAM no puede inferir automáticamente una relación entre los archivos que se leen y los datos que se muestran en un Activity
. Apps must set the UI identity
appropriately before displaying corporate data. This includes data
read from files. If a file comes from outside the app (either from a
ContentProvider
or read from a publicly writable location), the app
must attempt to determine the file identity (using the correct
MAMFileProtectionManager.getProtectionInfo overload for the data source)
before displaying information read from the file. If getProtectionInfo
reports a
non-null, non-empty identity, the UI identity must be set to match
this identity (using MAMActivity.switchMAMIdentity or
MAMPolicyManager.setUIPolicyIdentity). Si se produce un error en el modificador de identidad, no se deben mostrar los datos del archivo . Al leer desde un URI de contenido, es posible que sea necesario leer primero la identidad ( getProtectionInfo
a través de la sobrecarga que toma un Uri
), luego establecer el contexto o la identidad del subproceso correctamente antes de abrir un descriptor de archivo o una secuencia de entrada en el ContentResolver
se realizará correctamente.
Un flujo de ejemplo puede tener un aspecto parecido al siguiente:
El usuario selecciona un documento para abrir en la aplicación.
Durante el flujo abierto, antes de leer datos del disco, la aplicación confirma la identidad que se debe usar para mostrar el contenido:
MAMFileProtectionInfo info = MAMFileProtectionManager.getProtectionInfo(docPath) if (info != null) MAMPolicyManager.setUIPolicyIdentity(activity, info.getIdentity(), callback, EnumSet.noneOf<IdentitySwitchOption.class>)
La aplicación espera hasta que se notifica un resultado a la devolución de llamada.
Si el resultado notificado es un error, la aplicación no muestra el documento.
La aplicación se abre y representa el archivo.
Si una aplicación usa Android DownloadManager
para descargar archivos, el SDK de MAM intentará proteger estos archivos automáticamente con la prioridad de identidad descrita anteriormente.
El contexto usado para recuperar el DownloadManager
se usará si la identidad del subproceso no se ha conjunto. Si los archivos descargados contienen datos corporativos, es responsabilidad de la aplicación llamar a [protect] si los archivos se mueven o se vuelven a crear después de la descarga.
Single-Identity a la transición de identidad múltiple
Si una aplicación que se publicó anteriormente con la integración de Intune de identidad única más adelante integra varias identidades, will experience a transition (not visible to the user, there is no associated UX). The app is not required to do anything explicit to handle this transition. All files created before the transition will continue being regarded as managed (so they will stay encrypted if encryption policy is on). If desired, you can detect the upgrade and use [MAMFileProtectionManager.protect][protect] las aplicaciones instaladas anteriormente etiquetan archivos o directorios específicos con la identidad vacía (que quitará el cifrado si estaban cifrados).
Escenarios sin conexión
El etiquetado de identidad de archivo es confidencial para el modo sin conexión. Se deben tener en cuenta los siguientes puntos:
Si el Portal de empresa no está instalado, los archivos no se pueden etiquetar con identidad.
Si el Portal de empresa está instalado, pero la aplicación no tiene directiva MAM de Intune, los archivos no se pueden etiquetar de forma confiable con identidad.
Cuando el etiquetado de identidad de archivo está disponible, todos los archivos creados anteriormente se tratan como personales/no administrados (pertenecientes a la identidad de cadena vacía) a menos que la aplicación se haya instalado previamente como una aplicación administrada de identidad única, en cuyo caso se tratan como pertenecientes al usuario inscrito.
Protección de directorios
Los directorios pueden protegerse con el mismo [método protect] usado para proteger archivos. La protección de directorios se aplica de forma recursiva a todos los archivos y subdirectorios incluidos en el directorio y a los nuevos archivos creados en el directorio. Dado que la protección de directorios se aplica de forma recursiva, protect
la llamada puede tardar algún tiempo en completarse para directorios grandes. Por ese motivo, las aplicaciones que aplican protección a un directorio protect
que contiene un gran número de archivos podrían desear ejecutarse asincrónicamente en un subproceso en segundo plano.
Protección de datos
No es posible etiquetar un archivo como perteneciente a varias identidades. Las aplicaciones que deben almacenar datos pertenecientes a diferentes usuarios en el mismo archivo pueden hacerlo manualmente, usando las características proporcionadas por MAMDataProtectionManager. Esto permite a la aplicación cifrar datos y vincularlo a un usuario en particular. Los datos cifrados son adecuados para almacenar en el disco en un archivo. Puede consultar los datos asociados con la identidad y los datos se pueden descifrar más adelante.
Las aplicaciones que usan MAMDataProtectionManager deben implementar un receptor para la MANAGEMENT_REMOVED
notificación. Una vez completada esta notificación, los búferes que se protegieron a través de esta clase ya no podrán leerse si el cifrado de archivos estaba habilitado cuando se protegían los búferes. Una aplicación puede corregir esta situación llamando a MAMDataProtectionManager.unprotect
todos los búferes durante esta notificación. También es seguro llamar a protect durante esta notificación si se desea conservar la información de identidad (se garantiza que el cifrado se deshabilitará durante la notificación).
Proveedores de contenido
Si la aplicación proporciona datos corporativos distintos de un a ParcelFileDescriptor
a ContentProvider
, isProvideContentAllowed(String)
la aplicación debe llamar al método en MAMContentProvider, pasando el UPN de la identidad del propietario (nombre principal del usuario) para el contenido. Si esta función devuelve false, el contenido no debe devolverse al autor de la llamada. Los descriptores de archivo devueltos a través de un proveedor de contenido se controlan automáticamente en función de la identidad del archivo.
Si no hereda explícitamente MAMContentProvider
y, en su lugar, permite que las herramientas de compilación realicen ese cambio, puede llamar a una versión estática del mismo método: MAMContentProvider.isProvideContentAllowed(provider, contentIdentity)
.
Borrado selectivo
Si una aplicación de identidad múltiple se registra para el WIPE_USER_DATA notification, it is the app's responsibility to remove all data for the user being wiped, including all files that have been identity-tagged as belonging to that user. If the app removes user data from a file but wishes to leave other data in the file, it must change the identity of the file (via [MAMFileProtectionManager.protect][protect] a un usuario personal o a la identidad vacía). Si la directiva de cifrado está en uso, los archivos restantes pertenecientes al usuario que se va a borrar no se descifrarán y se volverán inaccesibles para la aplicación después de borrar.
Una aplicación que se registre no WIPE_USER_DATA
recibirá la ventaja del comportamiento de borrado selectivo predeterminado del SDK. En el caso de las aplicaciones compatibles con varias identidades, esta pérdida puede ser más significativa, ya que el borrado selectivo predeterminado de MAM borrará solo los archivos cuya identidad esté dirigida por un borrado. Si una aplicación multi identity aware desea que se realice el borrado selectivo predeterminado __ de MAM y desea realizar sus propias acciones al borrar, debe registrarse para las notificaciones mamnotificationType WIPE_USER_AUXILIARY_DATA. El SDK enviará esta notificación inmediatamente antes de realizar el borrado selectivo predeterminado de MAM. Una aplicación nunca debe registrarse para ambos y WIPE_USER_DATA
WIPE_USER_AUXILIARY_DATA
.
El borrado selectivo predeterminado cerrará la aplicación correctamente, finalizando las actividades y acabando con el proceso de la aplicación. Si la aplicación invalida el borrado selectivo predeterminado, es posible que quieras considerar cerrar la aplicación manualmente para evitar que el usuario tenga acceso a los datos en la memoria después de que se produzca una eliminación.
Habilitar la configuración de destino de MAM para las aplicaciones android (opcional)
Los pares clave-valor específicos de la aplicación pueden configurarse en la consola de Intune para MAM y Android Enterprise. Intune no interpreta en absoluto estos pares clave-valor, pero se pasan a la aplicación. Las aplicaciones que desean recibir dicha configuración pueden usar las clases MAMAppConfigManager y MAMAppConfig para hacerlo. Si varias directivas están dirigidas a la misma aplicación, puede haber varios valores en conflicto disponibles para la misma clave.
Nota
Las configuraciones de configuración para la entrega a través de directivas de configuración de aplicaciones (ACP) offline
no se pueden entregar en (cuando el Portal de empresa no está instalado). Solo las Enterprise AppRestrictions de Android se entregarán a través de una MAMUserNotification
identidad vacía en este caso.
Obtener la configuración de la aplicación para un usuario
La configuración de la aplicación se puede recuperar de la siguiente manera:
MAMAppConfigManager configManager = MAMComponents.get(MAMAppConfigManager.class);
String identity = "user@contoso.com"
MAMAppConfig appConfig = configManager.getAppConfig(identity);
Si no hay ningún usuario registrado por MAM, pero la aplicación aún desea recuperar la configuración de Android Enterprise (que no se dirigirá a un usuario específico), puedes pasar una cadena nula o vacía.
Conflictos
Un valor establecido en la configuración de la aplicación MAM invalidará un valor con la misma clave establecida en android Enterprise configuración.
Si un administrador configura valores en conflicto para la misma clave (por ejemplo, al dirigir distintos conjuntos de configuración de aplicaciones con la misma clave a varios grupos que contienen el mismo usuario), Intune no tiene ninguna forma de resolver este conflicto automáticamente y pondrá todos los valores a disposición de la aplicación.
La aplicación puede solicitar todos los valores de una clave determinada desde un objeto MAMAppConfig :
List<Boolean> getAllBooleansForKey(String key)
List<Long> getAllIntegersForKey(final String key)
List<Double> getAllDoublesForKey(final String key)
List<String> getAllStringsForKey(final String key)
o solicitar que se elija un valor:
Boolean getBooleanForKey(String key, BooleanQueryType queryType)
Long getIntegerForKey(String key, NumberQueryType queryType)
Double getDoubleForKey(String key, NumberQueryType queryType)
String getStringForKey(String key, StringQueryType queryType)
La aplicación también puede solicitar los datos sin procesar como una lista de conjuntos de pares clave-valor.
List<Map<String, String>> getFullData()
Ejemplo completo
MAMAppConfigManager configManager = MAMComponents.get(MAMAppConfigManager.class);
String identity = "user@contoso.com"
MAMAppConfig appConfig = configManager.getAppConfig(identity);
String fooValue = null;
if (appConfig.hasConflict("foo")) {
List<String> values = appConfig.getAllStringsForKey("foo");
fooValue = chooseBestValue(values);
} else {
valueToUse = appConfig.getStringForKey("foo", MAMAppConfig.StringQueryType.Any);
}
Long barValue = appConfig.getIntegerForKey("bar", MAMAppConfig.NumberQueryType.Min);
Notificación
La configuración de la aplicación agrega un nuevo tipo de notificación:
- REFRESH_APP_CONFIG: esta notificación se envía en un MAMUserNotification e informa a la aplicación de que hay disponibles nuevos datos de configuración de la aplicación.
Lectura adicional
Para obtener más información acerca de cómo crear una directiva de configuración de aplicaciones dirigidas a MAM en Android, consulta la sección sobre configuración de aplicaciones dirigidas a MAM en How to use Microsoft Intune app configuration policies for Android.
La configuración de la aplicación también se puede configurar mediante la API Graph aplicación. Para obtener información, consulte el Graph de API de MAM Targeted Config.
Temas personalizados (opcional)
Se puede proporcionar un tema personalizado al SDK de MAM que se aplicará a todas las pantallas y cuadros de diálogo de MAM. Si no se proporciona un tema, se usará un tema MAM predeterminado.
Cómo proporcionar un tema
Para proporcionar un tema, debe agregar la siguiente línea de código en el método Application.onCreate
:
MAMThemeManager.setAppTheme(R.style.AppTheme);
En el ejemplo anterior, debe reemplazar por R.style.AppTheme
el tema de estilo que desea que aplique el SDK.
Personalización de estilos (en desuso)
Ahora está en desuso y los temas personalizados (anteriores) son la forma preferida de personalizar las vistas.
Las vistas generadas por el SDK de MAM se pueden personalizar visualmente para que coincidan más estrechamente con la aplicación en la que está integrada. Puedes personalizar los colores principales, secundarios y de fondo, así como el tamaño del logotipo de la aplicación. Esta personalización de estilo es opcional y los valores predeterminados se usarán si no se configura ningún estilo personalizado.
Cómo personalizar
Para que los cambios de estilo se apliquen a las vistas MAM de Intune, primero debe crear un archivo XML de invalidación de estilo. Este archivo debe colocarse en el directorio "/res/xml" de la aplicación y puedes nombrarlo como quieras. A continuación se muestra un ejemplo del formato que debe seguir este archivo.
<?xml version="1.0" encoding="utf-8"?>
<styleOverrides>
<item
name="foreground_color"
resource="@color/red"/>
<item
name="accent_color"
resource="@color/blue"/>
<item
name="background_color"
resource="@color/green"/>
<item
name="logo_image"
resource="@drawable/app_logo"/>
</styleOverrides>
Debes volver a usar los recursos que ya existen en la aplicación. Por ejemplo, debe definir el color verde en el archivo colors.xml y hacer referencia aquí. No puede usar el código de color Hexadecimal "#0000ff". El tamaño máximo del logotipo de la aplicación es de 110 dip (dp). Puede usar una imagen de logotipo más pequeña, pero si se adhiere al tamaño máximo, se darán los resultados más adecuados. Si superas el límite de inmersión de 110, la imagen se reducirá y posiblemente provocará desenfoque.
A continuación se muestra la lista completa de atributos de estilo permitidos, los elementos de interfaz de usuario que controlan, sus nombres de elementos de atributo XML y el tipo de recurso esperado para cada uno.
Atributo Style | Elementos de interfaz de usuario afectados | Nombre del elemento de atributo | Tipo de recurso esperado |
---|---|---|---|
Color de fondo | Color de fondo de la pantalla pin Color de relleno del cuadro PIN |
background_color | Color |
Color de primer plano | Color de texto en primer plano Borde del cuadro pin en estado predeterminado Caracteres (incluidos caracteres ofuscados) en el cuadro PIN cuando el usuario escribe un PIN |
foreground_color | Color |
Color de énfeño | Borde del cuadro de PIN cuando está resaltado Hyperlinks |
accent_color | Color |
Logotipo de la aplicación | Icono grande que aparece en la pantalla de PIN de la aplicación intune | logo_image | Drawable |
Inscripción predeterminada (opcional)
A continuación se ofrece una guía para requerir la solicitud del usuario al iniciar la aplicación para una inscripción automática del servicio APP-WE (llamamos a esta inscripción predeterminada en esta sección), que requiere que las directivas de protección de aplicaciones de Intune permitan que solo los usuarios protegidos de Intune usen la aplicación LOB de Android integrada en el SDK. También se explica cómo habilitar SSO para la aplicación LOB de Android integrada en sdk. Esto no es compatible con las aplicaciones de la tienda que pueden usar los usuarios que no son de Intune.
Nota
Las ventajas de la inscripción predeterminada incluyen un método simplificado de obtención de directivas del servicio APP-WE para una aplicación en el dispositivo.
Nota
La inscripción predeterminada es consciente de la nube soberana.
Habilite la inscripción predeterminada con los siguientes pasos:
Si la aplicación integra MSAL o necesitas habilitar SSO, configura MSAL siguiendo las configuraciones comunes de MSAL #2. Si no es así, puede omitir este paso.
Habilite la inscripción predeterminada agregando el siguiente valor en el manifiesto bajo la
<application>
etiqueta:<meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />
Habilite la directiva MAM necesaria agregando el siguiente valor en el manifiesto bajo la
<application>
etiqueta:<meta-data android:name="com.microsoft.intune.mam.MAMPolicyRequired" android:value="true" />
Nota
Esto fuerza al usuario a descargar el Portal de empresa en el dispositivo y completar el flujo de inscripción predeterminado antes de usarlo.
Limitaciones
Limitaciones de aplicación de directivas
Uso de solucionadores de contenido: la directiva de Intune "transferir o recibir" puede bloquear o bloquear parcialmente el uso de un solucionador de contenido para obtener acceso al proveedor de contenido en otra aplicación. Esto hará que los
ContentResolver
métodos devuelvan null o lancen un valor de error (por ejemplo,openOutputStream
se lanzaráFileNotFoundException
si se bloquea). La aplicación puede determinar si un error al escribir datos a través de un solucionador de contenido se debe a una directiva (o se debe a una directiva) al realizar la llamada:MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(contentURI);
o si no hay ninguna actividad asociada:
MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
En este segundo caso, las aplicaciones de identidad múltiple deben tener cuidado de establecer la identidad del subproceso correctamente (o pasar una identidad explícita a una
getPolicyForIdentity
llamada).
Servicios exportados
El archivo AndroidManifest.xml incluido en intune App SDK contiene MAMNotificationReceiverService, que debe ser un servicio exportado para permitir que el Portal de empresa envíe notificaciones a una aplicación administrada. El servicio comprueba al autor de la llamada para asegurarse de que solo el Portal de empresa puede enviar notificaciones.
Limitaciones de reflexión
Algunas de las clases base mam (por ejemplo, MAMActivity
, MAMDocumentsProvider
) contienen métodos (basados en las clases base originales de Android) que usan parámetros o tipos devueltos que solo están presentes por encima de ciertos niveles de API. Por este motivo, puede que no siempre sea posible usar la reflexión para enumerar todos los métodos de componentes de la aplicación. Esta restricción no se limita a MAM, es la misma restricción que se aplicaría si la propia aplicación implementase estos métodos desde las clases base de Android.
Robolectric
No se admite la prueba del comportamiento del SDK de MAM en Robolectric. Existen problemas conocidos al ejecutar el SDK de MAM en Robolectric debido a comportamientos presentes en Robolectric que no imitan con precisión los de dispositivos reales o emuladores.
Si necesita probar la aplicación en Robolectric, la solución alternativa recomendada es mover la lógica de la clase de aplicación a una aplicación auxiliar y producir el apk de pruebas unitarias con una clase de aplicación que no hereda de MAMApplication.
Expectativas del consumidor de SDK
El SDK de Intune mantiene el contrato proporcionado por la API de Android, aunque las condiciones de error pueden desencadenarse con más frecuencia como resultado de la aplicación de directivas. Estos procedimientos recomendados de Android reducirán la probabilidad de error:
Las funciones del SDK de Android que pueden devolver null tienen una mayor probabilidad de ser nulas ahora. Para minimizar los problemas, asegúrese de que las comprobaciones nulas se encuentran en los lugares adecuados.
Las características que se pueden comprobar deben comprobarse a través de sus API de reemplazo de MAM.
Cualquier función derivada debe llamar a través de sus versiones de super clase.
Evite el uso de cualquier API de forma ambigua. Por ejemplo, usar sin
Activity.startActivityForResult
comprobar el requestCode provocará un comportamiento extraño.
Servicios
La aplicación de directivas puede afectar a las interacciones del servicio.
Métodos que establecen una conexión de servicio enlazada, como Context.bindService
puede producirse un error debido a la aplicación de directivas subyacente y Service.onBind
pueden dar como resultado ServiceConnection.onNullBinding
o ServiceConnection.onServiceDisconnected
.
La interacción con un servicio enlazado establecido puede producir un debido a SecurityException
la aplicación de directivas en Binder.onTransact
.
Telemetría
Intune App SDK para Android no controla la recopilación de datos de la aplicación. La Portal de empresa registra los datos generados por el sistema de forma predeterminada. Estos datos se envían a Microsoft Intune. Según la directiva de Microsoft, no recopilamos datos personales.
Nota
Si los usuarios finales deciden no enviar estos datos, deben desactivar la telemetría en Configuración en la Portal de empresa aplicación. Para obtener más información, consulta Desactivar la recopilación de datos de uso de Microsoft.
Procedimientos recomendados para Android
Todos los proyectos de biblioteca deben compartir lo mismo
android:package
siempre que sea posible. Esto no producirá errores esporádicamente en tiempo de ejecución; esto es puramente un problema de tiempo de compilación. Las versiones más recientes del SDK de aplicaciones de Intune quitarán parte de la redundancia.Usa las herramientas de compilación del SDK de Android más nuevas.
Quitar todas las bibliotecas innecesarias y no usadas (por ejemplo, android.support.v4)
Pruebas
Consulta la Guía de pruebas.