适用于 Android 的 Intune App SDK - MAM 集成要点

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

注意

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

第 4 阶段:MAM 集成要点

阶段目标

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

背景

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

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

MAM 严格模式

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

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

若要启用 MAM 严格模式,请在应用程序初始化 (提早调用以下方法,例如 Application.onCreate) :

MAMStrictMode.enable();

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

处理冲突

当检查失败时,它将运行 MAMStrictViolationHandler。 默认处理程序会引发一个 Error,这可能会使应用崩溃。 这是为了使失败尽可能嘈杂,并且符合不应在生产版本中启用严格模式的意图。

如果你的应用想要以不同的方式处理冲突,它可以通过调用以下方法来提供自己的处理程序,其中handlerimplements:MAMStrictViolationHandler

MAMStrictMode.global().setHandler(handler);

取消检查

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

尽管可以在全局范围内执行抑制,但最好在特定调用站点上暂时禁用每个线程。 下面的示例显示了在尝试保护) 不存在的文件时禁用引发 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 应用 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. 应用 必须 实现并注册 MAMServiceAuthenticationCallbackMAMServiceAuthenticationCallbackExtended 接口的实例。 必须在 Application 子类的 (或 onMAMCreate()) 方法中onCreate()注册回调实例。

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

注意

aadId这些方法中的参数是指 Microsoft Entra 用户 ID,以前称为 AAD ID,也称为 OID。

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

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

    提示

    确保应用使用传递给aadIdacquireToken()resourceId 和参数,以便获取正确的令牌。 此 upn 参数仅供参考;在未同时考虑 aadId的情况下,不应用于标识帐户。 应用于 resourceId 生成正确的作用域,并 aadId 应用于传递正确的帐户。 如果为错误的帐户和/或错误的资源返回令牌,可能会导致注册应用和检索策略延迟或失败。 如果你的应用需要 Microsoft Entra 机构来正确获取令牌,请实施该MAMServiceAuthenticationCallbackExtended接口。

    class MAMAuthCallback implements MAMServiceAuthenticationCallbackExtended {
        public String acquireToken(String upn, String aadId,
                    String tenantId, String authority, String resourceId) {
            final String[] scopes = {resourceId + "/.default"};
    
            final IAccount account = getAccount(aadId);
            if (account == null) {
                // Log error or warning here about: "no account found for " + aadId
                return null;
            }
    
            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()。 此 upn 参数仅供参考,通常会被 MAM SDK 忽略。 从提供的回调返回 null 后,应用应尽快调用此方法。

    警告

    请勿 updateToken() 从实现 acquireToken()中调用。 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 租户相关联。 还可以提供帐户的权限,以允许针对特定主权云进行注册;有关详细信息,请参阅 Sovereign Cloud 注册。 SDK 可能会尝试在 MAM 服务中为给定帐户注册应用;如果注册失败,它将定期重试注册,直到注册成功或帐户被注销。 重试周期通常为 12-24 小时。 SDK 通过通知异步提供注册尝试的状态。

  2. 最佳调用 registerAccountForMAM 时间是用户登录应用并使用 MSAL 成功进行身份验证之后。 帐户的 Microsoft Entra 用户 ID、租户 ID 和颁发机构从 MSAL 身份验证调用IAccount返回,作为与 IAuthenticationResult.

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

注册实施说明

  • 注册方法是幂等的。 例如, registerAccountForMAM 将仅注册帐户并尝试注册该帐户(如果该帐户尚未注册),而 unregisterAccountForMAM 将仅取消注册当前已注册帐户。 后续调用是无操作的,因此多次调用这些方法并没有什么坏处。

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

  • 可以为任意数量的不同帐户调用注册方法,但目前只能成功注册一个帐户。 如果同时或几乎同时注册了多个获得 Intune 许可并以应用保护策略为目标的帐户,则无法保证哪个帐户将赢得竞赛。

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

Sovereign Cloud 注册

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 会向最终用户提示两个修正选项: (1) 删除现有已注册的帐户,以便第二个帐户可以注册,或者 (2) 删除尝试) 帐户的第二个 (,以便在现有帐户保持注册状态时停止显示提示。 如果用户选择选项 (1) ,则可以在不久后注册第二个帐户。 如果用户选择选项 (2) ,MAM 将在本地注销第二个帐户并通过 UNENROLLMENT_SUCCEEDED 标准注册结果通知报告该帐户;因为从未注册第二个帐户,因此不会执行选择性擦除,也不会传递擦除通知。 MAM 还会停止重试该帐户的注册,因此提示不再再次出现。 只要第二个帐户保持注册状态 (即用户未选择选项 2) ) (,MAM 就会定期重新尝试注册。
UNENROLLMENT_SUCCEEDED 取消注册成功。
UNENROLLMENT_FAILED 注销请求失败。 可以在设备日志中找到更多详细信息。 一般情况下,只要应用传递一个有效的 (,且) UPN 中既不为 null 也不为空,就不会发生这种情况。 应用无法采取直接、可靠的修正措施。 如果在注销有效 UPN 时收到此值,请将 bug 报告给 Intune MAM 团队。
PENDING 帐户的初始注册尝试正在进行中。 在注册结果已知之前,应用可能会阻止对公司数据的访问,但这不是必需的。
COMPANY_PORTAL_REQUIRED 帐户已获得 Intune 许可,但在设备上安装公司门户应用之前,无法注册该应用。 Intune 应用 SDK 会尝试阻止给定帐户对应用的访问,并指示用户安装公司门户应用。 将此通知发送到应用时,如果活动当前对用户可见或onResume下次被调用,则 Intune 应用 SDK 将在当前活动顶部显示非阻止 UI。 如果用户取消此非阻塞 UI,则 Intune App 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 策略的帐户进行测试,但诊断未显示应用包名称的任何策略,请参阅下面的“疑难解答”部分。

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

只有在设备上安装公司门户后,此诊断信息才可用。 只要在未安装公司门户的情况下进行调用,都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 商店应用,请确认系统会提示你从其他应用商店或 Microsoft 网站安装 Intune 公司门户。

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

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

数据保护测试

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

对于这些测试:

  1. 安装应用。
  2. 安装 Intune 公司门户。
  3. 安装另一个托管应用,该应用与你的应用具有相同的策略,该应用可复制和粘贴数据 (如 Office) Microsoft。
  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. 确认打印被阻止。
Microsoft Edge Web 内容限制 “限制与其他应用传输 Web 内容”设置为“Microsoft Edge” 0. 如果应用未呈现 Web 链接,请跳过。
1. 导航到应用中可显示 Web 链接或文本输入呈现为可点击 Web 链接的所有页面。
2. 对于每个页面,选择 Web 链接。
3. 确认系统会提示你安装 Microsoft Edge,并且该 Web 链接不会在其他浏览器中打开。
受限键盘 将“批准的键盘”设置为“必需”
“选择要批准的键盘”设置为仅限设备当前未安装的键盘包
0. 如果应用没有任何文本输入,请跳过。
1. 导航到应用中具有文本输入的所有页面。
2. 选择文本输入以显示设备键盘。
3. 确认系统提示你安装已配置的批准键盘,并且当前设备键盘未打开。

数据传输测试

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

应用可能会主动从其他应用导入数据,例如 Microsoft Outlook 从 Microsoft OneDrive 附加文件。 应用也可能被动地从其他应用接收数据,例如 Microsoft Office 从 Microsoft Outlook 附件打开文档。 “从其他应用接收数据”策略设置涵盖这两种情况。

对于这些测试:

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

其他数据保护设置

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

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

条件启动测试

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

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

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

  • 最低操作系统版本,值为“10.0”,操作设置为“警告”。
  • 最低操作系统版本,值为“9.0”,操作设置为“阻止访问”
  • 最低操作系统版本,值为“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 已收到配置的策略。 如果没有,请检查应用的实现 MAMServiceAuthenticationCallback 和 调用 registerAccountForMAM。 此外,还会检查日志或调试以验证 MAMEnrollmentManager.Result.

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

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

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

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

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

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

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

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

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

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

后续步骤

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