适用于 Android 的 Intune App SDK - 应用参与功能

适用于 Android 的 Microsoft Intune App SDK 允许将 Intune 应用保护策略 (也称为 MAM 策略) 合并到本机 Java/Kotlin Android 应用中。 Intune 托管的应用程序与 Intune 应用 SDK 集成。 当 Intune 主动管理应用时,Intune 管理员可以轻松地将应用保护策略部署到 Intune 管理的应用。

注意

本指南分为几个不同的阶段。 首先查看“ 规划集成”。

阶段 7:应用参与功能

阶段目标

  • 了解 Intune 应用 SDK 提供的应用参与功能。
  • 集成与应用和用户相关的应用参与功能。
  • 测试这些功能的集成。

什么是“应用参与功能”?

此 SDK 集成过程尝试最大限度地减少开发人员需要编写的特定于应用的代码量。 通过成功完成 SDK 集成的前几阶段,你的应用现在将强制实施大多数应用保护策略设置,例如文件加密、复制/粘贴限制、屏幕截图阻止和数据传输限制。

但是,某些设置需要特定于应用的代码才能正确强制执行;这些设置称为应用参与功能。 通常,SDK 没有足够的关于应用程序代码或最终用户方案的上下文来自动强制实施这些设置,因此依赖于开发人员适当地调用 SDK API。

应用参与功能不一定是可选的。 根据应用的现有功能,可能需要这些功能。 有关详细信息,请参阅 SDK 集成的关键决策

本指南的前面阶段已经介绍了几个应用参与功能:

