Android 用 Intune App SDK - MAM 統合の要点

Android 用 Microsoft Intune App SDK を使用すると、Intune アプリ保護ポリシー (APP または MAM ポリシーとも呼ばれます) をネイティブの Java/Kotlin Android アプリに組み込むことができます。 Intune で管理されるアプリケーションは、Intune App SDK と統合されたアプリケーションです。 Intune 管理者は、Intune がアプリをアクティブに管理するときに、Intune で管理されるアプリにアプリ保護ポリシーを簡単に展開できます。

注:

このガイドは、いくつかの異なるステージに分かれています。 まず、「 ステージ 1: 統合を計画する」を確認します。

ステージ 4: MAM 統合の要点

ステージ Goals

  • MAM Strict モードを有効にします。
  • SDK からの重要な通知に登録します。
  • MSAL から SDK にMicrosoft Entraトークンを提供する認証コールバックを実装して登録します。
  • MSAL で認証した後、MAM 管理用の新しいアカウントを登録します。
  • ログアウト時にアカウントの登録を解除して、企業データを削除します。
  • (推奨)MAM ログをアプリに組み込みます。
  • (推奨)SDK 診断ダイアログを使用する方法について説明します。

背景

Intune App SDK をダウンロードし、ビルドに統合し、クラスとメソッドの置き換えを正常に実行したら、MAM で保護されたアカウントのアプリ保護ポリシー設定の適用を開始するための重要なコード変更を行います。

このステージでは、SDK のログ記録にフックする方法、診断 ダイアログを呼び出す方法、MAM Strict Mode を有効にして統合バグの可能性を特定する方法、SDK からの通知を登録する方法、および最も重要なのは、Intune MAM のアカウントを登録してポリシーの受信を開始する方法について説明します。

MAM Strict モード

MAM Strict モードでは、アプリケーションの Intune App SDK の統合における潜在的なバグを特定できます。 これらの統合バグにより、アプリ保護ポリシーを適切に適用し、企業データを保護解除したままにすることが失敗する可能性があります。 その結果、MAM 厳格モードの使用が 必要になります。

MAM 厳密モードでは、アプリケーションで MAM API と MAM 制限プラットフォーム API を使用する際の異常が検索されます。 Android の StrictMode の後に緩やかにパターン化された MAM Strict Mode では、実行時エラーが失敗したときに発生する定義済みのチェック セットが実行されます。 MAM 厳格モードは、運用環境のビルドで有効のままにすることを意図していません。代わりに、アプリの内部開発、デバッグ、および/または dogfood ビルドで使用します。

MAM 厳密モードを有効にするには、

MAMStrictMode.enable();

アプリケーションの初期化の早い段階 (例: Application.onCreate)。

MAM Strict Mode チェックが失敗した場合は、アプリで修正できる実際の問題か、誤検知かを判断してみてください。 誤検知であると思われる場合、または不明な場合は、Intune MAM チームにお知らせください。 これにより、誤検知の決定に同意し、将来のリリースの検出を改善しようとします。 誤検知を抑制するには、次の手順に従って失敗したチェックを無効にします。

違反の処理

チェックが失敗すると、MAMStrictViolationHandler が実行されます。 既定のハンドラーは、 を Errorスローします。これは、アプリをクラッシュさせる必要があります。 これは、障害を可能な限り騒がしくし、運用環境のビルドで厳密モードを有効にしてはならないという意図に適合することです。

アプリで違反を別の方法で処理する場合は、次を呼び出して独自のハンドラーを提供できます。

MAMStrictMode.global().setHandler(handler);

ここで handler 、 は を実装します MAMStrictViolationHandler

チェックの抑制

アプリが正しく動作していない状況でチェックが失敗した場合は、上記のように報告してください。 その間、少なくとも更新された 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 App SDK は、時間の影響を受けやすい管理操作をアプリケーションに通知するために、さまざまな種類の通知を発行します。 アプリケーションは、これらの通知のいずれかに登録して、受信時にアクションを実行できます。

たとえば、IT 管理者がデバイスに対して選択的ワイプ コマンドを発行するたびに、Intune サービスは SDK に通知を送信します。この通知は として WIPE_USER_DATAアプリケーションに渡されます。 アプリケーションは、この通知をリッスンし、ワイプされるデータを制御できます。または、SDK の既定のワイプ動作に依存できます。

