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 MAMActivityy 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:

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 y release con los sabores {savory, sweet} y {vanilla, chocolate} podrías especificar
    • savory para excluir todas las variantes con el sabor salado o savoryVanillaRelease para excluir solo esa variante exacta.

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 en excludeProjects
  • :product:foo-project se reescribirá com.contoso.SplashActivity , excepto por lo que se omite porque está en excludeClasses
  • 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 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 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 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á en mam-build\product-foo-project
  • bar.jar se reescribirá en mam-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 ( MediaPlayerpor 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 MAMcon 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, , ContentProviderClienty PackageManager ContentResolvermientras que otras clases solo tienen uno o dos métodos ajustados, por ejemplo, DownloadManager, PrintManager, PrintHelper``View, , DragEventy 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 por com.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_DOCUMENTdebe 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 Filearchivo .

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, SHAREPOINTy 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 UNRESTRICTEDse 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:

  1. 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 (o onMAMCreate()) de la subclase Application.

  2. Cuando se crea una cuenta de usuario y el usuario inicia sesión correctamente con MSAL, la aplicación debe llamar a registerAccountForMAM.

  3. 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);
  1. 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.

  2. 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ámetros aadId pasados acquireToken() para que se adquiera el token correcto. Se resourceId debe usar para generar los ámbitos adecuados y aadId 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;
      }
    }
    
  3. 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 usuario acquireToken() 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 de acquireToken(). updateToken() debe usarse en caso de que acquireToken() no pueda adquirir un token.

    Nota

    El SDK llamará periódicamente acquireToken() para obtener el token, por lo que la llamada updateToken() 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);
  1. 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.

  2. 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.
  3. 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 AuthenticationResultarchivo .

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

  1. Nube de Azure US Government
  2. 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 token updateToken() 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_USERsi 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.

  1. Registrar la aplicación con Azure Active Directory. Esto generará un identificador de cliente para la aplicación.
  2. Siga los pasos para [usar MSAL] y Configurar MSAL para usar un agente.
  3. 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:

  1. Si la aplicación no usa su BackupAgentpropia 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>
    
  2. [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.

  3. 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.

  4. 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 etiqueta com.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:

  1. Para usar la copia de seguridad de identidades múltiples con una BackupAgentHelper, sigue la guía de Android de Extending BackupAgentHelper.

  2. 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:

  1. 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.

  2. Que la clase [extienda MAMBackupAgent].

Copia de seguridad de identidad múltiple:

  1. 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.

  2. 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 la BackupDataOutput 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:

  1. Debe usar un bucle while(data.readNextHeader())* para recorrer las entidades de copia de seguridad.

  2. Debe llamar a data.skipEntityData()* si data.getKey()* no coincide con la clave que escribió en onBackup. Sin realizar este paso, es posible que las restauraciones no se realicen correctamente.

  3. 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:

  1. Nivel de subproceso
  2. Context (por lo general Activity) nivel
  3. 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 Activityarchivo . 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:

    1. La aplicación recibe una intención de una identidad administrada que contiene un documento administrado y la aplicación muestra el documento.
    2. 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 de IGNORE_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_INTENTMAM 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 Activityun , 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

  1. 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.

  2. Para los servicios, la identidad del subproceso se establecerá de forma similar durante la duración de una llamada onStart o onBind . Las llamadas a los Binder devueltos onBind también establecerán temporalmente la identidad del subproceso.

  3. 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 CREATEvalores , RESUME_CANCELLEDy NEW_INTENT. El RESUME_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 es RESUME_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 de onMAMCreate. 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 as RESUME_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

MAMIdentityExecutorspermite 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:

  1. 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.

  2. 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" />
    
  3. 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.

  • 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.