本指南的其余部分介绍其余的应用参与功能集:

  • 强制执行策略,限制将文件保存到本地或云存储,或从本地或云存储打开文件。
  • 强制执行限制通知中内容的策略。
  • 强制执行保护备份数据的策略。
  • 如果应用) 自定义屏幕捕获代码,则强制执行限制屏幕捕获 (策略。
  • 支持应用保护 CA。
  • 注册以接收来自 SDK 的通知。
  • 应用自定义应用程序主题。
  • 使用 Intune 中的受信任证书,确保到本地终结点的信任链。

应用参与功能基础知识

AppPolicy 接口包含许多方法,这些方法通知您的应用是否允许某些操作。

大多数应用参与功能涉及:

  • 确定应用代码中的正确位置以检查是否允许操作。
  • 调用方法AppPolicy以根据当前配置的策略检查是否允许操作。
  • 根据结果,允许操作完成,或在操作被阻止时修改应用行为。

若要检索实例, AppPolicy 请使用 MAMPolicyManager 方法之一,如 getPolicy(final Context context) OR getPolicyForIdentityOID(final String oid)

AppPolicy 中的信息方法

并非每个方法都 AppPolicy 与应用参与功能相关联。 有些方法仅供参考,可提供有关当前配置的策略的应用数据,即使这些策略是由 SDK 自动强制执行的。 这些方法的存在是为了让你的应用有机会在配置特定策略时呈现自定义用户体验。

示例:确定屏幕截图是否被阻止

如果应用具有允许用户拍摄屏幕截图的控件,请考虑在应用保护策略阻止屏幕截图时禁用或隐藏该控件。

应用可以通过调用MAMPolicyManager.getPolicy(currentActivity).getIsScreenCaptureAllowed()检查。

限制应用与设备或云存储位置之间的数据传输的策略

许多应用允许最终用户将数据保存到本地文件存储或云存储服务中或从中打开数据。 Intune 应用 SDK 通过限制应用可以保存数据和打开数据的位置,让 IT 管理员防范数据入口和数据泄露。

注意

如果应用允许直接从应用保存到个人或云位置,或者允许直接在应用中打开数据,则必须实现此 Intune 应用 SDK 应用参与功能**,使 IT 管理员能够阻止此保存和打开。

保存到设备或云存储

getIsSaveToLocationAllowedForOID API 根据配置的策略,让应用知道给定身份是否允许保存到某些位置:

MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowedForOID(
SaveLocation service, String oid);

若要确定应用是否应实现getIsSaveToLocationAllowedForOID检查,请查看下表以确定应用是否支持数据出口:

service 参数: SaveLocation 枚举值 用例 关联的 OID
ONEDRIVE 应用正在将数据保存到 OneDrive。 用于云服务身份验证和 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
SHAREPOINT 应用正在将数据保存到 SharePoint。 用于云服务身份验证和 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
BOX 应用正在将数据保存到 Box。 用于云服务身份验证和 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
LOCAL 应用正在将数据保存到设备上的外部存储位置, 而不是 应用的专用存储位置。 此存储位置不被视为云服务,应始终与 OID 参数一起使用 null
PHOTO_LIBRARY 该应用程序正在将数据保存到 Android 本地照片存储中。 本地照片存储不被视为云服务,应始终与 OID 参数一起使用 null
IMANAGE 该应用程序正在将数据保存到 iManage。 用于云服务身份验证和 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
EGNYTE 该应用正在将数据保存到 Egnyte。 用于云服务身份验证和 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
ACCOUNT_DOCUMENT 应用正在将数据保存到与应用内的帐户关联的位置,而不是此表中的特定云位置之一。

使用此位置确定是否可以在多标识应用中的帐户之间传递数据。
用于 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
OTHER 应用正在将数据保存到此表中未指定的位置,并且不符合 的条件 ACCOUNT_DOCUMENT 不会针对此位置进行评估 oid ,并且应为 null

始终允许放置在私人应用程序存储中的 Files,这些文件要么是应用程序操作所必需的,要么是临时下载以显示的;无需检查getIsSaveToLocationAllowedForOID。 请检查SaveLocation.LOCAL是否

  1. 保存在专用应用程序存储之外的 Files。
  2. Files下载到专用应用存储中,而这些存储对于应用操作 (不需要,例如,当用户明确选择下载到设备) 时。

注意

检查保存策略时, oid 应该是与保存到的云服务关联的帐户的 OID, (此帐户不一定与拥有保存) 文档的帐户相同。

从本地或云存储位置打开数据

getIsOpenFromLocationAllowedForOID API 根据配置的策略,让应用知道是否允许给定标识从某些位置打开:

MAMPolicyManager.getPolicy(currentActivity).getIsOpenFromLocationAllowedForOID(
OpenLocation location, String oid);

若要确定应用是否应实现getIsOpenFromLocationAllowedForOID检查,请查看下表以确定应用是否支持数据入口:

location 参数: OpenLocation 枚举值 用例 关联的 OID
ONEDRIVE_FOR_BUSINESS 应用正在从 OneDrive 打开数据。 用于云服务身份验证和 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
SHAREPOINT 应用正在从 SharePoint 打开数据。 用于云服务身份验证和 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
CAMERA 应用正在从设备相机打开数据。 null ,因为设备相机不是云服务。
LOCAL 应用正在从设备上的外部存储位置( 而不是 应用的专用存储)打开数据。 尽管外部存储不是云服务,但参数指示所有权,因此需要一个 oid 参数。

* 对于标识标记的文件:oid 应是文件所有者的标识。
* 对于没有标识标记的文件:oid 应为 null.
PHOTO_LIBRARY 该应用程序正在从 Android 本地照片存储中打开数据。 本地照片存储不被视为云服务,应始终与 OID 参数一起使用 null
ACCOUNT_DOCUMENT 应用程序正在从与应用程序内的帐户关联的位置打开数据,而不是此表中的特定云位置之一。

使用此位置确定是否可以在多标识应用中的帐户之间传递数据。
用于 Microsoft Entra 身份验证的帐户的 OID。 如果此帐户不存在或 OID 未知,请使用 null
OTHER 应用正在从此表中未指定的位置打开数据,并且该位置不符合 的条件 ACCOUNT_DOCUMENT 不会针对此位置进行评估 oid ,并且应为 null

注意

检查打开策略时,oid应该是与要从中打开的文件或云服务关联的帐户的 OID, (不一定与正在打开文档 ) 的帐户相同。

提示

为方便起见,SDK 提供了为本地存储中的文件获取File参数的方法AppPolicy.isOpenFromLocalStorageAllowed。 对于策略强制,此方法在功能上与调用 AppPolicy.getIsOpenFromLocationAllowedForOID(OpenLocation.LOCAL, oid) 相同,只是它处理 oidFile.

共享被阻止的对话框

SDK 提供了一个对话框,用于在 MAM 策略阻止数据传输操作时通知用户。

每当 OR getIsOpenFromLocationAllowedForOID API 调用导致阻止保存/打开操作时getIsSaveToLocationAllowedForOID,应向用户显示该对话框。 该对话框显示一条一般消息,并在被关闭时返回到调用 Activity

若要显示该对话框,请添加以下代码:

MAMUIHelper.showSharingBlockedDialog(currentActivity)

允许文件共享

如果不允许保存到公共存储位置,应用仍应允许用户查看文件,方法是将文件下载到 应用专用存储 ,然后使用系统选择器打开文件。

限制通知中内容的策略

对于单标识应用,当应用保护策略限制通知时,Intune App SDK 的默认行为会尝试阻止所有通知。

SDK 的默认行为受到限制。 SDK 无法自动采用“阻止组织数据”值,该值旨在仅从通知中删除托管内容。 对于多标识应用,SDK 无法确定哪些通知包含托管内容。

如果你的应用显示通知,并且它是多标识的和/或者它需要遵循 “阻止组织数据” 值,则它必须在显示通知之前检查与通知关联的帐户的通知限制策略。

若要确定是否强制执行该策略,请进行以下调用:

NotificationRestriction notificationRestriction =
    MAMPolicyManager.getPolicyForIdentityOID(notificationIdentityOid).getNotificationRestriction();

返回 NotificationRestriction 的枚举具有以下值:

NotificationRestriction 枚举 预期的应用行为
BLOCKED 应用 不得 显示与此策略关联的帐户的任何通知。 对于单标识应用,Intune 应用 SDK 会自动阻止所有通知,并且不需要额外的代码。
BLOCK_ORG_DATA 应用必须显示不包含组织数据的修改通知。
UNRESTRICTED 应用应显示所有通知。

如果应用未正确调用 getNotificationRestriction,MAM SDK 会尽力 仅针对单标识应用自动限制通知。

在这种情况下, BLOCK_ORG_DATA 被视为相同 BLOCKED ,并且根本不显示通知。

如需更精细的控制,请检查getNotificationRestriction值并相应地修改应用通知。

备份数据保护策略

Intune 应用 SDK 可能会阻止将数据上传到 Android 的内置备份和还原功能。 有关 Android 中的备份和还原的更多信息,请参阅 Android API 指南 以及 Android S / 12 中引入的更改 备份 和还原的更改.

应用的自动备份

从 Android M 开始,Android 为应用提供到 Google 云端硬盘的 自动完整备份 ,而不考虑应用的目标 API。

Intune 允许你使用 Android 提供的所有自动备份功能(包括在 XML 中定义自定义规则的功能)以及特定的 Intune 集成指南,以确保应用数据保护。

在应用清单中配置备份行为

默认情况下, android:allowBackup 设置为 true ,如 “启用和禁用备份”中所述。

如果应用不需要完整的备份和还原功能,请设置为 android:allowBackupfalse。 在这种情况下,无需执行进一步操作,公司数据将保留在应用程序中。

如果应用需要完整的备份和还原功能,请设置为 android:allowBackuptrue 并执行以下步骤:

  1. 如果应用未使用其自己的自定义BackupAgent,请使用默认 MAMBackupAgent 启用符合 Intune 策略的自动完整备份。 将以下内容放入应用清单中:

    <application
    ...
      android:fullBackupOnly="true"
      android:backupAgent="com.microsoft.intune.mam.client.app.backup.MAMDefaultBackupAgent"
      ...>
      </application>
    
  2. 可选。 如果实现自定义 BackupAgent,则必须使用 MAMBackupAgentMAMBackupAgentHelper。 请参阅以下章节。 请考虑切换到 Intune 的 MAMDefaultBackupAgent(如步骤 1 中所述),它可在 Android M 及更高版本上提供轻松备份。

  3. 在确定应用应接收哪种类型的完整备份 (未筛选、筛选或无备份时) ,请将属性 android:fullBackupContent 设置为 truefalse或应用中的 XML 资源。

  4. 然后,必须将 的 android:fullBackupContent 值复制到元数据标记中 com.microsoft.intune.mam.FullBackupContent ,对于支持 API 31 中添加的 XML 配置格式的应用,复制到元数据标记中 com.microsoft.intune.mam.DataExtractionRules

    • 示例 1:如果希望应用具有不排除项的完整备份,必须将属性和元数据标记设置为 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" />
      
    • 示例 2:如果希望应用使用其自定义BackupAgent并选择退出符合 Intune 策略的完整自动备份,则必须将属性和元数据标记设置为 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" />
      
    • 示例 3:如果希望根据 XML 文件中定义的自定义规则对应用进行完整备份,请将属性和元数据标记设置为同一 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" />
      

键/值备份

键/值备份选项适用于所有 API 8+,可将应用数据上传到 Android 备份服务。 每个应用的数据量限制为 5 MB。 如果使用键/值备份,则必须使用 BackupAgentHelperBackupAgent

BackupAgentHelper

无论是在本机 Android 功能和 Intune MAM 集成方面,BackupAgentHelper 都比 BackupAgent 更容易实现。 BackupAgentHelper 允许开发人员将整个文件和共享首选项分别注册到 a FileBackupHelperSharedPreferencesBackupHelper () 然后在创建时将其添加到 BackupAgentHelper 中。 请按照以下步骤将 BackupAgentHelper 与 Intune MAM 配合使用:

  1. 若要将多标识备份与 , BackupAgentHelper请按照 Android 指南扩展 BackupAgentHelper

  2. 让班级扩展 MAM 等效的 BackupAgentHelper、FileBackupHelper 和 SharedPreferencesBackupHelper。

Android 类 MAM 等效项
BackupAgentHelper MAMBackupAgentHelper
FileBackupHelper MAMFileBackupHelper
SharedPreferencesBackupHelper MAMSharedPreferencesBackupHelper

遵循这些准则可以成功执行多标识备份和还原。

BackupAgent

BackupAgent 可让您更明确地了解备份的数据。 由于开发人员负责实现,因此需要采取更多步骤来确保 Intune 提供适当的数据保护。 由于大部分工作都由你作为开发人员完成,因此 Intune 集成稍微复杂一些。

集成 MAM:

  1. 请仔细阅读 Android 指南,了解 键/值备份 ,特别是 扩展 BackupAgent, 以确保 BackupAgent 实现遵循 Android 指南。

  2. 让类扩展 MAMBackupAgent

多身份备份:

  1. 在开始备份之前,请检查 IT 管理员是否允许计划备份的文件或数据缓冲区在多标识方案中备份。 在 MAMFileProtectionManagerMAMDataProtectionManager 中使用来isBackupAllowed确定此行为。 如果不允许备份文件或数据缓冲区,则不应将其包含在备份中。

  2. 在备份过程中的某个时刻,如果要备份在步骤 1 中签入的文件的标识,则必须使用计划从中提取数据的文件进行调用 backupMAMFileIdentity(BackupDataOutput data, File … files) 。 此方法会自动创建新的备份实体,并将它们写入 BackupDataOutput for you。 这些实体在还原时自动使用。

多身份还原: 数据备份指南指定了用于恢复应用程序数据的常规算法,并在 扩展 BackupAgent 部分提供了代码示例。 若要成功执行多标识还原,必须遵循此代码示例中提供的常规结构,并特别注意以下几点:

  1. 必须使用 while(data.readNextHeader())* 循环遍历备份实体。

  2. 你必须调用 data.skipEntityData()if data.getKey() 与你写入的 onBackup键不匹配。 如果没有此步骤,还原可能不会成功。

  3. 避免在 * 构造中使用 while(data.readNextHeader())备份实体时返回,因为在这种情况下,我们自动写入的任何实体都将丢失。

自定义屏幕记录限制

如果您的应用包含绕过 Android 级别WindowFLAG_SECURE限制的自定义屏幕捕获功能,则必须先检查屏幕捕获策略,然后才能允许对该功能的完全访问权限。 例如,如果您的应用使用自定义呈现引擎将当前视图呈现为 PNG 文件,则必须先检查 AppPolicy.getIsScreenCaptureAllowed()

注意

如果应用不包含任何自定义或非 Microsoft 屏幕捕获功能,则无需执行任何操作来限制屏幕捕获。 屏幕捕获策略会在所有 MAM 集成应用级别自动强制实施 Window 。 将根据需要阻止 OS 或其他应用在你的应用中捕获 的任何 Window 尝试。 例如,如果用户尝试通过 Android 内置的屏幕截图或屏幕录制功能捕获应用的屏幕,则系统会自动限制捕获,而无需应用参与。

支持应用保护 CA

应用保护 CA (条件访问) (也称为基于应用的 CA)限制对资源的访问。 Intune 应用保护策略必须先管理应用程序,然后才能访问这些资源。 Microsoft Entra ID 强制实施此策略,方法是要求应用在授予令牌访问受条件访问保护的资源之前注册 Intune 应用保护策略并由其管理。

注意

应用保护 CA 支持需要 MSAL) 版本 1.0.0 或更高版本 (Microsoft身份验证库。

处理不符合 MSAL 的行为

当应用获取帐户令牌时,MSAL 库可能会返回或引发 指示 MsalIntuneAppProtectionPolicyRequiredException 不符合应用保护策略管理。 可以从异常中提取更多参数,以用于修正合规性 (请参阅 MAMComplianceManager) 。 修正成功后,应用可以通过 MSAL 再次尝试获取令牌。

MAMComplianceManager

从 MSAL 接收策略所需的错误时,使用 MAMComplianceManager 接口。 它包含 [remediateCompliance] 方法,应调用该方法以尝试将应用置于符合状态。 你可以按如下方式获得对以下内容的 MAMComplianceManager 引用:

MAMComplianceManager mgr = MAMComponents.get(MAMComplianceManager.class);

// make use of mgr

返回nullMAMComplianceManager实例保证不是 。

package com.microsoft.intune.mam.policy;

public interface MAMComplianceManager {
    void remediateCompliance(String upn, String aadId, String tenantId, String authority, boolean showUX);
}

remediateCompliance()方法尝试将应用置于管理之下,以满足 Microsoft Entra ID 授予请求令牌的条件。 可以从 MSAL AuthenticationCallback.onError() 方法接收的异常中提取前四个参数。 最后一个参数是一个布尔值,用于控制用户体验是否在合规性尝试期间出现。

remediateCompliance 显示一个简单的阻止进度对话框,以便应用在此操作期间无需显示自定义体验。 此对话框仅在合规性修正正在进行时出现。 它不显示最终结果。 应用可以注册通知的 COMPLIANCE_STATUS 接收器,以处理合规性修正尝试的成功或失败。 有关更多详细信息,请参阅 合规性状态通知

remediateCompliance() 可能会启动 MAM 注册,作为建立合规性的一部分。 如果应用已注册通知通知接收器,则可能会收到注册通知。 已注册 MAMServiceAuthenticationCallback 应用调用其 acquireToken() 方法来获取注册令牌。 acquireToken() 在应用获取自己的令牌之前调用。 应用程序在成功获取令牌后执行的任何簿记或帐户创建任务可能尚未完成。 在这种情况下,回调必须能够获取令牌。

如果无法从 acquireToken(),则合规性修正尝试将失败。

如果稍后使用请求资源的有效令牌进行调用 updateToken ,则合规性修正将立即使用给定令牌恢复。

注意

静默令牌获取仍然是可能的 acquireToken() ,因为在异常发生之前 MsalIntuneAppProtectionPolicyRequiredException 已经指导用户安装代理并注册设备。 此过程会导致代理在其缓存中具有有效的刷新令牌,这允许代理以无提示方式获取请求的令牌。

下面是一个示例,它在方法中 AuthenticationCallback.onError() 接收策略所需的错误,并调用 MAMComplianceManager 来处理错误。

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);
    }
}

