适用于 Android 的 Intune App SDK - MAM 集成基础知识

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

注意

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

阶段 4:MAM Integration Essentials

阶段Goals

  • 启用 MAM 严格模式。
  • 从 SDK 注册关键通知。
  • 实现并注册身份验证回调,以提供从 MSAL 到 SDK 的Microsoft Entra令牌。
  • 使用 MSAL 进行身份验证后,为 MAM 管理注册新帐户。
  • 注销时注销帐户以删除公司数据。
  • (建议) 将 MAM 登录合并到应用中。
  • (推荐) 了解如何使用 SDK 诊断对话框。

背景

现在,你已下载 Intune App SDK 并将其集成到生成中,并成功执行类和方法替换,接下来可以进行基本代码更改,开始对受 MAM 保护的帐户强制实施应用保护策略设置。

此阶段将指导你如何挂接到 SDK 的日志记录、调用诊断对话框、启用 MAM 严格模式以识别可能的集成 bug、从 SDK 注册通知,最重要的是,如何为 Intune MAM 注册帐户以开始接收策略。

MAM 严格模式

MAM 严格模式可以识别应用程序 Intune 应用 SDK 集成中的潜在 bug。 这些集成 bug 可能会导致无法正确应用应用保护策略,并使公司数据不受保护。 因此, 需要使用 MAM 严格模式。

MAM 严格模式查找应用程序使用 MAM API 和 MAM 限制的平台 API 的异常情况。 MAM 严格模式在 Android 的 StrictMode 之后以松散模式模式运行一组预定义的检查,这些检查在失败时引发运行时错误。 MAM 严格模式不应在生产版本中保持启用状态;相反,请在应用的内部开发、调试和/或 dogfood 版本中使用它。

若要启用 MAM 严格模式,请调用

MAMStrictMode.enable();

应用程序初始化的早期 (例如, Application.onCreate) 。

当 MAM 严格模式检查失败时,请尝试确定它是可以在应用中修复的真正问题还是误报。 如果你认为这是误报或不确定,请让 Intune MAM 团队知道。 这将使我们能够确保我们同意误报决定,并尝试改进对未来版本的检测。 若要抑制误报,请按照以下说明禁用失败检查。

处理冲突

当检查失败时,它将运行 MAMStrictViolationHandler。 默认处理程序会 Error引发 ,预计该操作会导致应用崩溃。 这是为了使故障尽可能干扰,并符合不应在生产生成中启用严格模式的意图。

如果你的应用希望以不同的方式处理冲突,它可以通过调用以下方法提供自己的处理程序:

MAMStrictMode.global().setHandler(handler);

其中 handler 实现 MAMStrictViolationHandler

禁止检查

如果检查在应用未执行任何错误操作的情况下失败,请报告它,如上文所述。 在此期间,可能需要禁用遇到误报检查,至少在等待更新的 SDK 时是这样。 失败的检查将显示在默认处理程序引发的错误中,或者将传递给自定义处理程序(如果已设置)。