通知の多くは省略可能です。 アプリケーションで使用される SDK 機能によっては、一部の通知が必要になる場合があります。 通知の登録方法、SDK が配信する通知、および特定の通知の種類を処理する方法の詳細については、「ステージ 7: アプリ参加機能」の「SDK からの通知の登録」を参照してください。

App Protection ポリシーの登録

管理者は、App Protection ポリシーを作成するときに、これらのポリシーをorganization内の特定のアカウントにターゲットにします。 クライアントでは、SDK でアプリケーションを使用しているアカウントを把握し、そのアカウントのポリシーを取得し、設定を適切に適用できるようにする必要があります。 アプリは、このアカウント情報を SDK に提供する責任を負います。 このプロセスは登録と呼ばれます。

アプリが新しいアカウントを追加するたびに、他のアカウントが既に登録されている場合でも、そのアカウントを SDK に登録する必要があります。 アプリでは、複数のアカウントを登録できます。 ただし、現在登録できるアカウントは 1 つだけです。アプリ保護ポリシーを適用することもできます。 Android では、この単一マネージド アカウントの制限はデバイス全体です。

登録と登録

登録 は、新しいアカウントが使用されていることをアプリから SDK に通知するプロセスです。 SDK には、アカウントの登録と登録解除のためにアプリで呼び出す必要がある関数が含まれています。

登録 は、登録されたアカウントを Intune サービスに記録して、アカウントのポリシーを適用できるようにするプロセスです。 登録のためにアプリで関数を呼び出す必要はありません。 SDK は、アカウントの登録後に登録を完全に処理します。

あるアカウントが既にアプリケーションに登録されている場合、別のアカウントを登録するときに、そのアカウントが App Protection ポリシーを対象としている場合でも、その 2 つ目のアカウントは登録されないため、ポリシーは適用されません。

注:

"登録" という用語は、デバイス全体の MDM 登録を参照することもできます。詳細については、「 MDM および MAM 登録に関する付録」を参照してください。

登録の実装

注意

アプリが MSAL を統合していない場合 (強くお勧めします)、このセクションを続行するのではなく、付録「既定の登録」を参照してください。

アカウントを正常に登録するには、アプリで次の 3 つのコード変更を行う必要があります。

  1. アプリでは、MAMServiceAuthenticationCallback インターフェイスのインスタンスを実装して登録する必要があります。 コールバック インスタンスは、Application サブクラスの onCreate() (または onMAMCreate()) メソッドに登録する必要があります。

  2. アカウントが作成され、ユーザーが MSAL で正常にサインインした場合、アプリは registerAccountForMAM を呼び出す必要があります

  3. アカウントが削除されると、アプリは unregisterAccountForMAM を呼び出して Intune 管理からアカウントを削除する必要があります。

    注意

    通話によってワイプが開始され、アカウントの企業データが完全に削除される場合があります。

必要なすべての認証と登録 API は、 MAMEnrollmentManager インターフェイスにあります。 への参照は MAMEnrollmentManager 、次のように取得できます。

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

// make use of mgr

MAMEnrollmentManager返されるインスタンスは null ではないことが保証されます。 API メソッドは、 認証アカウント登録という 2 つのカテゴリに分類されます。

MAMEnrollmentManager と認証