合规性状态通知

如果应用注册了类型 COMPLIANCE_STATUS通知,则系统会发送 , MAMComplianceNotification 以通知应用合规性修正尝试的最终状态。 有关注册的详细信息,请参阅 注册以从 SDK 获取通知

public interface MAMComplianceNotification extends MAMUserNotification {
    MAMCAComplianceStatus getComplianceStatus();
    String getComplianceErrorTitle();
    String getComplianceErrorMessage();
}

getComplianceStatus() 方法将合规性修正尝试的结果作为 [MAMCAComplianceStatus] 枚举中的值返回。

状态代码 解释
UNKNOWN 状态未知。 此状态可能指示意外失败原因。 可在公司门户日志中找到详细信息。
COMPLIANT 合规性修正成功,应用现在符合策略。 应重试 MSAL 令牌获取。
NOT_COMPLIANT 修正合规性尝试失败。 应用不合规,在错误条件更正之前,不应重试 MSAL 令牌获取。 包括 MAMComplianceNotification 额外的错误信息。
SERVICE_FAILURE 尝试从 Intune 服务检索合规性数据时出现故障。 可在公司门户日志中找到详细信息。
NETWORK_FAILURE 连接到 Intune 服务时出错。 当网络连接恢复后,应用应重试其令牌获取。
CLIENT_ERROR 由于与客户端相关的问题(例如用户令牌缺失或不正确),修正合规性的尝试失败。 包括 MAMComplianceNotification 更多错误信息。
PENDING 修正合规性尝试失败,因为服务未在时间限制到期之前发送状态响应。 应用应稍后再次尝试其令牌获取。
COMPANY_PORTAL_REQUIRED 必须在设备上安装公司门户,以便成功进行合规性修正。 如果已安装,则必须重启应用。 对话框提示用户重启应用。