尽管抑制可以全局执行,但最好在特定调用站点暂时禁用每个线程。 以下示例演示了在尝试保护 ) 不存在的文件时禁用MAMStrictCheck.IDENTITY_NO_SUCH_FILE (引发MAMStrictCheck.IDENTITY_NO_SUCH_FILE的各种方法。

Per-Thread 临时抑制

这是首选的抑制机制。

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 永久抑制

MAMStrictMode.thread().disable(MAMStrictCheck.IDENTITY_NO_SUCH_FILE);

全局 (进程范围的) 抑制

MAMStrictMode.global().disable(MAMStrictCheck.IDENTITY_NO_SUCH_FILE);

从 SDK 注册通知

Intune App SDK 发出许多不同类型的通知,以通知应用程序对时间敏感的管理操作。 应用程序可以注册这些通知,并在收到这些通知时执行操作。

例如,每当 IT 管理员为设备发出选择性擦除命令时,Intune 服务就会向 SDK 发送通知,该通知作为 WIPE_USER_DATA一起传递到应用程序。 应用程序可以侦听此通知并控制擦除的数据;或者,它可以依赖于 SDK 的默认擦除行为。

许多通知都是可选的。 根据应用程序使用的 SDK 功能,可能需要一些通知。 有关如何注册通知、SDK 传递哪些通知以及如何处理特定通知类型的详细信息,请参阅第 7 阶段:应用参与功能中的从 SDK 注册通知。

注册应用保护策略

管理员创建应用保护策略时,会将这些策略定向到其组织中的特定帐户。 在客户端上,SDK 需要知道哪个帐户正在使用应用程序,以便可以检索该帐户的策略并相应地强制实施设置。 应用负责向 SDK 提供此帐户信息。 此过程称为注册。

每当应用添加新帐户时,它都必须向 SDK 注册该帐户,即使其他帐户已注册也是如此。 你的应用可以注册多个帐户。 但是,目前只能注册一个帐户,或者应用应用保护策略。 在 Android 上,这种单托管帐户限制是设备范围的。

注册与注册

注册 是应用通知 SDK 正在使用新帐户的过程。 SDK 包含应用为注册和注销帐户而必须调用的函数。

注册 是 SDK 使用 Intune 服务记录已注册帐户以便应用帐户策略的过程。 应用无需调用任何函数进行注册。 注册帐户后,SDK 完全处理注册。

如果已为应用程序注册了一个帐户,则当它注册另一个帐户时,即使该帐户是应用保护策略的目标,也不会注册第二个帐户,也不会应用策略。

注意

术语“注册”还可以指设备范围的 MDM 注册 在 MDM 和 MAM 注册的附录中了解详细信息。

实现注册

警告

如果你的应用未集成 MSAL (强烈建议) ,请参阅附录中的默认注册,而不是继续本部分。

你的应用必须进行三个代码更改才能成功注册帐户:

  1. 应用 必须 实现并注册 MAMServiceAuthenticationCallback 接口的实例。 回调实例必须在 Application 子类的 onCreate() (或 onMAMCreate()) 方法中注册。

  2. 创建帐户并且用户使用 MSAL 成功登录时,应用 必须 调用 registerAccountForMAM

  3. 删除帐户后,应用应调用 unregisterAccountForMAM ,以从 Intune 管理中删除该帐户。

    警告

    调用可能会启动擦除,以完全删除帐户的公司数据。

可以在 MAMEnrollmentManager 接口中找到所有必要的身份验证和注册 API。 可以按如下所示获取对 MAMEnrollmentManager 的引用:

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

// make use of mgr

返回 MAMEnrollmentManager 的实例保证不为 null。 API 方法分为两类: 身份验证帐户注册

MAMEnrollmentManager 和身份验证

SDK 经常与 Intune 服务通信:用于注册已注册的帐户、获取应用保护策略设置的更新以及获取挂起的管理员操作,例如选择性地擦除应用中受保护的数据。 若要成功与 Intune 服务通信,SDK 需要来自集成 MSAL 的应用的全新访问令牌。

如果 SDK 无法检索新令牌,它将无法与 Intune 服务通信,这可能会延迟新策略设置或管理操作的检索和执行。 应用必须完成这些步骤,以确保无缝实施策略。

在阶段 2 中,你已将 MSAL 集成到应用程序中,以便进行身份验证和获取访问令牌。 在这里,你将实现身份验证回调,以允许 SDK 请求必要的令牌。

MAMEnrollmentManager 具有以下身份验证方法:

interface MAMServiceAuthenticationCallback {
    String acquireToken(String upn, String aadId, String resourceId);
}
interface MAMServiceAuthenticationCallbackExtended extends MAMServiceAuthenticationCallback {
    String acquireToken(String upn, String aadId, String tenantId, String authority, String resourceId);
}
void registerAuthenticationCallback(MAMServiceAuthenticationCallback callback);
void updateToken(String upn, String aadId, String resourceId, String token);
  1. 应用必须实现 MAMServiceAuthenticationCallback 接口或 接口,MAMServiceAuthenticationCallbackExtended以允许 SDK 请求给定帐户和资源 ID 的Microsoft Entra令牌。 回调实例必须通过调用其 registerAuthenticationCallback 方法提供给 MAMEnrollmentManager 。 在注册重试或应用保护策略刷新检查的应用生命周期早期可能需要令牌,因此必须在应用的Application子类的 (或 onMAMCreate()) 方法中onCreate()注册回调。

  2. 方法 acquireToken 应获取给定帐户的请求资源 ID 的访问令牌。 如果无法获取请求的令牌,则应返回 null。

    提示

    确保应用利用resourceId传递给 acquireToken() 的 和 aadId 参数,以便获取正确的令牌。 resourceId应使用 生成正确的范围,而 aadId 应使用 传递正确的帐户。 如果应用需要 Microsoft Entra 颁发机构才能正确获取令牌,请实现 MAMServiceAuthenticationCallbackExtended 接口。

    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. 如果应用在 SDK 调用 acquireToken() 时无法提供令牌(例如,如果无提示身份验证失败且显示 UI 不方便),则应用可以通过调用 updateToken 方法在以后提供令牌。 上一次调用 acquireToken() 请求的同一 UPN、Microsoft Entra ID 和资源 ID 必须与最终获取的令牌一起传递到 updateToken()。 应用应在从提供的回调返回 null 后尽快调用此方法。

    警告

    不要从 的实现acquireToken()中调用 updateToken()updateToken() 在无法获取令牌的情况下 acquireToken() ,应使用 。

    注意

    SDK 将定期调用 acquireToken() 以获取令牌,因此不严格要求调用 updateToken() 。 但是,强烈建议这样做,因为它可以帮助注册和应用保护策略检查及时完成。

身份验证实现说明

  • 建议应用在调用 registerAccountForMAM之前获取Microsoft Entra令牌。 注册帐户后,应用将在其他线程上收到对已注册 MAMServiceAuthenticationCallbackacquireToken() 方法的回调。 在回调中提供有效的令牌允许继续注册。 应用将通过通知获取注册结果。

  • 如果应用未返回有效的Microsoft Entra令牌,则注册尝试AUTHORIZATION_NEEDED的最终结果是 。 如果应用通过通知收到此结果,则强烈建议通过获取以前从 acquireToken 请求的帐户和资源的令牌并调用 updateToken 方法以再次启动注册过程来加快注册过程。

  • 还将调用已注册的应用MAMServiceAuthenticationCallback来获取令牌,以便定期刷新应用保护策略检查。如果应用在请求时无法提供令牌,则不会收到通知,但应尝试在下一个方便的时间获取令牌并调用 updateToken() ,以加快检查过程。 如果未提供令牌,则仍可能在下次尝试检查时调用回调。

  • 对主权云的支持需要提供授权。

  • 如果 MAMServiceAuthenticationCallbackExtended 实现了接口, acquireToken() 则不需要实现继承的 方法 MAMServiceAuthenticationCallback ,因为 MAMServiceAuthenticationCallbackExtended 接口提供默认实现。

MAMEnrollmentManager 和注册

每当应用添加帐户时,它都必须向 SDK 注册该帐户。 同样,每当应用删除帐户时,它都应注销该帐户,以指示该应用不应再为该帐户应用策略。 如果帐户已在 MAM 服务中注册,则会取消注册该帐户,并且应用将被擦除。

MAMEnrollmentManager 具有以下帐户注册方法:

void registerAccountForMAM(String upn, String aadId, String tenantId);
void registerAccountForMAM(String upn, String aadId, String tenantId, String authority);
void unregisterAccountForMAM(String upn, String aadId);
Result getRegisteredAccountStatus(String upn, String aadId);
  1. 若要注册帐户进行管理,应用应调用 registerAccountForMAM()。 帐户由其 UPN 和Microsoft Entra用户 ID 标识。 还需要租户 ID 才能将注册数据与帐户的Microsoft Entra租户相关联。 还可以提供帐户的授权,以允许针对特定主权云进行注册:有关详细信息,请参阅 主权云注册。 SDK 可能会尝试在 MAM 服务中为给定帐户注册应用;如果注册失败,它将定期重试注册,直到注册成功或帐户未注册。 重试期通常为 12-24 小时。 SDK 通过通知异步提供注册尝试的状态。

  2. 调用的最佳时间 registerAccountForMAM 是在用户登录到应用并使用 MSAL 成功进行身份验证之后。 帐户Microsoft Entra用户 ID 和租户 ID 作为 相关 IAuthenticationResultIAccount一部分从 MSAL 身份验证调用返回。

    • 帐户来自 IAuthenticationResult.getAccount() 方法,包含相关的帐户信息。
    • AAD ID 来自 IAccount.getId() 方法。
    • 租户 ID 来自 IAccount.getTenantId() 方法。
    • 颁发机构来自 IAccount.getAuthority() 方法。
  3. 若要从 Intune 管理中注销帐户,应用应调用 unregisterAccountForMAM()。 如果帐户已成功注册并受到管理,SDK 将取消注册该帐户并擦除其数据。 帐户的定期注册重试将停止。 SDK 通过通知异步提供取消注册请求的状态。

注册实现说明

  • 注册方法是幂等的。 例如, registerAccountForMAM 将仅注册一个帐户,并在该帐户尚未注册时尝试注册该应用,而 unregisterAccountForMAM 只会在帐户当前已注册时取消注册该帐户。 后续调用是无操作的,因此多次调用这些方法没有危害。

  • 不能保证每个注册/注销调用都有相应的结果通知。 例如,如果 registerAccountForMAM() 为已注册的帐户调用 了 ,则可能不会再次针对该标识发送通知。 或者,即使应用未调用这些方法,SDK 也可能发送通知,因为 SDK 可能会定期尝试在后台注册,并且取消注册可能会由从 Intune 服务收到的擦除请求触发。

  • 可以为任意数量的不同帐户调用注册方法,但目前只有一个帐户可以成功注册。 如果多个已获得 Intune 许可且面向应用保护策略的帐户在同一时间或附近注册,则不能保证哪一个帐户将赢得比赛。

  • 可以使用 getRegisteredAccountStatus 方法查询 MAMEnrollmentManager 以查看特定帐户是否已注册并获取其当前状态。 如果未注册提供的帐户,此方法将返回 null。 如果帐户已注册,此方法将返回帐户的状态为 MAMEnrollmentManager.Result 枚举的成员之一。

主权云注册

Azure 支持多个物理隔离的云,称为主权云或国家云。 如果应用程序是主权云感知应用程序,则必须向registerAccountForMAM()提供 authority 参数。

MSAL 指南

对于 MSAL,在 MSAL 配置文件中将 设置为 multiple_clouds_supportedtrue

{
  "multiple_clouds_supported": true,
}

注册结果和状态代码

首次注册帐户时,它将以 PENDING 状态开始,指示初始 MAM 服务注册尝试不完整。 注册尝试完成后,将发送通知,其中包含下表中的一个结果代码。 此外, getRegisteredAccountStatus 方法将返回帐户的状态,以便应用始终可以确定该帐户是否实施了应用保护策略。 如果注册尝试失败,则随着 SDK 在后台重试注册,帐户的状态可能会随时间而更改。

结果代码 解释
AUTHORIZATION_NEEDED 此结果指示应用的已注册 MAMServiceAuthenticationCallback 实例未提供令牌,或者提供的令牌无效。 应用应获取有效令牌并调用 updateToken (如果可能)。
NOT_LICENSED 帐户未获得 Intune 的许可,或者尝试联系 Intune MAM 服务失败。 应用应继续处于非托管 (正常) 状态,用户不应被阻止。 如果帐户将来获得许可,将定期重试注册。
ENROLLMENT_SUCCEEDED 注册尝试成功,或帐户已注册。 如果注册成功,则会在此通知之前发送策略刷新通知。 应允许访问公司数据。
ENROLLMENT_FAILED 注册尝试失败。 可以在设备日志中找到更多详细信息。 应用不应允许访问处于此状态的公司数据,因为之前已确定该帐户已获得 Intune 许可。 所有应用都应确保企业数据访问未授权,直到 ENROLLMENT_SUCCEEDED 你的应用获取数据。
WRONG_USER 每台设备只能有一个帐户向 MAM 服务注册应用。 此结果指示向其传递此结果的帐户 (第二个) 帐户是 MAM 策略的目标,但已注册其他帐户。 由于无法对第二个帐户强制实施 MAM 策略,因此你的应用不得允许访问此帐户的数据, (可能通过从应用) 中删除该帐户,除非/直到该帐户的注册在以后成功。 在提供此 WRONG_USER 结果的同时,MAM 将提示删除现有帐户的选项。 如果人类用户以肯定方式回答,则确实可以在短时间内注册第二个帐户。 只要第二个帐户保持注册状态,MAM 就会定期重试注册。
UNENROLLMENT_SUCCEEDED 取消注册成功。
UNENROLLMENT_FAILED 取消注册请求失败。 可以在设备日志中找到更多详细信息。 通常,只要应用通过有效的 (既不为 null 也不为空) UPN,就不会发生这种情况。 应用无法进行直接、可靠的修正。 如果在注销有效 UPN 时收到此值,请以 bug 的形式向 Intune MAM 团队报告。
PENDING 帐户的初始注册尝试正在进行中。 应用可以阻止对公司数据的访问,直到注册结果已知,但不需要这样做。
COMPANY_PORTAL_REQUIRED 帐户已获得 Intune 的许可,但在设备上安装 公司门户 应用之前,无法注册应用。 Intune 应用 SDK 将尝试阻止对给定帐户的应用的访问,并指示他们安装公司门户应用。 向应用发送此通知时,如果活动当前对用户可见或下次 onResume 调用,Intune 应用 SDK 将在当前活动顶部显示非阻止 UI。 如果用户取消了此非阻止 UI,Intune 应用 SDK 将在下次 onCreate 为活动调用时显示阻止 UI,并且当前标识是托管的, (请参阅下文,了解有关故障排除) 的详细信息。

应尽早初始化日志记录,以便从记录的数据中获取最大值。 Application.onMAMCreate() 通常是初始化日志记录的最佳位置。

若要在应用中接收 MAM 日志,请创建 Java 处理程序 并将其添加到 MAMLogHandlerWrapper。 这将在每个日志消息的应用程序处理程序上调用 publish()

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

注意

PII 代表“个人身份信息”,可能包括用户名和 UPN 等数据。 强烈建议在自己的生产日志中排除此类个人信息。 有关更多详细信息,请参阅 Microsoft 隐私策略

Intune 公司门户应用有多个用于收集诊断信息的选项。 公司门户包括以下 UI:

  • 使最终用户能够收集公司门户日志。
  • 显示设备和帐户元数据。
  • 包括有关当前 MAM 策略的每个应用信息。

Intune 诊断 UIIntune 应用信息

有关公司门户日志和诊断 UI 中包含的数据的详细说明,请参阅附录中的了解公司门户日志

提示

如果使用应应用 MAM 策略的帐户进行测试,但诊断未显示应用包名称的任何策略,请参阅下面的故障排除部分。

应用可以通过调用 MAMPolicyManager.showDiagnostics(context)来启动此诊断 UI。 最终用户还可以通过 Microsoft Edge 在地址栏中输入 来about:intunehelp启动公司门户的诊断控制台。 这是一个可选功能,可能有助于调试。

仅当设备上安装了公司门户时,此诊断信息才可用。 在showDiagnostics未安装公司门户的情况下调用时,将显示警告对话框。

退出条件

此时,在集成中,你的应用现在可以接收并强制实施应用保护策略。 执行以下测试以验证集成。

第一个策略应用程序测试

首先执行以下测试,以熟悉应用中策略应用程序的完整最终用户体验:

  1. 在 Microsoft Intune 管理中心中创建 Android 应用保护策略 (请参阅第 1 阶段中创建测试 Android 应用保护策略,了解) 的详细信息。 对于此测试,请配置策略:
    • 在“数据保护”下,将“屏幕捕获和 Google 助手”设置为“阻止”。
    • 在“访问要求”下,保留默认设置。 值得注意的是,“用于访问的 PIN”应为“必需”。
  2. 确保应用保护策略面向应用程序。 可能需要在策略创建向导中手动添加包名称。
  3. 将应用保护策略分配给包含测试帐户的用户组。
  4. 在测试 Android 设备上,卸载其他 SDK 集成的应用,例如 Microsoft Outlook、Teams、OneDrive 和 Office。 此外,卸载 Intune 公司门户 应用和 Microsoft Authenticator 应用。
    • 提示

      卸载其他 SDK 集成的应用有助于确保你以独占方式测试自己的应用的集成。

  5. 安装应用程序。
  6. 使用应用保护策略面向的测试帐户登录到应用程序。
  7. 确认系统提示你从 Google Play 安装Intune 公司门户。
    • 注意

      如果你的测试设备没有 Google Play Store 应用,请确认系统提示你从其他应用商店或 Microsoft 网站安装Intune 公司门户。

  8. 安装公司门户。 无需启动公司门户或登录到公司门户。
  9. 如有必要,请返回应用并再次登录。
  10. 确认出现“获取访问权限”屏幕的提示。 这表示 SDK 已成功检索此帐户的策略。
  11. 系统应提示你设置应用 PIN。 创建 PIN。
  12. 在应用程序周围导航并尝试获取屏幕截图。 鉴于 SDK 具有策略,则应在任何屏幕上始终阻止此策略。
  13. 从应用程序注销托管帐户。
  14. 如果可能,在不登录的情况下,在应用程序周围导航并尝试获取屏幕截图。 删除帐户后,不应阻止此帐户。

这是一个 最起码 的测试,用于确认你的应用是否已正确注册帐户、注册身份验证回调以及取消注册帐户。 执行以下测试以更彻底地验证其他应用保护策略设置如何修改应用程序的行为。

数据保护测试

以下测试涵盖在应用保护策略中配置的特定数据保护设置。 在 Microsoft Intune 管理中心更改应用保护策略设置时,客户端不会立即更新。 有关加快测试的提示,请参阅 使用更改策略快速 测试。

对于这些测试:

  1. 安装应用。
  2. 安装Intune 公司门户。
  3. 安装另一个托管应用,其目标与应用策略相同,可以复制和粘贴数据 (,例如 Microsoft Office) 。
  4. ) 可以复制和粘贴数据的任何非托管应用安装 (或重复使用。
  5. 使用测试托管帐户登录到应用。
  6. 使用托管测试帐户登录到其他托管应用。
应用场景 应用保护策略设置 测试步骤
屏幕截图 “屏幕捕获和 Google 助手”设置为“阻止” 1. 导航到应用中的所有页面。
2. 尝试在每个页面上拍摄屏幕截图。
3. 确认屏幕截图已阻止或保存的图像完全为空。
复制文本 “限制在其他应用之间剪切、复制和粘贴”设置为“策略托管应用” 0.如果应用没有任何要复制的文本,请跳过。
1. 导航到应用中具有可复制文本的所有页面。
2. 复制文本。
3. 切换到非托管应用。
4.尝试粘贴非托管应用。
5.确认粘贴被阻止。
6. 导航到其他托管应用。
7. 尝试粘贴托管应用。
8.确认允许粘贴。
粘贴文本 “限制在其他应用之间剪切、复制和粘贴”设置为“策略托管应用” 0.如果应用没有任何要粘贴的文本输入,请跳过。
1. 切换到非托管应用。
2. 从非托管应用复制文本。
3. 导航到应用中具有文本输入的所有页面。
5.尝试从非托管应用粘贴。
5.确认粘贴被阻止。
6. 切换到其他托管应用。
7. 从其他托管应用复制文本。
7. 导航到应用中具有文本输入的所有页面。
8. 尝试从其他托管应用粘贴。
9. 确认允许粘贴。
打印 “打印组织数据”设置为“阻止” 0.如果应用没有任何可打印的页面或文档,请跳过。
1. 导航到应用中调用 Android 打印函数的所有页面。
2. 尝试从每页打印。
3.确认打印被阻止。
托管浏览器 “限制使用其他应用传输 Web 内容”设置为“Microsoft Edge” 0.如果应用未呈现 Web 链接,请跳过。
1. 导航到应用中的所有页面,这些页面可以显示 Web 链接或具有呈现为可单击 Web 链接的文本输入。
2. 对于每个页面,选择 Web 链接。
3.确认系统提示安装 Microsoft Edge,并且 Web 链接未在另一浏览器中打开。
受限键盘 “批准的键盘”设置为“必需”
将“选择要批准的键盘”设置为仅设备当前未安装的键盘包
0.如果应用没有任何文本输入,请跳过。
1. 导航到应用中具有文本输入的所有页面。
2. 选择文本输入以打开设备键盘。
3.确认系统提示你安装配置的已批准键盘,并且当前设备键盘未打开。

数据传输测试

数据传输设置是应用保护策略数据保护功能的子集,用于控制传入和退出托管应用的数据。 支持向其他应用 发送 数据或从其他应用 接收 数据的大多数应用也能够 将数据保存到 本地或云存储以及从云存储 打开 数据。 如果你的应用具有这些功能,则需要实现其他支持。 有关详细信息 ,请参阅限制应用与设备或云存储位置之间的数据传输的策略

你的应用可能会主动从其他应用导入数据,例如从 Microsoft OneDrive 附加文件的 Microsoft Outlook。 你的应用也可能被动接收来自其他应用的数据,例如 Microsoft Office 从 Microsoft Outlook 附件打开文档。 接收应用保护策略设置涵盖这两种方案。

对于这些测试:

  1. 安装应用。
  2. 安装Intune 公司门户。
  3. 安装与应用具有相同策略的另一个托管应用,该应用可以发送和接收数据 (,如 Microsoft Outlook) 。
  4. ) 可以发送和接收数据的任何非托管应用安装 (或重复使用。
  5. 使用测试托管帐户登录到应用。
  6. 使用托管测试帐户登录到其他托管应用。
应用场景 应用保护策略设置 测试步骤
将数据发送到其他应用 “将组织数据发送到其他应用”设置为“策略托管应用” 0.如果应用无法将数据发送到其他应用,请跳过。
1. 导航到应用可以发送数据的位置。
2. 尝试发送数据。
3. 确认你仅限于将数据发送到其他托管应用。 应会看到一个仅包含托管应用的应用选取器。
从其他应用导入数据 “从其他应用接收数据”设置为“策略托管应用” 0.如果应用无法从其他应用导入数据,请跳过。
1. 导航到应用可以从其他应用导入数据的位置。
2.尝试导入数据。
3.确认仅限于从其他托管应用导入数据。 应会看到一个仅包含托管应用的应用选取器。
从非托管应用接收数据 “从其他应用接收数据”设置为“策略托管应用” 0.如果应用无法从其他应用接收数据,请跳过。
1. 切换到非托管应用。
2. 导航到可以发送数据的位置。
3.尝试将数据从非托管应用发送到你的应用。
4.确认你的应用无法从非托管应用接收数据。
从托管应用接收数据 “从其他应用接收数据”设置为“策略托管应用” 0.如果应用无法从其他应用接收数据,请跳过。
1. 切换到其他托管应用。
2. 导航到可以发送数据的位置。
3. 尝试将数据从其他托管应用发送到你的应用。
4.确认你的应用能够从其他托管应用接收数据。

其他数据保护设置

在应用执行其他更改之前,不会强制实施以下数据保护设置。 在此阶段,无需测试这些设置。 有关更多详细信息 ,请参阅阶段 7:应用参与功能

应用场景 应用保护策略设置 如果...
保存数据副本 保存组织数据的副本 应用程序可以将数据保存到本地或云存储。
从存储中打开数据 在组织文档中打开数据 应用程序可以从本地或云存储打开数据。
托管通知内容 组织数据通知 你的应用在通知中包含用户数据。
备份和还原 将组织数据备份到 Android 备份服务 你的应用使用 Android 的备份功能共享用户数据。

条件启动测试

条件启动设置是应用保护策略功能的子集,这些功能根据可配置的设备范围或特定于应用的条件限制对应用的访问。 这些设置包括条件 ((如“最低 OS 版本”) )和“阻止访问”) 等 (操作。 条件启动操作可以是:

  • 警告:当最终用户的设备或应用不符合条件时,将看到警告对话框。 他们仍有权访问所有应用数据。
  • 阻止访问:最终用户在其设备或应用不符合条件时将看到警告对话框。 在满足条件或从应用中删除托管帐户之前,不允许他们进入应用并访问应用数据。
  • 擦除数据:当设备或应用不符合条件时,将擦除与托管帐户关联的所有公司数据。 在删除数据之前,用户将没有机会满足条件。

可以使用多个值和操作配置某些条件启动设置。 例如:

  • 最低 OS 版本,值为“10.0”,操作设置为“Warn”。
  • 最低 OS 版本,值为“9.0”,操作设置为“阻止访问”
  • 最低 OS 版本,值为“8.0”,操作设置为“擦除数据”。

通过完成此阶段的集成步骤,你的应用现在支持 所有条件启动功能。 通过更改策略项来熟悉条件启动功能,以便测试设备:

  • 传递所有配置的条件启动设置。
  • 配置的条件启动设置设置为“警告”操作失败。
  • 配置的条件启动设置设置为“阻止访问”操作失败。
  • 配置的条件启动设置设置为“擦除数据”操作失败。

疑难解答

第一个策略应用程序测试故障排除

按照上面的 第一个策略应用程序测试 步骤,可能会遇到以下意外行为:

使用托管帐户登录后,系统不会提示我安装公司门户 (步骤 7)

首先,访问 Intune 管理中心,并双重检查应用保护策略针对测试帐户。

其次,双重检查对 的调用registerAccountForMAM和实现的MAMServiceAuthenticationCallback源代码。 如果前者未在正确的时间调用,并且/或后者未正确提供有效令牌,则不会看到公司门户提示。

最后,查看日志 (或调试) 以获取注册结果代码,或者显式调用 getRegisteredAccountStatus 帐户。 NOT_LICENSED等代码可以指示测试帐户的配置问题。

(步骤 10 登录后未看到“获取访问权限”屏幕)

如果之前未安装公司门户,则可能需要恢复或完全重启应用程序,才能看到“获取访问”屏幕并正确实施策略。 这是基于 SDK 集成应用如何在 公司门户 应用中利用代码的预期结果。

如果仍然看不到“获取访问权限”屏幕,即使在重启应用并再次登录之后,SDK 也可能无法注册帐户或检索帐户的策略。 双重检查源代码的实现MAMServiceAuthenticationCallback

在登录步骤 11 后,我看不到设置或输入应用 PIN 的屏幕 ()

测试设备上是否有其他 SDK 集成的应用程序? 应用 PIN 在所有托管应用之间共享,SDK 具有全局计时器,以防止在每次启动或恢复托管应用时提示最终用户输入 PIN。

否则,请访问 Intune 管理中心和双重检查应用保护策略已启用应用 PIN 并面向你的测试帐户。

作为最后的手段,重启设备将重置 PIN 计时器。 如果重启设备后 PIN 屏幕未显示,则可能在策略中未正确配置。

我确实看到了“获取访问权限”屏幕,但仍允许 (步骤 12)

检索策略时,应用了错误的策略。 首先,访问 Intune 管理中心和双重检查应用保护策略会禁用屏幕截图并面向测试帐户。 其次,使用上述) 所述的诊断控制台 (检查已为应用拉取的策略。 如果这两个策略都确认应阻止屏幕截图,检查 Gradle 生成插件配置,以确保正在进行 MAM 替换。

我的应用在注销后出现崩溃或关闭 (步骤 13)

注销以前注册并实施了策略的帐户时,SDK 将擦除与该帐户关联的数据。 应用进程应终止。

即使我注销 (步骤 14)

双重检查对 的调用unregisterAccountForMAM()的源代码。 如果在注销后仍强制实施策略,则可能是帐户未正确注销和未注册。

数据保护测试故障排除

按照上述 数据保护测试 步骤,可能会遇到以下意外行为:

我的应用未接收或未强制执行任何策略

首先,确认应用保护策略面向包含测试帐户的组。 有关详细信息,请参阅如何在 Microsoft Intune 中验证应用保护策略设置

其次,检查客户端诊断信息,以确认 SDK 已收到配置的策略。 如果尚未实现,请检查应用的实现和对 registerAccountForMAMMAMServiceAuthenticationCallback调用。 此外,检查日志或调试来验证 MAMEnrollmentManager.Result

我的应用可以将数据共享到非托管应用

确认“将组织数据发送到其他应用”设置为“策略托管应用”。 检查Microsoft Intune管理中心,确认策略的配置和目标正确。 检查客户端 诊断信息 以确认 SDK 已收到配置的策略。

接下来,如果正确配置并检索了策略,检查是否强制实施任何策略:我的应用未接收或强制执行任何策略

我的应用无法与其他托管应用共享数据

确认针对你的应用 和其他托管应用的应用保护策略设置。 建议两个应用具有相同的策略。 面向应用的策略应将“将组织数据发送到其他应用”设置为“策略托管应用”。 检查针对其他应用的策略;如果“从其他应用接收数据”设置为“无”,则此行为是预期行为。

我的应用可以从非托管应用接收数据

确认“从其他应用接收数据”设置为“策略托管应用”。 检查Microsoft Intune管理中心,确认策略的配置和目标正确。 检查客户端 诊断信息 以确认 SDK 已收到配置的策略。

接下来,如果正确配置并检索了策略,检查是否强制实施任何策略:我的应用未接收或强制执行任何策略

我的应用无法从其他托管应用接收数据

确认针对你的应用 和其他托管应用的应用保护策略设置。 建议两个应用具有相同的策略。 面向应用的策略应将“从其他应用接收数据”设置为“策略托管应用”。 检查针对其他应用的策略;如果“将组织数据发送到其他应用”设置为“无”,则此行为是预期行为。

后续步骤

完成上述所有 退出条件 后,应用现已成功集成为单一标识,并且可以强制实施所有基本应用保护策略。 后续部分:阶段 5:多标识阶段 6:应用程序配置阶段 7:应用参与功能可能是必需的,也可能不需要,具体取决于应用所需的应用保护策略支持。 如果不确定这些部分是否适用于你的应用,请重新访问 SDK 集成的关键决策