SDK は Intune サービスと頻繁に通信します。登録済みアカウントの登録、App Protection Policy 設定の更新プログラムの取得、アプリ内の保護されたデータの選択的ワイプなど、保留中の管理者アクションを取得します。 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 トークンを要求できるようにする必要があります。 コールバック インスタンスを に提供するには MAMEnrollmentManagerregisterAuthenticationCallback メソッドを呼び出す必要があります。 登録の再試行またはアプリ保護ポリシーの更新チェックインのアプリ ライフサイクルの早い段階でトークンが必要になる場合があるため、コールバックはアプリApplicationのサブクラスの (またはonMAMCreate()) メソッドにonCreate()登録する必要があります。

  2. メソッドは acquireToken 、指定されたアカウントの要求されたリソース ID のアクセス トークンを取得する必要があります。 要求されたトークンを取得できない場合は、null を返す必要があります。

    ヒント

    正しいトークンが取得されるように、アプリで に渡された acquireToken() パラメーターと aadId パラメーターが使用resourceIdされていることを確認します。 を 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 トークンを取得することをお勧めします。 アカウントを登録すると、アプリは別のスレッドで登録済みの MAMServiceAuthenticationCallbackメソッド acquireToken() へのコールバックを受け取ります。 そのコールバックで有効なトークンを指定すると、登録を続行できます。 アプリは、通知を介して登録結果を取得します。

  • アプリが有効なMicrosoft Entra トークンを返さない場合、登録試行の最終的な結果は になりますAUTHORIZATION_NEEDED。 アプリが通知を介してこの結果を受け取る場合は、 事前に acquireToken から要求されたアカウントとリソースのトークンを取得し、 updateToken メソッドを呼び出して登録プロセスを再度開始することで、登録プロセスを迅速化することを強くお勧めします。

  • また、アプリの登録がMAMServiceAuthenticationCallback呼び出され、アプリ保護ポリシーの定期的な更新チェックインのトークンが取得されます。要求されたときにアプリがトークンを提供できない場合、通知は取得されませんが、次の便利なタイミングでトークンを取得して呼び出updateToken()しを試み、チェックイン プロセスを迅速化する必要があります。 トークンが指定されていない場合でも、次回のチェック試行時にコールバックが呼び出される可能性があります。

  • ソブリン クラウドのサポートには、権限を提供する必要があります。

  • インターフェイスが実装されている場合MAMServiceAuthenticationCallbackExtended、インターフェイスは既定の実装を提供するため、 からMAMServiceAuthenticationCallback継承されたacquireToken()メソッドを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 はアカウントが現在登録されている場合にのみ登録を解除します。 後続の呼び出しは no-ops であるため、これらのメソッドを複数回呼び出しても問題ありません。

  • すべての登録/登録解除呼び出しに対応する結果通知が含まれる保証はありません。 たとえば、既に登録されているアカウントに対してが呼び出された場合 registerAccountForMAM() 、その ID に対する通知が再度送信されない可能性があります。 または、アプリがこれらのメソッドを呼び出していない場合でも、SDK が通知を送信する場合があります。SDK はバックグラウンドで定期的に登録を試み、登録解除は Intune サービスから受信したワイプ要求によってトリガーされる可能性があるためです。

  • 登録方法は、任意の数の異なるアカウントに対して呼び出すことができますが、現在、正常に登録できるのは 1 つのアカウントのみです。 Intune 用にライセンスが付与され、アプリ保護ポリシーを対象とする複数のアカウントが同時またはほぼ同時に登録されている場合、どちらがレースに勝つのかは保証されません。

  • MAMEnrollmentManager にクエリを実行して、特定のアカウントが登録されているかどうかを確認し、getRegisteredAccountStatus メソッドを使用して現在の状態を取得できます。 指定されたアカウントが登録されていない場合、このメソッドは null を返します。 アカウントが登録されている場合、このメソッドは 、MAMEnrollmentManager.Result 列挙型のメンバーの 1 つとしてアカウントの状態を返します。

ソブリン クラウド登録

Azure では、ソブリン クラウドまたはナショナル クラウドと呼ばれる、物理的に分離された複数のクラウドがサポートされています。 アプリケーションがソブリン クラウドに対応している場合は、 に パラメーターをauthority指定するregisterAccountForMAM()必要があります

MSAL ガイダンス

MSAL の場合は、MSAL 構成ファイルで を にtrue設定multiple_clouds_supportedします。

{
  "multiple_clouds_supported": true,
}

登録結果と状態コード

アカウントが最初に登録されると、最初の MAM サービス登録試行が不完全であることを示す状態で PENDING 開始されます。 登録試行が完了すると、次の表のいずれかの結果コードを含む通知が送信されます。 さらに、 getRegisteredAccountStatus メソッドはアカウントの状態を返します。そのため、アプリはそのアカウントにアプリ保護ポリシーが適用されているかどうかを常に判断できます。 登録試行が失敗した場合、SDK がバックグラウンドで登録を再試行すると、アカウントの状態が時間の経過とともに変化する可能性があります。