如果合规性状态为 MAMCAComplianceStatus.COMPLIANT,则应用应该为自己的资源) 重新启动其原始令牌获取 (。

如果合规性修正尝试失败, getComplianceErrorTitle()getComplianceErrorMessage() and 方法将返回本地化字符串,应用可以向最终用户显示这些字符串(如果其选择)。 该应用无法解决大多数错误情况。 通常,帐户创建或登录失败,并允许用户稍后重试。

如果故障持续存在,公司门户日志可能有助于确定原因。 最终用户可以提交日志。 有关详细信息,请参阅 上传和电子邮件日志

下面是使用匿名类注册接收器以实现 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);

注意

必须在调用 remediateCompliance() 前注册通知接收器,以避免可能导致错过通知的争用条件。

声明对应用保护 CA 的支持

应用已准备好处理应用 CA 修正后,可以告知 Microsoft 标识你的应用已准备好应用 CA。 若要在 MSAL 应用程序中执行此操作,请使用客户端功能“protapp”构建公共客户端

{
      "client_id" : "[YOUR_CLIENT_ID]",
      "authorization_user_agent" : "DEFAULT",
      "redirect_uri" : "[YOUR_REDIRECT_URI]",
      "multiple_clouds_supported":true,
      "broker_redirect_uri_registered": true,
      "account_mode": "MULTIPLE",
      "client_capabilities": "protapp",
      "authorities" : [
        {
          "type": "AAD",
          "audience": {
            "type": "AzureADandPersonalMicrosoftAccount"
          }
        }
      ]
    }

完成这些步骤后,继续验证应用保护 CA。

实现说明

注意

应用的方法MAMServiceAuthenticationCallback.acquireToken()应将标志的 forceRefreshfalse 传递给 acquireTokenSilentAsync().

AcquireTokenSilentParameters acquireTokenSilentParameters =
        builder.withScopes(Arrays.asList(scopes))
               .forceRefresh(false)
               .build();

