Android 用 Microsoft Intune アプリ SDK を使用すると、Intune アプリ保護ポリシー (MAM ポリシーとも呼ばれます) をネイティブ Java/Kotlin Android アプリに組み込むことができます。 Intune マネージド アプリケーションは、Intune アプリ SDK と統合されます。 Intune 管理者は、Intune がアプリをアクティブに管理する場合、Intune で管理されるアプリにアプリ保護ポリシーを簡単に展開できます。
注:
このガイドは、いくつかの異なる段階に分かれています。 まず、「 統合の計画」を確認します。
ステージ 7: アプリ参加機能
ステージ目標
- Intune App SDK によって提供されるアプリ参加機能について説明します。
- アプリとユーザーに関連するアプリ参加機能を統合します。
- これらの機能の統合をテストします。
「アプリ参加機能」とは
この SDK 統合プロセスでは、開発者が記述する必要があるアプリ固有のコードの量を最小限に抑えることが試みられます。 SDK 統合の前の段階を正常に完了すると、ファイル暗号化、コピー/貼り付けの制限、スクリーンショットのブロック、データ転送の制限など、ほとんどのアプリ保護ポリシー設定がアプリで強制されます。
ただし、一部の設定を適切に適用するにはアプリ固有のコードが必要です。これらの設定は、アプリ参加機能と呼ばれます。 通常、SDK には、これらの設定を自動的に適用するためのアプリケーションのコードまたはエンド ユーザー シナリオに関する十分なコンテキストがないため、開発者が SDK API を適切に呼び出す必要があります。
アプリ参加機能は必ずしもオプションではありません。 アプリの既存の機能によっては、これらの機能が必要になる場合があります。 詳細については 、「SDK 統合に関する重要な決定事項」 を参照してください。
このガイドの前のステージでは、すでにいくつかのアプリ参加機能について説明しました:
- ステージ 5: マルチ ID で説明したマルチ ID。
- ステージ 6: 「App Configuration」で説明したアプリの構成。
このガイドの残りの部分では、アプリ参加機能の残りのセットについて説明します。
- ローカル ストレージまたはクラウド ストレージへのファイルの保存やクラウド ストレージからのファイルを開くことを制限するポリシーを適用します。
- 通知のコンテンツを制限するポリシーを適用します。
- バックアップ データを保護するポリシーを適用します。
- 画面キャプチャを制限するポリシーを適用する (アプリにカスタム画面キャプチャ コードがある場合)。
- アプリ保護 CA のサポート。
- SDK からの通知に登録します。
- カスタム アプリケーション テーマを適用します。
- Intune の信頼できる証明書を使用して、オンプレミスのエンドポイントへの信頼チェーンを確保します。
アプリへの参加機能の基本
AppPolicy インターフェイスには、特定のアクションが許可されているかどうかをアプリに通知する多くのメソッドが含まれています。
ほとんどのアプリ参加機能には、次のものが含まれます:
- アプリのコード内の適切な場所を特定して、アクションが許可されているかどうかをチェックする。
-
AppPolicyメソッドを呼び出して、現在構成されているポリシーに基づいて、アクションが許可されているかどうかをチェックします。 - 結果に応じて、アクションの完了を許可するか、アクションがブロックされている場合にアプリの動作を変更します。
AppPolicy インスタンスを取得するには、MAMPolicyManager メソッド (getPolicy(final Context context) や getPolicyForIdentityOID(final String oid) など) のいずれかを使用します。
AppPolicy の情報メソッド
AppPolicyのすべてのメソッドがアプリの参加機能に関連付けられているわけではありません。
一部のメソッドは情報提供を目的としており、SDK によってポリシーが自動的に適用されている場合でも、現在構成されているポリシーに関するアプリ データを提供します。
これらのメソッドは、特定のポリシーが構成されている場合に、アプリがカスタム ユーザー エクスペリエンスを提示する機会を提供するために存在します。
例: スクリーンショットがブロックされているかどうかを判断する
アプリに、ユーザーがスクリーンショットを撮ることを許可するコントロールがある場合、アプリ保護ポリシーによってスクリーンショットがブロックされる場合は、そのコントロールを無効にするか非表示にすることを検討してください。
アプリは MAMPolicyManager.getPolicy(currentActivity).getIsScreenCaptureAllowed() を呼び出すことによってチェックできます。
アプリとデバイスまたはクラウド ストレージの場所間のデータ転送を制限するためのポリシー
多くのアプリでは、エンド ユーザーがローカル ファイル ストレージ サービスやクラウド ストレージ サービスにデータを保存したり、開いたりすることができます。 Intune アプリ SDK を使用すると、IT 管理者は、アプリがデータを保存したり開いたりできる場所を制限することで、データの取得やデータの漏洩から保護できます。
注:
アプリで個人用またはクラウドの場所への直接の保存を許可している場合、またはアプリでデータを直接開くことが可能な場合は、この Intune アプリ SDK アプリ参加機能**を実装して、IT 管理者がこの保存と開きをブロックできるようにする必要があります。
デバイスまたはクラウド ストレージに保存する
getIsSaveToLocationAllowedForOID API は、構成されたポリシーに基づいて特定の ID に対して特定の場所への保存が許可されるかどうかをアプリに知らせます。
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 |
アプリは、アプリのプライベート ストレージ ではない 、デバイス上の外部ストレージの場所にデータを保存しています。 | この保存場所はクラウド サービスとは見なされず、常に null OID パラメーターと共に使用する必要があります。 |
PHOTO_LIBRARY |
アプリは Android ローカル写真ストレージにデータを保存しています。 | ローカル フォト ストレージはクラウド サービスとは見なされず、常に null OID パラメーターと共に使用する必要があります。 |
IMANAGE |
アプリはiManageにデータを保存しています。 | クラウド サービス認証と Microsoft Entra 認証の両方に使用されるアカウントの OID。 このアカウントが存在しない場合、または OID が不明な場合は、 null を使用します。 |
EGNYTE |
アプリは Egnyte にデータを保存しています。 | クラウド サービス認証と Microsoft Entra 認証の両方に使用されるアカウントの OID。 このアカウントが存在しない場合、または OID が不明な場合は、 null を使用します。 |
ACCOUNT_DOCUMENT |
アプリは、アプリ内のアカウントに関連付けられている場所にデータを保存しており、この表の特定のクラウドの場所の 1 つではありません。 この場所を使用して、マルチ ID アプリ内のアカウント間でデータを渡すことができるかどうかを判断します。 |
Microsoft Entra 認証に使用されるアカウントの OID。 このアカウントが存在しない場合、または OID が不明な場合は、 null を使用します。 |
OTHER |
アプリは、この表で指定されていない場所にデータを保存しています。それは ACCOUNT_DOCUMENTの条件を満たしていません。 |
oidはこの場所では評価されないため、nullする必要があります。 |
アプリの操作に必要な、または表示用に一時的にダウンロードされるプライベート アプリ ストレージに配置されるFilesは常に許可されます。チェック getIsSaveToLocationAllowedForOIDする必要はありません。
Do チェック SaveLocation.LOCAL for
- プライベート アプリ ストレージの外部に保存された Files。
- アプリの操作に不要なプライベート アプリ ストレージにダウンロードされた Files (たとえば、ユーザーがデバイスへのダウンロードを明示的に選択した場合)。
注:
保存ポリシーを確認するときは、 oid 保存先のクラウド サービスに関連付けられているアカウントの OID である必要があります (このアカウントは、保存するドキュメントを所有するアカウントと必ずしも同じではありません)。
ローカルまたはクラウドのストレージの場所からデータを開く
getIsOpenFromLocationAllowedForOID API は、構成されたポリシーに基づいて、特定の ID に対して特定の場所から開くことが許可されるかどうかをアプリに知らせます。
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 パラメーターが必要です。* ID タグ付きファイルの場合: oid ファイル所有者の ID である必要があります。* ID タグのないファイルの場合: oidnullにする必要があります。 |
PHOTO_LIBRARY |
アプリは Android ローカル写真ストレージからデータを開いています。 | ローカル フォト ストレージはクラウド サービスとは見なされず、常に null OID パラメーターと共に使用する必要があります。 |
ACCOUNT_DOCUMENT |
アプリがデータを開いているのは、アプリ内のアカウントに関連付けられている、この表に示されている特定のクラウドの場所の 1 つではありません。 この場所を使用して、マルチ ID アプリ内のアカウント間でデータを渡すことができるかどうかを判断します。 |
Microsoft Entra 認証に使用されるアカウントの OID。 このアカウントが存在しない場合、または OID が不明な場合は、 null を使用します。 |
OTHER |
アプリは、この表で指定されていない場所からデータを開いており、 ACCOUNT_DOCUMENTの条件を満たしていません。 |
oidはこの場所では評価されないため、nullする必要があります。 |
注:
オープン ポリシーをチェックする場合、oid は、開くファイルまたはクラウド サービスに関連付けられているアカウントの OID である必要があります (ドキュメントを開くアカウントと必ずしも同じではありません)。
ヒント
便宜上、SDK にはローカル ストレージ内のファイルの File パラメーターを受け取るメソッド AppPolicy.isOpenFromLocalStorageAllowedが用意されています。
ポリシーの適用に関して、このメソッドは AppPolicy.getIsOpenFromLocationAllowedForOID(OpenLocation.LOCAL, oid) の呼び出しと機能的には同じですが、Fileからのファイル所有者のoidの解析を処理する点が異なります。
共有のブロックされたダイアログ
SDK は、MAM ポリシーがデータ転送操作をブロックしたときにユーザーに通知するダイアログを提供します。
このダイアログは、 getIsSaveToLocationAllowedForOID または getIsOpenFromLocationAllowedForOID API 呼び出しの結果、保存/開く操作がブロックされるたびにユーザーに表示する必要があります。
ダイアログには汎用メッセージが表示され、閉じると呼び出し元の Activity に戻ります。
ダイアログを表示するには、次のコードを追加します。
MAMUIHelper.showSharingBlockedDialog(currentActivity)
ファイル共有を許可する
パブリック ストレージの場所への保存が許可されていない場合でも、アプリでは、 ファイルをアプリのプライベート ストレージ にダウンロードしてからシステム選択で開くことで、ユーザーがファイルを表示できるようにする必要があります。
通知内のコンテンツを制限するためのポリシー
単一 ID アプリの場合、Intune アプリ SDK の既定の動作は、アプリ保護ポリシーによって通知が制限されている場合にすべての通知をブロックしようとします。
SDK の既定の動作は制限されています。 SDK は、通知からマネージド コンテンツのみを削除することを目的とした "組織データをブロックする" 値を自動的に尊重することはできません。 マルチ ID アプリの場合、SDK は、どの通知にマネージド コンテンツが含まれているかを判断できません。
アプリで通知が表示され、それが複数の ID であるか、"組織データをブロックする" 値を尊重する必要がある場合は、通知を表示する前に、通知に関連付けられているアカウントの通知制限ポリシーをチェックする必要があります。
ポリシーが適用されているかどうかを確認するには、次の呼び出しを実行します。
NotificationRestriction notificationRestriction =
MAMPolicyManager.getPolicyForIdentityOID(notificationIdentityOid).getNotificationRestriction();
返される NotificationRestriction 列挙型の値は次のとおりです。
NotificationRestriction 列挙型 |
予期されるアプリの動作 |
|---|---|
BLOCKED |
アプリでは、このポリシーに関連付けられているアカウントの通知を表示 してはなりません 。 単一 ID アプリの場合、Intune アプリ SDK はすべての通知を自動的にブロックし、追加のコードは必要ありません。 |
BLOCK_ORG_DATA |
アプリは、organization データを含まない変更された通知を表示する必要があります。 |
UNRESTRICTED |
アプリにすべての通知が表示されます。 |
アプリが getNotificationRestriction を適切に呼び出さない場合、MAM SDK は 単一 ID アプリに対してのみ通知を自動的に制限する最善の努力を行います。
この場合、 BLOCK_ORG_DATA は BLOCKED と同じように処理され、通知はまったく表示されません。
よりきめ細かい制御を行うには、getNotificationRestrictionの値をチェックし、アプリの通知を適切に変更します。
バックアップ データを保護するためのポリシー
Intune アプリ SDK は、Android の組み込みのバックアップと復元機能へのデータのアップロードをブロックできます。 Androidでのバックアップと復元の詳細については、 Android APIガイド と、 バックアップと復元の変更でAndroid S / 12で導入された変更を参照してください。
アプリの自動バックアップ
Android M 以降、Android では、アプリのターゲット API に関係なく、アプリの Google ドライブへの 自動完全バックアップ が提供されます。
Intune では、XML でカスタム ルールを定義する機能など、Android が提供するすべての自動バックアップ機能を使用し、特定の Intune 統合ガイダンスを使用して、データ保護を確実に適用できます。
アプリのマニフェストでのバックアップ動作の構成
既定では、「バックアップの有効化と無効化」で説明されているように、android:allowBackup は true に設定されます。
アプリに完全バックアップと復元機能が必要ない場合は、 android:allowBackup を false に設定します。
この場合、それ以上の操作は必要ありません。企業データはアプリ内に残ります。
アプリにフル バックアップと復元機能が必要な場合は、 android:allowBackup を true に設定して、次の手順を実行します。
アプリで独自のカスタム
BackupAgentを使用しない場合は、既定の MAMBackupAgent を使用して、ポリシーに準拠した自動完全バックアップを有効にしIntune。 アプリ マニフェストに次を配置します。<application ... android:fullBackupOnly="true" android:backupAgent="com.microsoft.intune.mam.client.app.backup.MAMDefaultBackupAgent" ...> </application>省略可能。 カスタム
BackupAgentを実装する場合は、 MAMBackupAgent または MAMBackupAgentHelper を使用する必要があります。 次のセクションを参照してください。 手順 1 で説明した Intune の MAMDefaultBackupAgent に切り替えることを検討してください。これにより、Android M 以降で簡単にバックアップできます。アプリが受け取る完全バックアップの種類 (フィルター処理なし、フィルター処理済み、なし) を決定する場合は、属性
android:fullBackupContentをtrue、false、またはアプリ内の XML リソースに設定します。次に、
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 に制限されています。 キー/値バックアップを使用する場合は、 BackupAgentHelper または BackupAgentを使用する必要があります。
BackupAgentHelper
BackupAgentHelper は、ネイティブ Android 機能と Intune MAM 統合の両方の点で、BackupAgent よりも実装が簡単です。
BackupAgentHelper を使用すると、開発者はファイル全体と共有設定を FileBackupHelper と SharedPreferencesBackupHelper (それぞれ) に登録し、作成時に BackupAgentHelper に追加できます。
Intune MAM で BackupAgentHelper を使用するには、次の手順を実行します。
BackupAgentHelperでマルチ ID バックアップを使用するには、BackupAgentHelper の拡張に関する Android ガイドに従います。クラスに、BackupAgentHelper、FileBackupHelper、および SharedPreferencesBackupHelper と同等の MAM を拡張します。
| Android クラス | MAM と同等 |
|---|---|
BackupAgentHelper |
MAMBackupAgentHelper |
FileBackupHelper |
MAMFileBackupHelper |
SharedPreferencesBackupHelper |
MAMSharedPreferencesBackupHelper |
これらのガイドラインに従うことで、マルチ ID のバックアップと復元を正常に実行できます。
BackupAgent
BackupAgentを使用すると、バックアップされるデータについてより明確にすることができます。 実装は開発者に責任があるため、Intune から適切なデータ保護を確保するには、さらに多くの手順が必要です。 作業のほとんどは開発者の責任であるため、Intune の統合はやや複雑になります。
MAM の統合:
キー/値バックアップ、特に BackupAgent の拡張に関する Android ガイドをよく読んで、BackupAgent の実装が Android ガイドラインに従っていることを確認してください。
クラスに MAMBackupAgent を拡張させます。
マルチ ID バックアップ:
バックアップを開始する前に、バックアップする予定のファイルまたはデータ バッファーが、複数の ID のシナリオでのバックアップが IT 管理者によって許可されていることをチェックします。 MAMFileProtectionManager および MAMDataProtectionManager で
isBackupAllowedを使用して、この動作を判断します。 ファイルまたはデータ バッファーのバックアップが許可されていない場合は、バックアップに含めないでください。バックアップ中のある時点で、手順 1. でチェックに入れたファイルの ID をバックアップする場合は、データを抽出する予定のファイルで
backupMAMFileIdentity(BackupDataOutput data, File … files)を呼び出す必要があります。 この方法では、自動的に新しいバックアップ エンティティが作成され、BackupDataOutputに書き込まれます。 これらのエンティティは、復元時に自動的に消費されます。
複数 ID の復元: データバックアップガイドでは、アプリケーションのデータを復元するための一般的なアルゴリズムを指定し、 BackupAgent の拡張 セクションにコードサンプルを示します。 複数の ID のリストアを正常に実行するには、以下の点に特に注意して、このコード サンプルの一般的な構造に従う必要があります。
バックアップ エンティティを通過するには、
while(data.readNextHeader())* ループを使用する必要があります。data.getKey()onBackupで記述したキーと一致しない場合はdata.skipEntityData()を呼び出す必要があります。 この手順を使用しないと、復元が成功しない可能性があります。この場合、自動的に書き込むエンティティは失われるため、
while(data.readNextHeader())* コンストラクトでバックアップ エンティティを使用している間は戻らないようにしてください。
- ここで、
dataは復元時にアプリが受け取る MAMBackupDataInput のローカル変数名です。
カスタム画面Capture制限
Android のWindowレベルのFLAG_SECURE制限をバイパスするカスタム スクリーン キャプチャ機能がアプリに含まれている場合、機能へのフル アクセスを許可する前に画面キャプチャ ポリシーチェック必要があります。
たとえば、アプリでカスタム レンダリング エンジンを使用して現在のビューを PNG ファイルにレンダリングする場合は、最初にチェック AppPolicy.getIsScreenCaptureAllowed()する必要があります。
注:
アプリにカスタムまたは Microsoft 以外のスクリーン キャプチャ機能が含まれていない場合、スクリーン キャプチャを制限するための操作は必要ありません。
スクリーン キャプチャ ポリシーは、すべての MAM 統合アプリに対して Window レベルで自動的に適用されます。
OS または別のアプリがアプリ内の Window をキャプチャしようとする試みは、必要に応じてブロックされます。
たとえば、ユーザーが Android の組み込みのスクリーンショットまたは画面録画機能を使用してアプリの画面をキャプチャしようとした場合、アプリの参加なしにキャプチャは自動的に制限されます。
アプリ保護 CA のサポート
アプリ保護 CA (条件付きアクセス) は、アプリベースの CA とも呼ばれ、リソースへのアクセスを制限します。 Intune アプリ保護ポリシーは、これらのリソースにアクセスする前にアプリケーションを管理する必要があります。 Microsoft Entra ID は、条件付きアクセスで保護されたリソースにアクセスするためのトークンを付与する前に、アプリが Intune アプリ保護ポリシーに登録し、それらによって管理されるように要求することで、このポリシーを適用します。
注:
アプリ保護 CA のサポートには、Microsoft 認証ライブラリ (MSAL) バージョン 1.0.0 以降が必要です。
MSAL に対する非準拠を処理する
アプリがアカウントのトークンを取得すると、MSAL ライブラリは、アプリの保護ポリシー管理に準拠していないことを示す MsalIntuneAppProtectionPolicyRequiredException を返すかスローする場合があります。
コンプライアンスの修復に使用するために、例外からさらに多くのパラメーターを抽出できます ( MAMComplianceManager を参照してください)。
修復が成功した後、アプリは MSAL を使用してトークンの取得を再度試行できます。
MAMComplianceManager
MAMComplianceManager インターフェイスは、ポリシーが必要なエラーを MSAL から受信した場合に使用されます。
これには、アプリを準拠状態にするために呼び出す必要がある [remediateCompliance] メソッドが含まれています。
MAMComplianceManager への参照は次のように取得できます。
MAMComplianceManager mgr = MAMComponents.get(MAMComplianceManager.class);
// make use of mgr
返される MAMComplianceManager インスタンスは、 nullされないことが保証されます。
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が要求されたトークンを付与するための条件を満たすために、アプリを管理しようとします。
最初の 4 つのパラメーターは、MSAL AuthenticationCallback.onError() メソッドが受け取る例外から抽出できます。
最後のパラメーターは、コンプライアンスの試行中に表示されるユーザー エクスペリエンスを制御するブール値です。
remediateCompliance 単純なブロック進行状況ダイアログが表示されるため、この操作中にアプリがカスタマイズしたエクスペリエンスを表示する必要はありません。
このダイアログは、コンプライアンス修復の進行中にのみ表示されます。 最終結果は表示されません。
アプリは、コンプライアンス修復試行の成功または失敗を処理するために、 COMPLIANCE_STATUS 通知のレシーバーを登録できます。
詳細については 、「コンプライアンス状態の通知」 を参照してください。
remediateCompliance() コンプライアンスの確立の一環として MAM 登録を開始する場合があります。
登録通知の通知レシーバーを登録済みの場合、アプリは登録通知を受け取る可能性があります。
アプリの登録済み MAMServiceAuthenticationCallback には、登録のトークンを取得するために呼び出される acquireToken() メソッドがあります。
acquireToken() は、アプリが独自のトークンを取得する前に呼び出されます。 トークンの取得が成功した後にアプリが実行する簿記またはアカウント作成タスクがまだ行われていない可能性があります。
この場合、コールバックはトークンを取得できる必要があります。
acquireToken() からトークンを返せない場合、コンプライアンス修復の試行は失敗します。
要求されたリソースの有効なトークンを使用して後で updateToken を呼び出すと、指定されたトークンを使用してコンプライアンス修復が直ちに再開されます。
注:
サイレント トークンの取得は、MsalIntuneAppProtectionPolicyRequiredException例外が発生する前に、ブローカーをインストールしてデバイスを登録するようにユーザーに既にガイドされているため、acquireToken()でも可能です。
このプロセスにより、ブローカーはキャッシュに有効な更新トークンを保持し、要求されたトークンを暗黙的に取得できます。
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() メソッドによってローカライズされた文字列が返されます。アプリでは、エンド ユーザーの選択に応じてその文字列を表示できます。
アプリは、ほとんどのエラーケースを解決できません。 通常は、アカウントの作成またはサインインは失敗し、ユーザーが後で再試行できるようにします。
エラーが継続的に発生する場合は、ポータル サイト ログが原因の特定に役立つ場合があります。 エンド ユーザーはログを送信できます。 詳細については、「 ログのアップロードとメール送信」を参照してください。
匿名クラスを使用して 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() を呼び出す前に通知レシーバーを登録する必要があります。
App Protection CA のサポートの宣言
アプリでアプリ CA の修復を処理する準備ができたら、アプリがアプリ CA の準備が完了していることを Microsoft ID に伝えることができます。 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"
}
}
]
}
手順が完了したら、「 App Protection CA の検証」に進みます。
実装に関するメモ
注:
アプリの MAMServiceAuthenticationCallback.acquireToken() メソッドは、forceRefresh フラグがacquireTokenSilentAsync()されるように false を渡す必要があります。
AcquireTokenSilentParameters acquireTokenSilentParameters =
builder.withScopes(Arrays.asList(scopes))
.forceRefresh(false)
.build();
acquireTokenSilentAsync(acquireTokenSilentParameters);
注:
修復の試行中にカスタム ブロック UX を表示する場合は、showUX パラメーターに false を渡して remediateCompliance()する必要があります。
remediateCompliance() を呼び出す前に、まず UX を表示し、通知リスナーを登録する必要があります。
これにより、 remediateCompliance() がすぐに失敗した場合に通知を見逃す可能性がある競合状態が回避されます。
たとえば、Activity サブクラスの onCreate() メソッドまたは onMAMCreate() メソッドは、通知リスナーを登録してから remediateCompliance() を呼び出すのに理想的な場所です。
remediateCompliance() のパラメーターは、インテント スペルとして UX に渡すことができます。
コンプライアンス・ステータス通知を受信したら、結果を表示するか、アクティビティーを終了できます。
注:
remediateCompliance() アカウントを登録し、登録を試みます。 メイン トークンを取得したら、 registerAccountForMAM() を呼び出す必要はありませんが、呼び出しても問題はありません。
一方、アプリがトークンの取得に失敗してユーザー アカウントを削除する場合は、 unregisterAccountForMAM() を呼び出してアカウントを削除し、バックグラウンド登録の再試行を防ぐ必要があります。
SDK からの通知に登録する
Intune アプリ SDK ガイドでは、アプリで SDK からの通知の登録が必要になる可能性がある次のようないくつかのシナリオについて説明します。
-
WRONG_USERを処理するマルチ ID アプリ (「マネージド ID とアンマネージド ID」を参照) -
MANAGEMENT_REMOVEDを処理するマルチ ID アプリ (データ バッファ保護を参照)。 -
WIPE_USER_DATAまたはWIPE_USER_AUXILIARY_DATAを処理するマルチ ID アプリ (「セレクティブ ワイプ」を参照)。 - アプリ構成処理
REFRESH_APP_CONFIGを実装するアプリ ( 「SDK からのアプリ構成の取得」を参照)。
このセクションでは、SDK が送信できるすべての種類の通知、アプリケーションがリッスンするタイミングと理由、および通知レシーバーを実装する方法について説明します。
通知の種類
すべての SDK 通知は、 MAMNotificationType 列挙型を返す 1 つの関数 getType() を持つ MAMNotification インターフェイスを実装します。
ほとんどの通知は MAMUserNotification インスタンスであり、1 つの ID に固有の情報を提供します。 ID の OID は getUserOid() 関数を使用して取得でき、ID の UPN は getUserIdentity() を使用して取得できます。
MAMEnrollmentNotification と MAMComplianceNotification はさらに MAMUserNotification を拡張し、それぞれ、ユーザーまたはデバイスを MAM サービスに登録しようとする試行の結果と、App Protection CA のコンプライアンスを修復しようとする試行の結果を含みます。
| 通知の種類 | 通知クラス | 通知の理由 | 適用対象 | 取り扱いのヒント | スレッド情報 |
|---|---|---|---|---|---|
COMPLIANCE_STATUS |
MAMComplianceNotification |
コンプライアンス修復試行の結果を返します。 | App Protection 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 |
ワイプがもうすぐ発生します (*)。 | マルチ ID アプリのみがこれを受け取ります。MAMDataProtectionManagerを使用するアプリでは、この処理WIPE_USER_DATAを処理する必要があります。 |
セレクティブ ワイプを参照してください。 | UI スレッド上にない |
WIPE_COMPLETED |
MAMUserNotification |
ワイプが完了しました。 | すべてのアプリに対して省略可能です。 |
WIPE_USER_DATAまたはWIPE_USER_AUXILIARY_DATA後に配信されます。アプリがワイプ ハンドラーからエラーを報告した場合、この通知は送信されません。 |
UI スレッド上にない |
(*)ワイプは次のような多くの理由で発生する可能性があります。
- unregisterAccountForMAM という名前のアプリ。
- IT 管理者がリモート ワイプを開始しました。
- 管理が必要な条件付きアクセス ポリシーが満たされませんでした。
警告
アプリは、 WIPE_USER_DATA 通知と WIPE_USER_AUXILIARY_DATA 通知の両方に登録しないでください。
MANAGEMENT_REMOVED
MANAGEMENT_REMOVED通知は、以前にポリシーで管理されたアカウントが管理されなくなることをアプリに通知します。
アカウントが管理解除されると、アプリはそのアカウントの暗号化されたファイルの読み取り、 MAMDataProtectionManager で暗号化されたアカウントのデータの読み取り、暗号化されたクリップボードの操作、マネージド アプリのエコシステムへの参加などできなくなります。
これには、ユーザー データをワイプしたり、ユーザーをサインアウトしたりする必要はありません (ワイプが必要な場合は、 WIPE_USER_DATA 通知が送信されます)。
多くのアプリではこの通知を処理する必要がない可能性がありますが、 MAMDataProtectionManager を使用するアプリではこれを処理する必要があります。
詳細については、「 データ バッファ保護 」を参照してください。
SDK がアプリの MANAGEMENT_REMOVED レシーバーを呼び出すときは、次のようになります。
SDK は、アプリに属する以前に暗号化されたファイル (ただし、保護されたデータ バッファーではない) を既に復号化しています。 アプリに直接属していない SD カード上のパブリックな場所 (ドキュメント フォルダーやダウンロード フォルダーなど) にある Files は復号化されません。
レシーバー メソッドによって作成される新しいファイルまたは保護されたデータ バッファー (またはレシーバーの起動後に実行されるその他のコード) は暗号化されません。
アプリは引き続き暗号化キーにアクセスできるため、データ バッファーの暗号化解除などの操作は成功します。
アプリのレシーバーが戻った後は、暗号化キーにアクセスできなくなります。
MAMNotificationReceiver の実装
SDK からの通知に登録するには、アプリで MAMNotificationReceiver を作成し、 それを MAMNotificationReceiverRegistry に登録する必要があります。
受信者を登録するには、受信者で registerReceiver を呼び出し、 Application.onCreate メソッドで目的の通知の種類を指定します。
@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 実装を作成できます。 このような場合は、両方を同じ通知の種類に登録する必要があります。
ヒント
コールバックが UI スレッドでは実行されないため、 MAMNotificationReceiver.onReceive でブロックしても安全です。
カスタム テーマ
カスタム テーマは、Intune アプリ SDK に提供できます。このカスタム テーマは、すべての SDK 画面とダイアログに適用されます。 テーマが指定されていない場合は、既定の SDK テーマが使用されます。
カスタム テーマの提供
テーマを指定するには、 Application.onMAMCreate メソッドで次のコード行を追加します。
MAMThemeManager.setAppTheme(R.style.AppTheme);
この例では、 R.style.AppTheme を SDK が適用するスタイル テーマに置き換えます。
信頼されたルート証明書の管理
アプリケーションで、内部 Web サイトやアプリケーションへの安全なアクセスを提供するためにオンプレミスまたはプライベート証明機関によって発行された SSL/TLS 証明書が必要な場合、Intune アプリ SDK には、API クラス MAMTrustedRootCertsManager と MAMCertTrustWebViewClient を使用した証明書信頼管理のサポートが追加されています。
注:
MAMCertTrustWebViewClient は、Android 10 以降をサポートしています。
信頼されたルート証明書の管理では、以下のサポートが提供されます。
- SSLContext
- SSLSocketFactory
- TrustManager
- WebView
要件
- 信頼されたルート証明書の管理には、モバイル アプリケーション管理ライセンスの Microsoft トンネルが必要です。 詳細については、「 モバイル アプリケーション管理を使用した Microsoft トンネル」を参照してください。
- Intune App Configuration ポリシーを構成して、信頼されたルート証明書を Android 上の基幹業務アプリと Microsoft Edge に配信します。 参照: Microsoft Intune に登録していない Android デバイスで Microsoft Tunnel VPN を使用する。
注:
信頼されたルート証明書管理は、Microsoft Tunnel VPN Gateway とは別に使用できますが、使用するには Microsoft MAM トンネルのライセンスを取得する必要があります。
Intune の信頼されたルート証明書を使用してトラスト アンカーを確立する
信頼されたルート証明書の管理を使用すると、アプリは、Intune の信頼されたルート証明書とデバイスの証明書を組み合わせて使用することができます。
API クラス MAMTrustedRootCertsManager および MAMCertTrustWebViewClient は、デバイスの信頼されたルート証明書ストアに、オンプレミス リソースへのセキュリティで保護された接続を確立するために必要な信頼されたルート証明書が含まれていない場合に、App Configuration Policy を介して配信される Intune の信頼されたルート証明書をフォールバック オプションとして使用します。 これにより、アプリはデバイス証明書と Intune 証明書の両方を使用して、信頼できるソースとの安全な接続と通信を検証できます。
ネットワーク セキュリティ設定を強化するために、アプリでネットワーク セキュリティ構成 XML ファイルを使用できます。 信頼されたルート証明書の管理では、アプリのネットワーク セキュリティ構成 XML に次の機能があるかどうかを確認することで、この追加のセキュリティが優先されます。
- 自己署名証明書などの追加の CA を持つカスタム トラスト アンカー。
- 信頼された CA を制限するためのドメイン固有のルール。
- 特定のドメインの証明書のピン セット。
注:
Android ネットワーク セキュリティ構成の詳細については、「 ネットワーク セキュリティ構成」を参照してください。
信頼がチェックされているドメインにこれらのいずれかが当てはまる場合、信頼されたルート証明書の管理は、このドメインのカスタム信頼チェックをスキップし、プラットフォームの既定の信頼マネージャーのみにチェックを実行させます。
クラス MAMTrustedRootCertsManager
このクラスは、以下の API を提供します。
-
createSSLContextForOID(String oid, String protocol): 指定された ID と指定された SSL/TLS プロトコルに対して信頼されたルート証明書を使用するSSLContextオブジェクトを作成します。 このクラスから返されるSSLContextオブジェクトは、デバイスと MAM サービスからの信頼されたルート証明書を組み合わせて使用するX509TrustManagerオブジェクトで既に正しく初期化されています。 -
createSSLSocketFactoryForOID(String oid, String protocol): 指定された ID と指定された SSL/TLS プロトコルに対して信頼されたルート証明書を使用するSSLSocketFactoryオブジェクトを作成します。 返されるSSLSocketFactoryオブジェクトは、このクラスの同じSSLContextオブジェクトから参照されます。 -
createX509TrustManagersForOID(String oid): 指定された ID に対してデバイスと MAM サービスからの信頼されたルート証明書を組み合わせて使用するX509TrustManagerオブジェクトの配列を作成します。
注:
oid パラメーターは、アプリケーションを実行する特定のユーザーのMicrosoft Entraユーザー ID (OID) であることが想定されます。 ユーザー識別子が事前に不明な場合は、値 null を渡すと、MAM はこれらの API が呼び出されたスレッドまたはプロセスから正しい ID の検出を試みます。 MAM が ID を検出するには、プロセスまたはスレッドに ID を正しく設定する必要があります。 プロセスまたはスレッドにアクティブ ID を設定する方法の詳細については、「 ステージ 5: マルチ ID」を参照してください。
注:
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のカスタム実装を提供します。 このクラスは、WebView で SSL エラー android.net.http.SslError.SSL_UNTRUSTEDを処理する方法を提供します。
エラーを処理するとき、クラスは、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 の場合、このフラグを含めないでください。
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()を呼び出す必要があります。
終了条件
詳細については、「テストを容易にするために 、ポリシーを変更してすばやくテストする」 を参照してください。
保存と開く制限の検証
アプリとデバイスまたはクラウド ストレージの場所間のデータ転送を制限するポリシーを実装していない場合は、このセクションをスキップしてください。
アプリがクラウド サービスまたはローカル データにデータを保存し、クラウド サービスまたはローカル データからデータを開くことができるすべてのシナリオについて理解し直します。
わかりやすくするために、これらのテストでは、アプリ内の 1 つの場所から OneDrive にデータを保存したり開いたりする機能のみがアプリに含まれていることを前提としています。 ただし、すべての組み合わせを検証する必要があります。アプリでデータを保存できるすべての場所に対してサポートされているすべての保存場所、およびアプリがデータを開くことを許可しているすべての場所に対してサポートされているすべての開いている場所。
これらのテストでは、アプリと Intune ポータル サイトをインストールします。テストを開始する前に、マネージド アカウントでサインインします。 また、
- マネージド アカウントのポリシーを次のように設定します。
- [組織データを他のアプリに送信する] を [ポリシーで管理されるアプリ] に設定します。
- [他のアプリからデータを受信する] を [ポリシーで管理されるアプリ] に設定します。
| シナリオ | 前提条件 | 手順 |
|---|---|---|
| 保存先、完全許可 | "組織データのコピーを保存する" ポリシーが [許可] に設定されている | - OneDrive にデータを保存できるアプリの部分に移動します。 - アプリにログインしているのと同じ管理対象アカウントを使用して、ドキュメントを OneDrive に保存します。 - 保存が許可されていることを確認します。 |
| 保存先、除外 | - 「組織データのコピーを保存する」ポリシーが「ブロック」に設定されている - 「ユーザーが選択したサービスにコピーを保存することを許可する」ポリシーが OneDrive のみに設定されます |
- OneDrive にデータを保存できるアプリの部分に移動します。 - アプリにログインしているのと同じ管理対象アカウントを使用して、ドキュメントを OneDrive に保存します。 - 保存が許可されていることを確認します。 - アプリで許可されている場合は、ファイルを別のクラウド ストレージの場所に保存して、ブロックされていることを確認します。 |
| 保存先、ブロック | "組織データのコピーを保存する" ポリシーが [ブロック] に設定されている | - OneDrive にデータを保存できるアプリの部分に移動します。 - アプリにログインしているのと同じ管理対象アカウントを使用して、ドキュメントを OneDrive に保存します。 - 保存がブロックされていることを確認します。 - アプリで許可されている場合は、ファイルを別のクラウド ストレージの場所に保存して、ブロックされていることを確認します。 |
| オープン、完全許可 | [組織のドキュメントにデータを開く] ポリシーが [許可] に設定されます | - OneDrive からデータを開くことができるアプリの部分に移動します。 - アプリのストレージにログインしているのと同じ管理対象アカウントを使用して、OneDrive からドキュメントを開くことを試みます。 - オープンが許可されていることを確認します。 |
| Open from, exempted | - 「組織のドキュメントにデータを開く」ポリシーを「ブロック」に設定 - 「ユーザーが選択したサービスのデータを開けるようにする」ポリシーが OneDrive のみに設定されます |
- OneDrive からデータを開くことができるアプリの部分に移動します。 - アプリのストレージにログインしているのと同じ管理対象アカウントを使用して、OneDrive からドキュメントを開くことを試みます。 - オープンが許可されていることを確認します。 - アプリで許可されている場合は、別のクラウド ストレージの場所から別のファイルを開き、ブロックされていることを確認します。 |
| 開く、ブロック | "組織のドキュメントにデータを開く" ポリシーを [ブロック] に設定する | - OneDrive からデータを開くことができるアプリの部分に移動します。 - アプリのストレージにログインしているのと同じ管理対象アカウントを使用して、OneDrive からドキュメントを開くことを試みます。 - オープンがブロックされていることを確認します。 - アプリで許可されている場合は、別のクラウド ストレージの場所から別のファイルを開き、ブロックされていることを確認します。 |
通知の制限の検証
通知内のコンテンツを制限するためのポリシーを実装していない場合は、このセクションをスキップしてください。
アプリ保護ポリシーに関する限り、アプリケーションは 3 種類の通知を起動する可能性があります。
- アカウント データを含まない通知。
- マネージド アカウントに属するデータを含む通知。
- 管理されていないアカウントに属するデータを含む通知。
アプリケーションが単一 ID の場合、唯一のアカウントが管理されていない場合は保護が適用されないため、最初の 2 つだけが関連します。
異なるポリシー値を構成して 3 種類すべての通知をトリガーすることで、通知の制限を検証できます。
これらのテストでは、アプリと Intune ポータル サイトをインストールします。テストを開始する前に、マネージド アカウントでサインインします。 アプリが複数 ID の場合は、アンマネージド アカウントを使用してアプリにもサインインします。
| シナリオ | 前提条件 | 手順 |
|---|---|---|
| すべてのコンテンツがブロックされています | "組織のデータ通知" ポリシーが [ブロック] に設定されている | - アプリをトリガーして、アカウント データなしで通知を生成します。 - 通知にコンテンツが表示されていないことを確認します。 - アプリが管理対象アカウントのデータを使用して通知を起動するようにトリガーします。 - 通知にコンテンツが表示されていないことを確認します。 - アンマネージド アカウントのデータを使用して通知を発行するようにアプリをトリガーします。 - 通知にコンテンツが表示されていないことを確認します。 |
| コンテンツの一部がブロックされました | "組織データ通知" ポリシーが [組織データをブロック] に設定されている | - アプリをトリガーして、アカウント データなしで通知を生成します。 - 通知に全内容が表示されていることを確認します。 - アプリが管理対象アカウントのデータを使用して通知を起動するようにトリガーします。 - 通知によって管理対象アカウントの内容が編集されていることを確認します。 - アンマネージド アカウントのデータを使用して通知を発行するようにアプリをトリガーします。 - 通知に全内容が表示されていることを確認します。 |
| コンテンツ ブロックなし | "組織のデータ通知" ポリシーが [許可] に設定されている | - アプリをトリガーして、アカウント データなしで通知を生成します。 - 通知に全内容が表示されていることを確認します。 - アプリが管理対象アカウントのデータを使用して通知を起動するようにトリガーします。 - 通知に全内容が表示されていることを確認します。 - アンマネージド アカウントのデータを使用して通知を発行するようにアプリをトリガーします。 - 通知に全内容が表示されていることを確認します。 |
データのバックアップと復元の検証
バックアップ データを保護するためのポリシーを実装していない場合は、このセクションをスキップしてください。
アプリがバックアップ用に構成したコンテンツ (ファイルおよびキーと値のペア) について理解を深めます。 想定されるコンテンツだけが復元に含まれていることを検証する必要があります。 復元に余分なコンテンツがあると、データ漏洩の原因になる可能性があります。
これらのテストでは、アプリと Intune ポータル サイトをインストールします。テストを開始する前に、マネージド アカウントでサインインします。 アプリがマルチ ID の場合は、アンマネージド アカウントでもアプリにサインインします。
Android の公式手順に従ってバックアップをテストします。 これらの手順は、自動バックアップとキー/値バックアップでは異なるため、厳密に従ってください。
ポリシーに対するカスタム スクリーン キャプチャの検証
Custom Screen Capture Restrictions を実装していない場合は、このセクションをスキップしてください。
アプリケーションに Android の Windowレベル FLAG_SECUREをバイパスする機能がある場合は、この機能がアプリ保護ポリシーのスクリーン キャプチャ制限によってブロックされていることを検証します。
これらのテストでは、アプリと Intune ポータル サイトをインストールします。テストを開始する前に、マネージド アカウントでサインインします。
| シナリオ | 前提条件 | 手順 |
|---|---|---|
| スクリーン キャプチャがブロックされました | "画面キャプチャと Google アシスタント" ポリシーが [ブロック] に設定されている | - カスタム FLAG_SECURE コードを使用するアプリの部分に移動します。- その機能の使用を試みます。 - 機能がブロックされていることを確認します。 |
| 画面キャプチャは許可されています | "画面キャプチャと Google アシスタント" ポリシーが [許可] に設定されている | - カスタム FLAG_SECURE コードを使用するアプリの部分に移動します。- その機能の使用を試みます。 - 機能が許可されていることを確認します。 |
アプリ保護の検証 CA
サポート アプリ保護 CA を実装していない場合は、このセクションをスキップしてください。
アプリ保護ポリシーを作成してアプリとテスト アカウントに割り当てる一般的な検証手順に加えて、アプリ保護条件付きアクセス ポリシーを作成してテスト アカウントに割り当てる必要もあります。 詳細については、「Intune でアプリベースの条件付きアクセス ポリシーを設定する」を参照してください。
テスト手順:
- このテストを開始する前に、Microsoft Authenticator と Intune ポータル サイトをアンインストールしてください。
- アプリをインストールします。
- アプリ保護ポリシーとアプリベースの CA ポリシーの両方の対象となるテスト アカウントを使用してアプリにサインインします。
- アプリで、ポータル サイトをインストールするように求められていることを確認します。
- もう一度サインインします。
- デバイスの登録を求めるプロンプトが表示されることを確認します。 画面の指示に従います。 アプリで登録がここで求められない場合は、まずテスト デバイスで他の SDK 対応アプリ、ポータル サイト、および Authenticator がアンインストールされていることを確認してください。 それでもプロンプトが表示されない場合は、実装手順を再確認してください。
- 登録後、すべてのアプリ データにアクセスできることを確認します。
通知受信者の検証
SDK からの通知に登録を実装していない場合は、このセクションをスキップしてください。
検証手順は、アプリが登録した通知の種類によって異なります。 すべての種類の通知について、ログを追加して、レシーバーが適切に呼び出されるようにします。
MAM_ENROLLMENT_RESULT アプリ保護ポリシーの対象となるアカウントでアプリケーションにサインインすることでトリガーできます。
テスト アカウントを対象とするそれぞれの App Configuration ポリシーとアプリ保護ポリシーを更新し、SDK が更新されたポリシーを受け取るのを待つことで、REFRESH_APP_CONFIGとREFRESH_POLICYをトリガーできます。
ヒント
このプロセスを高速化するには、「 ポリシーを変更して迅速にテストする」 を参照してください。
Microsoft Intuneから選択的ワイプを発行することで、MANAGEMENT_REMOVED、WIPE_USER_DATA、WIPE_USER_AUXILIARY_DATA、WIPE_COMPLETED の通知をトリガーできます。
カスタム テーマの検証
カスタム テーマを実装していない場合は、このセクションをスキップしてください。
カスタム テーマのサポートは、SDK のダイアログで色を調べることで検証できます。 チェックするのが最も簡単なダイアログは、MAM PIN 画面です。
前提条件:
- マネージド アカウントのポリシーを次のように設定します。
- [アクセス用 PIN] を [必須] に設定します。
- アプリと Intune ポータル サイトをインストールします。
テスト手順:
- アプリケーションを起動し、テスト アカウントでサインインします。
- [MAM PIN] 画面が表示され、SDK に指定したカスタム テーマに基づいてテーマ設定されていることを確認します。
次の手順
このガイドに順番に従って、この記事で前述したすべての終了条件を完了した場合、アプリは Intune アプリ SDK と完全に統合され、アプリ保護ポリシーを適用できます。 前述のアプリ参加セクション「ステージ 5: マルチ ID」と「ステージ 6: App Configuration」のいずれかをスキップし、アプリがこれらの機能をサポートする必要があるかどうかわからない場合は、「SDK 統合に関する重要な決定事項」を再確認してください。
アプリ保護は、アプリの主要なシナリオになりました。 引き続きこのガイドと 付録 を参照しながら、アプリの開発を進めてください。