結果コード 説明
AUTHORIZATION_NEEDED この結果は、アプリの登録された MAMServiceAuthenticationCallback インスタンスによってトークンが提供されなかったか、指定されたトークンが無効であることを示します。 アプリは有効なトークンを取得し、可能であれば updateToken を 呼び出す必要があります。
NOT_LICENSED アカウントに Intune のライセンスが付与されていないか、Intune MAM サービスへの接続が失敗しました。 アプリはアンマネージド (通常) 状態で続行する必要があり、ユーザーをブロックしないでください。 今後アカウントのライセンスが付与された場合は、登録が定期的に再試行されます。
ENROLLMENT_SUCCEEDED 登録試行が成功したか、アカウントが既に登録されています。 登録が成功した場合、この通知の前にポリシー更新通知が送信されます。 企業データへのアクセスを許可する必要があります。
ENROLLMENT_FAILED 登録試行が失敗しました。 詳細については、デバイス ログを参照してください。 この状態の企業データへのアクセスは、アカウントが Intune 用にライセンスされていることが以前に決定されているため、アプリでは許可しないでください。 すべてのアプリは、アプリによって取得されるまで ENROLLMENT_SUCCEEDED 、企業のデータ アクセスが承認されないようにする必要があります。
WRONG_USER MAM サービスにアプリを登録できるのは、デバイスごとに 1 つのアカウントのみです。 この結果は、この結果が配信されたアカウント (2 番目のアカウント) が MAM ポリシーを対象としているが、別のアカウントが既に登録されていることを示します。 2 つ目のアカウントに対して MAM ポリシーを適用できないため、後でこのアカウントの登録が成功するまで、アプリでこのアカウントのデータへのアクセスを許可しないでください (アプリからアカウントを削除する場合もあります)。 この WRONG_USER 結果の配信と同時に、MAM は既存のアカウントを削除するオプションを求めるメッセージを表示します。 人間のユーザーが肯定に答えた場合、2番目のアカウントをしばらくしてから登録することは確かに可能です。 2 番目のアカウントが登録されたままである限り、MAM は登録を定期的に再試行します。
UNENROLLMENT_SUCCEEDED 登録解除に成功しました。
UNENROLLMENT_FAILED 登録解除要求が失敗しました。 詳細については、デバイス ログを参照してください。 一般に、これは、アプリが有効な (null も空でもない) UPN を渡す限り発生しません。 アプリで実行できる直接的で信頼性の高い修復はありません。 有効な UPN の登録を解除するときにこの値を受け取った場合は、Intune MAM チームにバグとして報告します。
PENDING アカウントの最初の登録試行が進行中です。 登録結果がわかるまで、アプリは企業データへのアクセスをブロックできますが、そうする必要はありません。
COMPANY_PORTAL_REQUIRED アカウントは Intune 用にライセンスされていますが、ポータル サイト アプリがデバイスにインストールされるまで、アプリを登録できません。 Intune App SDK は、特定のアカウントのアプリへのアクセスをブロックし、ポータル サイト アプリのインストールを指示します。 この通知をアプリに送信すると、アクティビティが現在ユーザーに表示されている場合、または次回 onResume 呼び出された場合、Intune App SDK は現在のアクティビティの上に非ブロック UI を表示します。 ユーザーがこの非ブロック UI を取り消した場合、Intune App SDK は、次回 onCreate アクティビティに対して呼び出され、現在の ID が管理されるときにブロック 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)起動できます。 エンド ユーザーは、アドレス バーに「」と入力することで、Microsoft Edge を介してポータル サイトの診断コンソールをabout:intunehelp起動することもできます。 これは、デバッグに役立つオプションの機能です。

この診断情報は、ポータル サイトがデバイスにインストールされている場合にのみ使用できます。 ポータル サイトがインストールされていない場合は常showDiagnosticsに警告ダイアログが表示されます。

終了条件

統合のこの時点で、アプリは App Protection ポリシーを受け取って適用できるようになりました。 次のテストを実行して、統合を検証します。

最初のポリシー アプリケーション テスト