acquireTokenSilentAsync(acquireTokenSilentParameters);

注意

如果要在修正尝试期间显示自定义阻止 UX,则应将 showUX 参数的 false 传递给 remediateCompliance()。 必须确保在调用 remediateCompliance()之前先显示 UX 并注册通知侦听器。 这可以防止在快速失败时 remediateCompliance() 错过通知的争用情况。 例如, onCreate() Activity 子类的 or onMAMCreate() 方法是注册通知侦听器然后调用 remediateCompliance()的理想位置。 的 remediateCompliance() 参数可以作为 Intent extras 传递到 UX。 收到合规性状态通知时,您可以显示结果或完成活动。

注意

remediateCompliance() 注册帐户并尝试注册。 获取主令牌后,无需调用 registerAccountForMAM() ,但这样做并没有什么坏处。 另一方面,如果应用无法获取其令牌并希望删除用户帐户,则必须调用 unregisterAccountForMAM() 删除帐户并阻止后台注册重试。

注册以接收来自 SDK 的通知

Intune 应用 SDK 指南讨论了可能需要应用注册来自 SDK 的通知的几种方案,例如:

本部分介绍 SDK 可以发送的每种类型的通知、应用程序何时以及为何想要侦听它,以及如何实现通知接收器。

通知类型

所有 SDK 通知都实现 MAMNotification 接口,该接口具有单个函数, getType()该函数返回 MAMNotificationType 枚举。

大多数通知都是 MAMUserNotification 实例,提供特定于单个标识的信息。 可以通过 getUserOid() 函数检索标识的 OID,可以通过 getUserIdentity()函数检索标识的 UPN。

MAMEnrollmentNotificationMAMComplianceNotification 进一步扩展 MAMUserNotification,分别包含尝试向 MAM 服务注册用户或设备的结果和尝试修正应用保护 CA 合规性的结果。

通知类型 通知类 通知原因 适用性 处理技巧 主题信息
COMPLIANCE_STATUS MAMComplianceNotification 返回合规性修正尝试的结果。 实施应用保护 CA 的应用必须处理此问题。 不确定性
MAM_ENROLLMENT_RESULT MAMEnrollmentNotification 返回注册尝试的结果。 所有应用都会收到此信息。 不确定性
MANAGEMENT_REMOVED MAMUserNotification 应用即将变得不受管理。 使用的 MAMDataProtectionManager 应用必须处理此问题。 请参阅 MANAGEMENT_REMOVED 从不在 UI 线程上
REFRESH_APP_CONFIG MAMUserNotification 应用配置值可能已更改。 实现应用配置和缓存应用配置数据的应用必须处理此项。 应用必须使任何缓存的应用配置数据失效并刷新。 不确定性
REFRESH_POLICY MAMUserNotification 应用保护策略可能已更改。 缓存应用保护策略的应用必须处理此问题。 应用必须使缓存的应用保护策略数据失效并更新。 不确定性
WIPE_USER_DATA MAMUserNotification 即将发生擦除 (*) 。 使用的 MAMDataProtectionManager 应用必须处理此 WIPE_USER_AUXILIARY_DATA 请参阅 选择性擦除 从不在 UI 线程上
WIPE_USER_AUXILIARY_DATA MAMUserNotification 即将发生擦除 (*) 。 只有多标识应用才会收到此信息。
使用的 MAMDataProtectionManager 应用必须处理此 WIPE_USER_DATA
请参阅 选择性擦除 从不在 UI 线程上
WIPE_COMPLETED MAMUserNotification 擦除已完成。 对于所有应用都是可选的。 在或WIPE_USER_AUXILIARY_DATA之后WIPE_USER_DATA交付。
如果应用从其擦除处理程序报告失败,则不会发送此通知。
从不在 UI 线程上

(*) 擦除可能由多种原因引起,例如:

  • 名为 unregisterAccountForMAM 的应用。
  • IT 管理员启动了远程擦除。
  • 不满足管理员要求的条件访问策略。

警告

应用切勿同时注册 和 WIPE_USER_DATAWIPE_USER_AUXILIARY_DATA 通知。

MANAGEMENT_REMOVED

MANAGEMENT_REMOVED 通知通知应用以前由策略管理的帐户即将变得不受管理。 帐户处于非托管状态后,应用将无法再读取该帐户的加密文件、读取用于 MAMDataProtectionManager加密的帐户数据、与加密剪贴板交互,或以其他方式参与托管应用生态系统。

这不需要擦除用户数据或注销用户 (如果需要擦除,则会) 发送通知 WIPE_USER_DATA 。 许多应用可能不需要处理此通知,但使用的 MAMDataProtectionManager 应用必须处理此通知。 有关详细信息,请参阅 数据缓冲区保护

当 SDK 调用应用的 MANAGEMENT_REMOVED 接收器时,情况如下:

  • SDK 已解密以前加密的文件 (但未解密属于应用的受保护数据缓冲区) 。 SD 卡上不直接属于应用的公共位置中的Files (例如,) 不会解密“文档”或“下载”文件夹。

  • 接收器方法 (创建的任何新文件或受保护的数据缓冲区,或者接收器启动后运行) 任何其他代码均未加密。

  • 应用仍有权访问加密密钥,因此解密数据缓冲区等操作成功。

应用的接收器返回后,它将不再有权访问加密密钥。

实现 MAMNotificationReceiver

若要注册来自 SDK 的通知,应用必须创建 MAMNotificationReceiver ,并将其注册到 MAMNotificationReceiverRegistry

要注册接收器,请使用您的接收器和方法中Application.onCreate所需的通知类型进行调用registerReceiver

@Override
public void onCreate() {
  super.onCreate();
  MAMComponents.get(MAMNotificationReceiverRegistry.class)
    .registerReceiver(
      new ToastNotificationReceiver(),
      MAMNotificationType.WIPE_USER_DATA);
}

应用的 MAMNotificationReceiver 实现必须包含该 onReceive(MAMNotification notification) 方法。 此方法为收到的每个通知单独调用,并且必须返回一个 boolean. 通常,此方法应始终返回 true,除非应用程序在响应通知时遇到故障。

与其他类型的 Android 接收器一样,你的应用程序可以灵活地处理通知:

  • 它可以为不同的通知类型创建不同的 MAMNotificationReceiver 实现。 在这种情况下,请确保分别注册每个实现和每个通知类型。
  • 它可以使用单个 MAMNotificationReceiver 实现,其中包含用于响应多个不同通知类型的逻辑。 在这种情况下,必须为它可以响应的每种类型的通知注册它。
  • 它可以创建多个 MAMNotificationReceiver 实现,每个实现都响应相同的通知类型。 在这种情况下,两者都必须注册到相同的通知类型。

提示

阻止 MAMNotificationReceiver.onReceive 是安全的,因为它的回调不在 UI 线程上运行。

自定义主题

可向 Intune 应用 SDK 提供自定义主题;此自定义主题适用于所有 SDK 屏幕和对话框。 如果未提供主题,则使用默认 SDK 主题。

提供自定义主题

若要提供主题,请在方法中 Application.onMAMCreate 添加以下代码行:

MAMThemeManager.setAppTheme(R.style.AppTheme);

在示例中,替换 R.style.AppTheme 为 SDK 应应用的样式主题。

受信任的根证书管理

如果应用程序需要本地或专用证书颁发机构颁发的 SSL/TLS 证书来提供对内部网站和应用程序的安全访问,则 Intune 应用 SDK 已添加了对使用 API 类 MAMTrustedRootCertsManagerMAMCertTrustWebViewClient 进行证书信任管理的支持。

注意

MAMCertTrustWebViewClient 支持 Android 10 或更高版本。

受信任的根证书管理支持:

  • SSLContext
  • SSLSocketFactory
  • TrustManager
  • Web 视图

要求

注意

受信任的根证书管理可以独立于 Microsoft Tunnel VPN 网关使用,但必须许可 Microsoft MAM Tunnel 才能使用。

使用 Intune 中的受信任根证书建立信任定位点

受信任的根证书管理允许应用将 Intune 中的受信任根证书与设备的证书结合使用。

如果设备的受信任根证书存储不包含与本地资源建立安全连接所需的受信任根证书,则 API 类 MAMTrustedRootCertsManagerMAMCertTrustWebViewClient 使用通过应用程序配置策略传递的 Intune 受信任根证书作为回退选项。 这样,应用就可以同时使用设备和 Intune 证书来验证与受信任源的安全连接和通信。

为了增强其网络安全设置,应用可以使用网络安全配置 XML 文件。 受信任的根证书管理通过验证应用的网络安全配置 XML 是否具有以下任何功能来尊重这种额外的安全性:

  • 具有额外 CA(如自签名证书)的自定义信任密钥。
  • 用于限制受信任 CA 的特定于域的规则。
  • 特定域的证书的 PIN 集。

注意

有关 Android 网络安全配置的详细信息,请参阅 网络安全配置

如果其中任何一项适用于正在检查信任的域,则受信任的根证书管理将跳过对此域的自定义信任检查,只让平台的默认信任管理器执行检查。

类 MAMTrustedRootCertsManager

此类提供以下 API:

  • createSSLContextForOID(String oid, String protocol):创建一个 SSLContext 对象,该对象对指定标识和指定的 SSL/TLS 协议使用受信任的根证书。 从此类返回 SSLContext 的对象已使用使用来自设备和 MAM 服务的组合的受信任根证书的对象正确 X509TrustManager 初始化。
  • createSSLSocketFactoryForOID(String oid, String protocol):创建一个 SSLSocketFactory 对象,该对象对指定标识和指定的 SSL/TLS 协议使用受信任的根证书。 返回 SSLSocketFactory 的对象是从此类中的同一 SSLContext 对象引用的。
  • createX509TrustManagersForOID(String oid):创建一个对象数 X509TrustManager 组,这些对象使用来自设备和指定标识的 MAM 服务的受信任根证书的组合。

注意

参数oid应为运行应用程序的特定用户的Microsoft Entra用户 ID (OID) 。 如果事先未知用户标识符,则可以传递值 null 和 MAM 尝试从调用这些 API 的线程或进程中发现正确的标识。 必须在进程或线程上正确设置标识,以便 MAM 发现标识。 有关在进程或线程上设置活动标识的详细信息,请参阅 阶段 5:多重标识

注意

如果未提供参数 protocol ,平台将使用支持的最高 SSL/TLS 协议。

下面是使用此类的一些示例。

使用 HttpsUrlConnection 的示例
// Create an SSL socket factory using supplying the optional parameters identity and protocol
SSLSocketFactory sslSocketFactory = MAMTrustedRootCertsManager.createSSLSocketFactoryForOID(oid, "TLSv1.3");

// Create a URL object for the desired endpoint
URL url = new URL("https://example.com");

// Open a connection using the URL object
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();

// Set the SSL socket factory for the connection
httpsURLConnection.setSSLSocketFactory(sslSocketFactory);

// Perform any other configuration or operations on the connection as needed
...
使用 OkHttpClient 的示例
// Get the TrustManager instances for an identity from the SDK
TrustManager[] trustManagers = MAMTrustedRootCertsManager.createX509TrustManagersForOID(oid);

// Get SSLContext from the platform
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");

// Initialize the SSLContext with the trust managers from the Intune App SDK
sslContext.init(null, trustManagers, null);

// Create an OkHttpClient.Builder object
OkHttpClient.Builder builder = new OkHttpClient.Builder();

// Set the SSLSocketFactory and the trust managers from the SDK
builder.sslSocketFactory(sslContext.socketFactory, trustManagers[0] as X509TrustManager).build();

// Build an OkHttpClient object from the builder
OkHttpClient okHttpClient = builder.build();

// Create a Request object for the desired endpoint
Request request = new Request.Builder().url("https://example.com").build();

// Execute the request using the OkHttpClient object and get a Response object
Response response = okHttpClient.newCall(request).execute();