最初に次のテストを実行して、アプリ内のポリシー アプリケーションの完全なエンド ユーザー エクスペリエンスを理解します。

  1. Microsoft Intune管理センターで Android App Protection ポリシーを作成します (詳細については、「ステージ 1 でのテスト Android アプリ保護ポリシーの作成」を参照してください)。 このテストでは、ポリシーを構成します。
    • [データ保護] で、[スクリーン キャプチャと Google アシスタント] を [ブロック] に設定します。
    • [アクセス要件] で、既定の設定のままにします。 特に、"アクセス用の PIN" は "必須" である必要があります。
  2. アプリ保護ポリシーがアプリケーションを対象にしていることを確認します。 ポリシー作成ウィザードでパッケージ名を手動で追加する必要がある場合があります。
  3. テスト アカウントを含むユーザー グループに App Protection ポリシーを割り当てます。
  4. テスト Android デバイスで、Microsoft Outlook、Teams、OneDrive、Office などの他の SDK 統合アプリをアンインストールします。 また、Intune ポータル サイト アプリと Microsoft Authenticator アプリもアンインストールします。
    • ヒント

      他の SDK 統合アプリをアンインストールすると、独自のアプリの統合のみをテストできます。

  5. アプリケーションをインストールします。
  6. App Protection Policy を対象とするテスト アカウントを使用して、アプリケーションにログインします。
  7. Google Play からIntune ポータル サイトをインストールするように求められたことを確認します。
    • 注:

      テスト デバイスに Google Play ストア アプリがない場合は、別のアプリ ストアまたは Microsoft Web サイトからIntune ポータル サイトをインストールするように求められたことを確認します。

  8. ポータル サイトをインストールします。 ポータル サイトを起動したり、ポータル サイトにログインしたりする必要はありません。
  9. アプリに戻り、必要に応じてもう一度ログインします。
  10. [アクセスの取得] 画面が表示されることを確認します。 これは、SDK がこのアカウントのポリシーを正常に取得したことを示します。
  11. アプリの PIN を設定するように求めるメッセージが表示されます。 PIN を作成します。
  12. アプリケーションの周囲を移動し、スクリーンショットを撮ろうとします。 SDK にポリシーがあることを考えると、これはすべての画面で一貫してブロックする必要があります。
  13. マネージド アカウントをアプリケーションからログアウトします。
  14. ログインせずに可能な場合は、アプリケーションの周りを移動し、スクリーンショットを撮ろうとします。 アカウントが削除されたので、これはブロックしないでください。

これは、アプリがアカウントを適切に登録し、認証コールバックを登録し、アカウントの登録を解除したことを確認するための 最低限 のテストです。 次のテストを実行して、他の App Protection Policy 設定によってアプリケーションの動作がどのように変更されるかをより徹底的に検証します。

データ保護テスト

次のテストでは、App Protection Policy 内で構成された特定のデータ保護設定について説明します。 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. 構成済みの承認済みキーボードのインストールを求めるメッセージが表示され、現在のデバイス キーボードが開かないことを確認します。

データ転送テスト

データ転送設定は、管理対象アプリの入力と終了を制御する App Protection Policy データ保護機能のサブセットです。 他のアプリとの間でデータの送受信をサポートするほとんどのアプリでは、ローカルストレージまたはクラウドストレージとの間でデータを保存、データを開く機能もあります。 アプリにこれらの機能がある場合は、追加のサポートを実装する必要があります。 詳細については、「 アプリとデバイスまたはクラウドストレージの場所間のデータ転送を制限するためのポリシー 」を参照してください。

アプリは、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: アプリ参加機能 」を参照してください。

シナリオ アプリ保護ポリシー設定 サポート if..を実装する必要があります。
データのコピーを保存する 組織データのコピーを保存 アプリケーションは、ローカルストレージまたはクラウドストレージにデータを保存できます。
ストレージからデータを開く データを開いて組織ドキュメントに読み込む アプリケーションは、ローカルストレージまたはクラウドストレージからデータを開くことができます。
マネージド通知コンテンツ 組織のデータ通知 アプリには、通知内のユーザー データが含まれています。
バックアップと復元 Android バックアップ サービスへの組織データのバックアップ アプリは、Android のバックアップ機能とユーザー データを共有します。

条件付き起動テスト

条件付き起動設定は、構成可能なデバイス全体またはアプリ固有の条件に基づいてアプリへのアクセスを制限する App Protection Policy 機能のサブセットです。 これらの設定には、条件 ("最小 OS バージョン" など) とアクション ("アクセスのブロック" など) の両方が含まれます。 条件付き起動アクションには、次のいずれかを指定できます。

  • 警告: デバイスまたはアプリが条件に失敗すると、エンド ユーザーに警告ダイアログが表示されます。 すべてのアプリ データに引き続きアクセスできます。
  • アクセスをブロックする: デバイスまたはアプリが条件に失敗すると、エンド ユーザーに警告ダイアログが表示されます。 条件を満たすか、アプリからマネージド アカウントを削除するまで、アプリの入力とアプリ データへのアクセスは許可されません。
  • データのワイプ: デバイスまたはアプリが条件に失敗すると、マネージド アカウントに関連付けられているすべての企業データがワイプされます。 ユーザーは、データが削除される前に条件を満たす機会がありません。