// Perform any other operations on the response as needed
...

类 MAMCertTrustWebViewClient

此类提供 Android 类 android.webkit.WebViewClient的自定义实现。 此类提供了一种处理 SSL 错误android.net.http.SslError.SSL_UNTRUSTEDWebView的方法。

处理错误时,此类使用 Intune 配置和 MAM 服务提供的受信任根证书。 此方法从在 中 WebView生成 SSL 错误的目标 URL 检查主机的可信度。 如果自定义实现不处理 SSL 错误,系统将调用从超类继承的默认行为。

使用此类时,请创建它的实例,然后调用 WebView.setWebViewClient(WebViewClient) 以向实例注册 WebView 它。

下面是使用此类的示例。

使用 WebView 的示例
// Get the MAM implementation of WebViewClient from the Intune App SDK
MAMCertTrustWebViewClient mamCertTrustWebViewClient = new MAMCertTrustWebViewClient();

// Set the MAM WebViewClient from the SDK as the current handler on the instance of WebView
webView.setWebViewClient(mamCertTrustWebViewClient);

// Perform any other operations on WebView
...

中国 App Store 隐私合规

某些中国应用商店要求应用程序在执行与设备上的其他应用交互的操作之前向用户显示隐私同意对话框。 这包括注册侦听包安装/卸载事件的广播接收器。 MAM SDK 执行此操作是为了侦听多数 MAM 逻辑所在公司门户的状态。

如果应用通过有此要求的中国应用商店分发,请使用以下集成将脱机启动操作延迟到获得隐私同意之后。

1. 添加清单标志

将以下元数据添加到应用的:AndroidManifest.xml

<application>
    <meta-data
        android:name="com.microsoft.intune.mam.OfflineStartupDeferredUntilAppSignal"
        android:value="true"/>
</application>

注意

此标记应仅添加到通过中国应用商店分发的 APK,这些 APK 在与其他应用交互之前需要获得隐私同意。 对于通过其他商店分发的 APK,不应包含此标志。

2. 隐私对话框后就绪信号

在用户接受你的隐私同意对话框后,调用 SDK 以指示可以继续进行脱机启动操作:

// After user accepts privacy dialog
MAMComponents.get(DeferredStartupManager::class.java)
    .setOfflineStartupReady()

或在 Java 中:

// After user accepts privacy dialog
MAMComponents.get(DeferredStartupManager.class)
    .setOfflineStartupReady();

行为

就绪状态在应用启动后一直保留。 调用后 setOfflineStartupReady() ,后续启动将在应用初始化期间立即注册接收器。

注释

  • setOfflineStartupReady() 方法是幂等的;多次调用它是安全的。
  • 如果公司门户已安装 (联机模式) ,则呼叫setOfflineStartupReady()无效,因为不需要接收器。
  • 重要提示:您应始终在接受隐私对话后致电 setOfflineStartupReady()

退出条件

有关详细信息,请参阅 使用更改策略进行快速测试 ,以便于测试。

验证保存到和从约束中打开

如果未实现限制 应用与设备或云存储位置之间的数据传输的策略,请跳过此部分。

重新熟悉应用可将数据保存到云服务或本地数据,并从云服务或本地数据打开数据的每个方案。

为简单起见,这些测试假定你的应用仅支持从应用内的单个位置保存到 OneDrive 并从 OneDrive 中打开数据。 但是,必须验证每个组合:针对应用允许保存数据的每个位置的每个受支持的保存位置,以及针对应用允许打开数据的每个位置的每个受支持的打开位置。

对于这些测试,请安装应用和 Intune 公司门户;在开始测试之前使用托管帐户登录。 此外:

  • 将托管帐户的策略设置为:
    • 将“将组织数据发送到其他应用”设置为“策略管理的应用”。
    • 将“从其他应用接收数据”设置为“策略管理的应用”。
应用场景 先决条件 步骤
保存到,完全允许 “保存组织数据的副本”策略设置为 “允许” - 导航到应用中可将数据保存到 OneDrive 的部分。
- 尝试使用登录到应用的同一托管帐户将文档保存到 OneDrive。
- 确认允许保存。
保存到,豁免 - “保存组织数据的副本”策略设置为 “阻止”
- “允许用户将副本保存到所选服务”策略设置为“仅 OneDrive
- 导航到应用中可将数据保存到 OneDrive 的部分。
- 尝试使用登录到应用的同一托管帐户将文档保存到 OneDrive。
- 确认允许保存。
- 如果您的应用允许,请尝试将文件保存到其他云存储位置并确认它已被阻止。
保存到,已阻止 “保存组织数据的副本”策略设置为 “阻止” - 导航到应用中可将数据保存到 OneDrive 的部分。
- 尝试使用登录到应用的同一托管帐户将文档保存到 OneDrive。
- 确认保存被阻止。
- 如果您的应用允许,请尝试将文件保存到其他云存储位置并确认它已被阻止。
打开自,完全允许 “将数据打开组织文档”策略设置为 “允许” - 导航到应用中可以从 OneDrive 打开数据的部分。
- 尝试使用登录到应用存储的同一托管帐户从 OneDrive 打开文档。
- 确认允许打开。
开放自,豁免 - “将数据打开到组织文档中”策略设置为 阻止
- “允许用户从所选服务打开数据”策略设置为仅 OneDrive
- 导航到应用中可以从 OneDrive 打开数据的部分。
- 尝试使用登录到应用存储的同一托管帐户从 OneDrive 打开文档。
- 确认允许打开。
- 如果您的应用程序允许,请尝试从其他云存储位置打开另一个文件并确认该文件已被阻止。
发起人、阻止 “将数据打开到组织文档”策略设置为 “阻止” - 导航到应用中可以从 OneDrive 打开数据的部分。
- 尝试使用登录到应用存储的同一托管帐户从 OneDrive 打开文档。
- 确认打开被阻止。
- 如果您的应用程序允许,请尝试从其他云存储位置打开另一个文件并确认该文件已被阻止。

验证通知限制