一部の条件付き起動設定は、複数の値とアクションで構成できます。 例:

  • OS の最小バージョン、値が "10.0"、アクションが "Warn" に設定されています。
  • OS の最小バージョン、値 "9.0"、アクションが "アクセスのブロック" に設定されている
  • OS の最小バージョン、値 "8.0"、アクションは "データのワイプ" に設定されます。

このステージの統合手順を完了すると、アプリ ですべての条件付き起動機能がサポートされるようになりました。 テスト デバイスのようなポリシー項目を変更することで、条件付き起動機能について理解します。

  • 構成されたすべての条件付き起動設定を渡します。
  • 構成された条件付き起動設定が "Warn" アクションに設定され、失敗します。
  • 構成された条件付き起動設定が [アクセスのブロック] アクションに設定され、失敗します。
  • "データのワイプ" アクションに設定されている条件付き起動設定が失敗します。

トラブルシューティング

最初のポリシー アプリケーション テストのトラブルシューティング

上記の 最初のポリシー アプリケーション テスト の手順に従って、次の予期しない動作が発生する可能性があります。

マネージド アカウントでログインした後、ポータル サイトをインストールするように求められない (手順 7)

まず、Intune 管理センターにアクセスし、アプリ保護ポリシーがテスト アカウントを対象としていることをダブルチェックします。

次に、 の呼び出しと 実装MAMServiceAuthenticationCallbackのソース コードを二重チェックregisterAccountForMAMします。 この前者が適切なタイミングで呼び出されない場合や、後者が正しく有効なトークンを指定しなかった場合、ポータル サイトプロンプトは表示されません。

最後に、登録結果コードのログ (またはデバッグ) を確認するか、アカウントで明示的に呼び出 getRegisteredAccountStatus します。 NOT_LICENSEDなどのコードは、テスト アカウントの構成の問題を示している可能性があります。

ログイン後に [アクセスの取得] 画面が表示されませんでした (手順 10)

ポータル サイトが以前にインストールされていない場合は、[アクセスの取得] 画面を表示し、ポリシーを適切に適用するには、アプリケーションを再開または完全に再起動する必要がある場合があります。 これは、SDK 統合アプリがポータル サイト アプリ内でコードを活用する方法に基づいて予想される結果です。

アプリを再起動して再度ログインした後でも、[アクセスの取得] 画面が表示されない場合は、SDK がアカウントの登録またはアカウントのポリシーの取得に失敗している可能性があります。 ソース コードの の実装をダブルチェックしますMAMServiceAuthenticationCallback

ログイン後にアプリの PIN を設定または入力する画面が表示されませんでした (手順 11)

テスト デバイスには他の 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 が構成済みのポリシーを受け取ったかどうかを確認します。

次に、ポリシーが構成され、正しく取得された場合は、ポリシーが適用されているかどうかをチェックします。アプリがポリシーを受信または適用していません

アプリが別のマネージド アプリからデータを受信できない

アプリ と他の管理対象アプリの両方を対象とするアプリ保護ポリシー設定を確認します。 同じポリシーで両方のアプリをターゲットにすることをお勧めします。 アプリを対象とするポリシーには、"他のアプリからデータを受信する" が "ポリシーで管理されているアプリ" に設定されている必要があります。 他のアプリを対象とするポリシーを確認します。"他のアプリに組織データを送信する" が "なし" に設定されている場合、この動作が予想されます。

次の手順

上記のすべての 終了条件 を完了すると、アプリはシングル ID として正常に統合され、すべての基本的なアプリ保護ポリシーを適用できます。 以降のセクションである、ステージ 5: マルチ IDステージ 6: App Configurationおよびステージ 7: アプリ参加機能は、アプリの目的のアプリ保護ポリシーのサポートによっては、必要な場合と必要ない場合があります。 これらのセクションのいずれかがアプリに適用されるかどうかわからない場合は、 SDK 統合に関する重要な決定事項に関するページを参照してください。