如果未实施限制 通知中内容的策略,请跳过此部分。

就应用保护策略而言,应用程序可能会触发三种不同类型的通知:

  1. 不包含任何帐户数据的通知。
  2. 包含属于托管帐户的数据的通知。
  3. 包含属于非托管帐户的数据的通知。

如果应用程序是单一标识,则只有前两个标识相关,因为如果唯一帐户不受管理,则不会应用任何保护。

可以通过触发配置了不同策略值的所有三种类型的通知来验证通知限制。

对于这些测试,请安装应用和 Intune 公司门户;在开始测试之前使用托管帐户登录。 如果你的应用是多标识的,也请使用非托管帐户登录你的应用。

应用场景 先决条件 步骤
已阻止完整内容 “组织数据通知”策略设置为 “阻止” - 触发应用以触发不包含帐户数据的通知。
- 确认通知未显示任何内容。
- 触发应用以使用托管帐号的数据发送通知。
- 确认通知未显示任何内容。
- 触发应用以使用非托管帐户的数据触发通知。
- 确认通知未显示任何内容。
阻止了部分内容 “组织数据通知”策略设置为“阻止组织数据 - 触发应用以触发不包含帐户数据的通知。
- 确认通知显示其完整内容。
- 触发应用以使用托管帐号的数据发送通知。
- 确认通知会修改受管理帐号的内容。
- 触发应用以使用非托管帐户的数据触发通知。
- 确认通知显示其完整内容。
未阻止任何内容 将“组织数据通知”策略设置为 “允许” - 触发应用以触发不包含帐户数据的通知。
- 确认通知显示其完整内容。
- 触发应用以使用托管帐号的数据发送通知。
- 确认通知显示其完整内容。
- 触发应用以使用非托管帐户的数据触发通知。
- 确认通知显示其完整内容。

验证数据备份和还原

如果未实施用于 保护备份数据的策略,请跳过此部分。

重新熟悉应用为备份配置的内容 (文件和键值对) 。 应验证只有预期的内容才是还原的一部分。 还原过程中的额外内容可能会导致数据泄露。

对于这些测试,请安装应用和 Intune 公司门户;在开始测试之前使用托管帐户登录。 如果你的应用是多标识的,也请使用非托管帐户登录到你的应用。

按照 Android 的官方说明测试备份。 这些说明对于自动备份和键/值备份有所不同,因此请严格按照它们操作。

根据策略验证自定义屏幕捕获

如果未实现自定义屏幕记录限制,请跳过此部分。

如果应用程序具有绕过 Android 级别FLAG_SECURE的功能Window,请验证此功能是否被应用保护策略屏幕捕获限制阻止。

对于这些测试,请安装应用和 Intune 公司门户;在开始测试之前使用托管帐户登录。

应用场景 先决条件 步骤
已阻止屏幕捕获 “屏幕捕获和 Google 助理”策略设置为 阻止 - 导航到应用中使用自定义 FLAG_SECURE 代码的部分。
- 尝试使用该功能。
- 确认该功能已被阻止。
允许屏幕捕获 将“屏幕捕获和 Google 助理”策略设置为 “允许” - 导航到应用中使用自定义 FLAG_SECURE 代码的部分。
- 尝试使用该功能。
- 确认允许该功能。

验证应用保护 CA

如果未实现 支持应用保护 CA,请跳过此部分。

除了创建应用保护策略并将其分配给应用和测试帐户的典型验证步骤外,还必须创建应用保护条件访问策略并将其分配给测试帐户。 有关详细信息,请参阅使用 Intune 设置基于应用的条件访问策略

测试步骤:

  1. 在开始此测试之前,请卸载 Microsoft Authenticator 和 Intune 公司门户。
  2. 安装应用。
  3. 使用同时针对应用保护策略和基于应用的 CA 策略的测试帐户登录到应用。
  4. 确认应用会提示你安装公司门户。
  5. 再次登录。
  6. 确认应用会提示你注册设备。 按照提示进行操作。 如果应用未在此处提示注册,请首先确认测试设备已卸载其他支持 SDK 的应用、公司门户和 Authenticator。 如果仍未提示,请重新访问实施说明。
  7. 确认注册后可以访问所有应用数据。

验证通知接收器

如果未实现注册以 从 SDK 接收通知,请跳过此部分。

验证步骤取决于应用注册的通知类型。 对于所有类型的通知,请添加日志记录以确保正确调用接收器。

MAM_ENROLLMENT_RESULT 可以通过使用应用保护策略面向的帐户登录到应用程序来触发。

可以通过更新面向测试帐户的相应应用程序配置策略和应用保护策略并等待 SDK 接收更新的策略来触发REFRESH_APP_CONFIGREFRESH_POLICY

提示

请参阅 使用更改策略进行快速测试 以加快此过程。

可以通过从 Microsoft Intune 发出选择性擦除来触发 MANAGEMENT_REMOVEDWIPE_USER_DATAWIPE_USER_AUXILIARY_DATAWIPE_COMPLETED通知。

验证自定义主题

如果未实现自定义主题,请跳过此 部分

可以通过检查 SDK 对话框上的颜色来验证自定义主题支持。 要检查的最简单的对话框是 MAM PIN 屏幕。

先决条件:

  • 将托管帐户的策略设置为:
    • “用于访问的 PIN”设置为“必需”。
  • 安装应用和 Intune 公司门户。

测试步骤:

  1. 启动应用程序并使用测试帐户登录。
  2. 确认显示 MAM PIN 屏幕,该屏幕基于提供给 SDK 的自定义主题进行主题设置。

后续步骤

如果按顺序操作本指南并完成了本文前面的所有退出条件,则应用现在已与 Intune 应用 SDK 完全集成,可以强制实施应用保护策略。 如果你跳过了前面的任一应用参与部分(第 5 阶段:多重身份第 6 阶段:应用程序配置),并且不确定你的应用是否应支持这些功能,请重新访问 SDK 集成的关键决策

应用保护现在是应用的核心方案。 继续开发应用时,请继续参考本指南和 附录