Android용 Microsoft Intune 앱 SDK 개발자 가이드Microsoft Intune App SDK for Android developer guide

참고

먼저 SDK의 현재 기능 및 지원되는 각 플랫폼에서 통합을 준비하는 방법을 설명하는 Intune 앱 SDK 개요 항목을 읽어보는 것이 좋습니다.You might want to first read the Intune App SDK overview, which covers the current features of the SDK and describes how to prepare for integration on each supported platform.

SDK를 다운로드하려면 SDK 파일 다운로드를 참조하세요.To download the SDK, see Download the SDK files.

Intune App SDK를 앱에 통합하는 데 문제가 있는 경우 GitHub에서 지원 요청을 제출하세요.If you have issues with integrating the Intune App SDK into your apps, submit a request for assistance on GitHub.

Android용 Microsoft Intune 앱 SDK를 사용하면 네이티브 Android 앱에 Intune 앱 보호 정책(APP 또는 MAM 정책이라고도 함)을 통합할 수 있습니다.The Microsoft Intune App SDK for Android lets you incorporate Intune app protection policies (also known as APP or MAM policies) into your native Android app. Intune 관리 애플리케이션은 Intune 앱 SDK와 통합된 애플리케이션입니다.An Intune-managed application is one that is integrated with the Intune App SDK. Intune 관리자는 Intune으로 앱을 직접 관리할 때 Intune 관리 앱에 앱 보호 정책을 쉽게 배포할 수 있습니다.Intune administrators can easily deploy app protection policies to your Intune-managed app when Intune actively manages the app.

SDK에 포함된 내용What's in the SDK

Intune 앱 SDK는 다음 파일로 구성됩니다.The Intune App SDK consists of the following files:

  • Microsoft.Intune.MAM.SDK.aar: 지원 라이브러리 JAR 파일을 제외한 SDK 구성 요소입니다.Microsoft.Intune.MAM.SDK.aar: The SDK components, with the exception of the Support Library JAR files.
  • Microsoft.Intune.MAM.SDK.Supp또는t.v4.jar: Android v4 지원 라이브러리를 사용하는 앱 내에서 MAM을 사용하도록 설정하는 데 필요한 클래스입니다.Microsoft.Intune.MAM.SDK.Support.v4.jar: The classes necessary to enable MAM in apps that use the Android v4 support library.
  • Microsoft.Intune.MAM.SDK.Supp또는t.v7.jar: Android v7 지원 라이브러리를 사용하는 앱 내에서 MAM을 사용하도록 설정하는 데 필요한 클래스입니다.Microsoft.Intune.MAM.SDK.Support.v7.jar: The classes necessary to enable MAM in apps that use the Android v7 support library.
  • Microsoft.Intune.MAM.SDK.Support.v17.jar: Android v17 지원 라이브러리를 사용하는 앱 내에서 MAM을 사용하도록 설정하는 데 필요한 클래스입니다.Microsoft.Intune.MAM.SDK.Support.v17.jar: The classes necessary to enable MAM in apps that use the Android v17 support library.
  • Microsoft.Intune.MAM.SDK.Support.Text.jar: android.support.text 패키지에서 Android 지원 라이브러리 클래스를 사용하는 앱 내에서 MAM을 사용하도록 설정하는 데 필요한 클래스입니다.Microsoft.Intune.MAM.SDK.Support.Text.jar: The classes necessary to enable MAM in apps that use Android support library classes in the android.support.text package.
  • Microsoft.Intune.MAM.SDK.DownlevelStubs.aar: 이 AAR 파일에는 최신 디바이스에만 있지만 MAMActivity의 메서드에 의해 참조되는 Android 시스템 클래스용 스텁이 포함됩니다.Microsoft.Intune.MAM.SDK.DownlevelStubs.aar: This AAR contains stubs for Android system classes which are present only on newer devices but which are referenced by methods in MAMActivity. 새로운 디바이스는 이 스텁 클래스를 무시합니다.Newer devices will ignore these stub classes. 이 AAR 파일은 앱이 MAMActivity에서 파생되는 클래스에 리플렉션을 수행하는 경우에만 필요하며 대부분의 앱에는 포함할 필요가 없습니다.This AAR is necessary only if your app performs reflection on classes deriving from MAMActivity, and most apps do not need to include it. AAR에는 클래스를 모두 제외하는 ProGuard 규칙이 포함됩니다.The AAR contains ProGuard rules to exclude all its classes.
  • com.microsoft.intune.mam.build.jar: SDK 통합에 도움이 되는 Gradle 플러그 인입니다.com.microsoft.intune.mam.build.jar: A Gradle plugin which aids in integrating the SDK.
  • CHANGELOG.md: 각 SDK 버전에서 변경된 내용의 레코드를 제공합니다.CHANGELOG.md: Provides a record of changes made in each SDK version.
  • THIRDPARTYNOTICES.TXT: 앱에 컴파일될 타사 및/또는 OSS 코드를 확인하는 특성 알림입니다.THIRDPARTYNOTICES.TXT: An attribution notice that acknowledges third-party and/or OSS code that will be compiled into your app.

요구 사항Requirements

Android 버전Android versions

이 SDK는 Android API 21(Android 5.0)부터 Android API 30(Android 11.0)까지 지원합니다.The SDK fully supports Android API 21 (Android 5.0) through Android API 30 (Android 11.0). Android API 30을 대상으로 하려면 Intune App SDK v7.0 이상을 사용해야 합니다.In order to target Android API 30, you must use Intune App SDK v7.0 or later. Android minSDKVersion 14 이하를 사용하는 앱에 기본 제공될 수 있지만, 해당하는 이전 OS 버전에서는 Intune 회사 포털 앱을 설치하거나 MAM 정책을 사용할 수 없습니다.It may be built into an app with an Android minSDKVersion as low as 14, but on those older OS versions it will be impossible to install the Intune Company Portal app or use MAM policies.

회사 포털 앱Company Portal app

Android용 Intune 앱 SDK가 작동하려면 디바이스에 앱 보호 정책을 사용하기 위한 회사 포털 앱이 있어야 합니다.The Intune App SDK for Android relies on the presence of the Company Portal app on the device to enable app protection policies. 회사 포털이 Intune 서비스에서 앱 보호 정책을 검색합니다.The Company Portal retrieves app protection policies from the Intune service. 앱을 초기화할 때 정책과 회사 포털에서 해당 정책을 적용하는 코드를 로드합니다.When the app initializes, it loads policy and code to enforce that policy from the Company Portal.

참고

회사 포털 앱이 디바이스에 없으면 Intune 관리 앱은 Intune 앱 보호 정책을 지원하지 않는 일반 앱처럼 작동합니다.When the Company Portal app is not on the device, an Intune-managed app behaves the same as a normal app that does not support Intune app protection policies.

디바이스 등록 없이 앱 보호를 사용하기 위해 사용자가 회사 포털 앱을 통해 디바이스를 등록할 필요가 없습니다.For app protection without device enrollment, the user is not required to enroll the device by using the Company Portal app.

SDK 통합SDK integration

중요

Intune은 Intune App SDK에 대한 업데이트를 정기적으로 릴리스합니다.Intune regularly releases updates to the Intune App SDK. Intune App SDK for Android에서 정기적으로 업데이트를 확인하고 소프트웨어 개발 릴리스 주기에 통합하여 앱에서 최신 앱 보호 정책 설정을 지원하도록 합니다.Regularly check the Intune App SDK for Android for updates and incorporate into your software development release cycle to ensure your apps support the latest App Protection Policy settings.

샘플 앱Sample app

Intune 앱 SDK와 올바르게 통합하는 방법에 대한 예제는 GitHub에 제공됩니다.An example of how to integrate with the Intune App SDK properly is available on GitHub. 이 예제에서는 Gradle 빌드 플러그 인을 사용합니다.This example uses the Gradle build plugin.

Intune 앱 라이브러리 참조Referencing Intune App libraries

Intune 앱 SDK는 외부 종속성이 없는 표준 Android 라이브러리입니다.The Intune App SDK is a standard Android library with no external dependencies. Microsoft.Intune.MAM.SDK.aar 에는 앱 보호 정책 사용에 필요한 인터페이스와 Microsoft Intune Company Portal 앱과의 상호 운용에 필요한 코드가 모두 포함되어 있습니다.Microsoft.Intune.MAM.SDK.aar contains both the interfaces necessary for an app protection policy enablement and the code necessary to interoperate with the Microsoft Intune Company Portal app.

Microsoft.Intune.MAM.SDK.aar 은 Android 라이브러리 참조로 지정해야 합니다.Microsoft.Intune.MAM.SDK.aar must be specified as an Android library reference. 이렇게 하려면 Android Studio에서 앱 프로젝트를 열고 파일 > 새로 만들기 > 새 모듈 로 이동하고 .JAR/.AAR 패키지 가져오기 를 선택합니다.To do this, open your app project in Android Studio and go to File > New > New module and select Import .JAR/.AAR Package. 그런 다음, .AAR 파일 형식의 모듈을 만들기 위해 Android 아카이브 패키지 Microsoft.Intune.MAM.SDK.aar을 선택합니다.Then select our Android archive package Microsoft.Intune.MAM.SDK.aar to create a module for the .AAR file type. 앱 코드가 포함된 하나 이상의 모듈을 마우스 오른쪽 단추로 클릭하고 모듈 설정 > 종속성 탭 > + 아이콘 > 모듈 종속성 > 방금 만든 MAM SDK AAR 모듈 > 확인 을 선택합니다.Right-click the module or modules containing your app code and go to Module Settings > Dependencies tab > + icon > Module dependency > Select the MAM SDK AAR module you just created > OK. 이렇게 하면 프로젝트를 빌드할 때 모듈이 MAM SDK와 함께 컴파일됩니다.This will ensure that your module compiles with the MAM SDK when you build your project.

또한 Microsoft.Intune.MAM.SDK.Support.XXX .jar 라이브러리는 해당 android.support.XXX 라이브러리의 Intune 변형을 포함합니다.Additionally, the Microsoft.Intune.MAM.SDK.Support.XXX.jar libraries contain Intune variants of the corresponding android.support.XXX libraries. 앱이 지원 라이브러리에 종속될 필요가 없는 경우를 대비하여 Microsoft.Intune.MAM.SDK.aar에 빌드되지 않습니다.They are not built into Microsoft.Intune.MAM.SDK.aar in case an app does not need to depend on the support libraries.

ProGuardProGuard

ProGuard(또는 다른 shrinking/obfuscation 메커니즘)를 빌드 단계로 사용하면 SDK는 포함해야 하는 추가 구성 규칙을 포함합니다.If ProGuard (or any other shrinking/obfuscation mechanism) is used as a build step, the SDK has additional configuration rules which must be included. 빌드에 .AAR 을 포함할 때는 규칙이 proguard 단계에 자동으로 통합되고 필요한 클래스 파일이 유지됩니다.When including the .AAR in your build, our rules are automatically integrated into the proguard step and the necessary class files are kept.

MSAL(Microsoft 인증 라이브러리)에는 자체 ProGuard 제한 사항이 있을 수 있습니다.The Microsoft Authentication Library (MSAL) may have its own ProGuard restrictions. 앱에서 MSAL을 통합하는 경우 이러한 제한 사항에 관한 MSAL 문서를 따라야 합니다.If your app integrates MSAL, you must follow the MSAL documentation on these restrictions.

정책 적용Policy enforcement

Intune 앱 SDK는 앱에서 Intune 정책 적용을 지원하고 참여할 수 있도록 하는 Android 라이브러리입니다.The Intune App SDK is an Android library which allows your app to support and participate in the enforcement of Intune policies.

대부분의 정책은 반자동으로 적용되지만 일부 정책이 시행되려면 앱의 명시적 참여가 필요합니다.Most policies are enforced semi-automatically, but certain policies require explicit participation from your app to enforce. 원본 통합을 수행하거나 통합을 위해 빌드 도구를 사용하는지와 관계없이 명시적인 참여를 요구하는 정책을 코딩해야 합니다.Regardless of whether you perform source integration or utilize build tooling for integration the policies requiring explicit participation will need to be coded for.

자동 시행되는 정책의 경우 앱이 여러 Android 기본 클래스에서의 상속을 MAM에서의 상속으로 바꾸고, 이와 유사하게 특정 Android 시스템 서비스 클래스로의 호출을 MAM 동급 클래스로의 호출로 바꾸어야 합니다.For policies that are automatically enforced, apps are required to replace inheritance from several Android base classes with inheritance from MAM equivalents and similarly replace calls to certain Android system service classes with calls to MAM equivalents. 필요한 특정 대체는 아래에 자세히 설명되어 있으며, 원본 통합과 함께 수동으로 수행하거나 빌드 도구를 통해 자동으로 수행할 수 있습니다.The specific replacements needed are detailed below and can be manually performed with source integration or performed automatically through build tooling.

빌드 도구Build tooling

SDK는 MAM 동등 대체를 자동으로 수행하는 빌드 도구(Gradle 빌드를 위한 플러그 인 및 비 Gradle 빌드용 명령줄 도구)를 제공합니다.The SDK provides build tools (a plugin for Gradle builds and a command-line tool for non-Gradle builds) that perform MAM equivalent replacements automatically. 이러한 도구는 Java 컴파일에 의해 생성된 클래스 파일을 변환하고 원래 소스 코드는 수정하지 않습니다.These tools transform the class files generated by Java compilation, and do not modify the original source code.

이 도구는 직접 대체만 수행합니다.The tools perform direct replacements only. Save-As 정책, Multi-Identity, App-WE 등록, AndroidManifest 수정 또는 MSAL 구성과 같은 좀 더 복잡한 SDK 통합은 수행하지 않으므로 이러한 작업은 앱이 Intune을 완전히 지원하기 전에 완료되어야 합니다.They do not perform any more complex SDK integrations such as Save-As Policy, Multi-Identity, App-WE registration, AndroidManifest modifications or MSAL configuration so these must be completed before your app is fully Intune enabled. 앱과 관련된 통합 지점에 대해서는 이 설명서의 나머지 부분을 자세히 검토하세요.Please carefully review the rest of this documentation for integration points relevant to your app.

참고

수동 대체를 통해 MAM SDK의 부분 또는 전체 원본 통합을 이미 수행한 프로젝트에 대해 이러한 도구를 실행하는 것이 좋습니다.It is fine to run the tools against a project which has already performed partial or complete source integration of the MAM SDK through manual replacements. 프로젝트는 여전히 MAM SDK를 종속성으로 표시합니다.Your project must still list the MAM SDK as a dependency.

Gradle Build 플러그 인Gradle Build Plugin

앱이 gradle로 빌드되지 않은 경우 명령줄 도구와 통합으로 건너뜁니다.If your app does not build with gradle, skip to Integrating with the Command Line Tool.

앱 SDK 플러그 인은 SDK의 일부로 GradlePlugin/com.microsoft.intune.mam.build.jar 로 배포됩니다.The App SDK plugin is distributed as part of the SDK as GradlePlugin/com.microsoft.intune.mam.build.jar. Gradle이 이 플러그 인을 찾을 수 있으려면 buildscript 클래스 경로에 추가해야 합니다.For Gradle to be able to find the plugin, it must be added to the buildscript classpath. 이 플러그 인은 Javassist에 의존하므로 이 기능도 함께 추가해야 합니다.The plugin depends on Javassist, which must also be added. 이러한 기능을 클래스 경로에 추가하려면 루트 build.gradle에 다음을 추가합니다.To add these to the classpath, add the following to your root build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.javassist:javassist:3.27.0-GA"
        classpath files("$PATH_TO_MAM_SDK/GradlePlugin/com.microsoft.intune.mam.build.jar")
    }
}

그런 다음, APK 프로젝트의 build.gradle 파일에서 플러그 인을 다음과 같이 적용하세요.Then, in the build.gradle file for your APK project, simply apply the plugin as

apply plugin: 'com.microsoft.intune.mam'

기본적으로 이 플러그 인은 project 종속성 에만 작동합니다.By default, the plugin will operate only on project dependencies. 테스트 컴파일은 영향을 받지 않습니다.Test compilation not affected. 구성을 목록에 제공할 수 있습니다.Configuration may be provided to list

  • 제외할 프로젝트Projects to exclude
  • 포함할 외부 종속성External dependencies to include
  • 처리에서 제외할 특정 클래스Specific classes to exclude from processing
  • 처리에서 제외할 변형입니다.Variants to exclude from processing. 이러한 변형은 전체 변형 이름 또는 단일 버전을 나타낼 수 있습니다.These can refer to either a complete variant name or a single flavor. For example
    • 앱의 빌드 형식이 {savory, sweet} 및 {vanilla, chocolate}를 갖는 debugrelease인 경우if your app has build types debug and release with flavors {savory, sweet} and {vanilla, chocolate} you could specify
    • savory를 지정하여 savory 버전의 모든 변형을 제외하거나 savoryVanillaRelease를 사용하여 해당 변형만 정확히 제외할 수 있습니다.savory to exclude all variants with the savory flavor or savoryVanillaRelease to exclude only that exact variant.

예제 부분 build.gradleExample partial build.gradle


apply plugin: 'com.microsoft.intune.mam'

dependencies {
    implementation project(':product:FooLib')
    implementation project(':product:foo-project')
    implementation fileTree(dir: "libs", include: ["bar.jar"])
    implementation fileTree(dir: "libs", include: ["zap.jar"])
    implementation "com.contoso.foo:zap-artifact:1.0.0"
    implementation "com.microsoft.bar:baz:1.0.0"
    implementation "com.microsoft.qux:foo:2.0"

    // Include the MAM SDK
    implementation files("$PATH_TO_MAM_SDK/Microsoft.Intune.MAM.SDK.aar")
}
intunemam {
    excludeProjects = [':product:FooLib']
    includeExternalLibraries = ['bar.jar', "com.contoso.foo:zap-artifact", "com.microsoft.*", "!com.microsoft.qux*"]
    excludeClasses = ['com.contoso.SplashActivity']
    excludeVariants=['savory']
}

다음과 같은 결과가 나타납니다.This would have the following effects:

  • :product:FooLibexcludeProjects에 포함되므로 다시 작성되지 않습니다.:product:FooLib is not rewritten because it is included in excludeProjects
  • :product:foo-projectexcludeClasses에 있으므로 건너뛴 com.contoso.SplashActivity를 제외하고 다시 작성됩니다.:product:foo-project is rewritten, except for com.contoso.SplashActivity which is skipped because it's in excludeClasses
  • bar.jarincludeExternalLibraries에 포함되므로 다시 작성됩니다.bar.jar is rewritten because it is included in includeExternalLibraries
  • zap.jar은 프로젝트가 아니고 includeExternalLibraries에 있지 않으므로 다시 작성되지 않습니다.zap.jar is not rewritten because it's not a project and it's not included in includeExternalLibraries
  • com.contoso.foo:zap-artifact:1.0.0includeExternalLibraries에 있으므로 다시 작성됩니다.com.contoso.foo:zap-artifact:1.0.0 is rewritten because it's included in includeExternalLibraries
  • com.microsoft.bar:baz:1.0.0은 와일드카드(com.microsoft.*)를 통해 includeExternalLibraries에 포함되어 있으므로 다시 작성됩니다.com.microsoft.bar:baz:1.0.0 is rewritten because it's included in includeExternalLibraries via a wildcard (com.microsoft.*).
  • com.microsoft.qux:foo:2.0은 부정 패턴을 통해 명시적으로 제외되었으므로 이전 항목과 똑같은 와일드카드와 일치하더라도 다시 작성되지 않습니다.com.microsoft.qux:foo:2.0 is not rewritten even though it matches the same wildcard as the previous item because it is explicitly excluded via a negation pattern.

includeExternalLibraries의 사용Usage of includeExternalLibraries

이 플러그 인은 기본적으로 프로젝트 종속성(일반적으로 project() 함수에서 제공)에서만 작동하므로, 아래에 설명된 기준에 따라 MAM 처리가 필요한 경우 maven 또는 기타 패키지 원본(예: "com.contoso.bar:baz:1.2.0")에서 얻은 모든 종속성이 includeExternalLibraries 속성에 제공되어야 합니다.Since the plugin only operates on project dependencies (usually provided by the project() function) by default, any dependencies obtained from maven or other package sources (e.g. "com.contoso.bar:baz:1.2.0") must be provided to the includeExternalLibraries property if MAM processing of them is needed based on the criteria explained below. 로컬 AAR(아티팩트 표기법이 아닌 파일로 참조됨)이 자동으로 포함됩니다.Local AARs (referenced as files rather than with artifact notation) are automatically included.

와일드카드(“*”)가 지원됩니다.Wildcards ("*") are supported. !로 시작하는 항목은 부정이며 라이브러리를 제외하는 데 사용할 수 있습니다. 그렇지 않은 항목은 와일드카드에 의해 포함됩니다.An item beginning with ! is a negation and can be used to exclude libraries which would otherwise be included by a wildcard.

아티팩트 표기법으로 외부 종속성을 지정할 때 includeExternalLibraries 값에서 버전 구성 요소를 생략하는 것이 좋습니다.When specifying external dependencies with artifact notation, it is recommended to omit the version component in the includeExternalLibraries value. 버전을 포함하는 경우 정확한 버전이어야 합니다.If you do include the version, it must be an exact version. 동적 버전 사양(예: 1.+)은 지원되지 않습니다.Dynamic version specifications (e.g. 1.+) are not supported.

includeExternalLibraries에 라이브러리를 포함해야 하는지 여부를 판별하는 데 사용해야 하는 일반 규칙은 다음 두 가지 질문을 기준으로 합니다.The general rule you should use to determine if you need to include libraries in includeExternalLibraries is based on two questions:

  1. 라이브러리에 MAM 동급에 해당하는 클래스가 있나요?Does the library have classes in it for which there are MAM equivalents? 예: Activity , Fragment , ContentProvider , ServiceExamples: Activity, Fragment, ContentProvider, Service etc.
  2. 있는 경우 앱에서 이러한 클래스를 사용하나요?If yes, does your app make use of those classes?

이러한 질문의 답이 모두 ‘예’이면 해당 라이브러리를 includeExternalLibraries에 포함해야 합니다.If you answer 'yes' to both of those questions, then you must include that library in includeExternalLibraries.

시나리오Scenario 포함 여부Should Include?
PDF 뷰어 라이브러리를 앱에 포함하고 사용자가 PDF를 보려고 할 때 애플리케이션에서 Activity 뷰어를 사용합니다.You include a PDF viewer library in your app and you use the viewer Activity in your application when users try to view PDFs Yes
웹 성능 향상을 위해 앱에 HTTP 라이브러리를 포함합니다.You include an HTTP library in your app for enhanced web performance 아니요No
Activity , ApplicationFragment에서 파생된 클래스를 포함하는 React Native와 같은 라이브러리를 포함하고 앱에서 해당 클래스를 사용하거나 추가로 파생시킵니다.You include a library like React Native that contains classes derived from Activity, Application and Fragment and you use or further derive those classes in your app Yes
Activity , ApplicationFragment에서 파생된 클래스를 포함하는 React Native와 같은 라이브러리를 포함하지만 정적 도우미 또는 유틸리티 클래스만 사용합니다.You include a library like React Native that contains classes derived from Activity, Application and Fragment but you only use static helpers or utility classes 아니요No
TextView에서 파생된 뷰 클래스를 포함하는 라이브러리를 포함하고 앱에서 해당 클래스를 사용하거나 추가로 파생시킵니다.You include a library that contains view classes derived from TextView and you use or further derive those classes in your app Yes

보고Reporting

빌드 플러그 인은 변경 내용에 대한 html 보고서를 생성할 수 있습니다.The build plugin can generate an html report of the changes it makes. 이 보고서를 생성하라고 요청하려면 intunemam 구성 블록에서 report = true를 지정합니다.To request generation of this report, specify report = true in the intunemam configuration block. 생성된 보고서는 빌드 디렉터리의 outputs/logs에 작성됩니다.If generated, the report will be written to outputs/logs in the build directory.

intunemam {
    report = true
}

확인Verification

빌드 플러그 인은 추가 확인을 실행하여 클래스 처리에서 발생할 수 있는 오류를 검색할 수 있습니다.The build plugin can run additional verification to look for possible errors in processing classes. 이를 요청하려면 intunemam 구성 블록에 verify = true를 지정합니다.To request this, specify verify = true in the intunemam configuration block. 이로 인해 플러그 인 작업에 소요되는 시간에 몇 초 정도 추가될 수 있습니다.Note that this may add several seconds to the time taken by the plugin's task.

intunemam {
    verify = true
}

증분 빌드Incremental builds

증분 빌드 지원을 사용하도록 설정하려면 intunemam 구성 블록에 incremental = true를 지정합니다.To enable support for building incrementally, specify incremental = true in the intunemam configuration block. 이는 변경된 입력 파일만 처리하여 빌드 성능을 높이기 위한 실험적 기능입니다.This is an experimental feature aimed at increasing build performance by processing only the input files that have changed. 기본 구성은 false입니다.The default configuration is false.

intunemam {
    incremental = true
}

종속성Dependencies

gradle 플러그 인은 Javassist에 대한 종속성이 있으므로 위에서 설명한 것처럼 Gradle 종속성 해결에서 사용해야 합니다.The gradle plugin has a dependency on Javassist, which must be available to Gradle's dependency resolution (as described above). Javassist는 이 플러그 인을 실행하는 빌드 타임에만 사용됩니다.Javassist is used solely at build time when running the plugin. Javassist 코드는 앱에 추가되지 않습니다.No Javassist code will be added to your app.

참고

Android Gradle 플러그 인 버전 3.6.1 이상 및 Gradle 5.6.4 이상을 사용해야 합니다.You must be using version 3.6.1 or newer of the Android Gradle plugin and Gradle 5.6.4 or newer.

명령줄 빌드 도구Command Line Build Tool

빌드 시 Gradle을 사용하는 경우 다음 섹션으로 건너뜁니다.If your build uses Gradle, skip to the next section.

명령줄 빌드 도구는 SDK 드롭의 BuildTool 폴더에서 사용할 수 있습니다.The command-line build tool is available in the BuildTool folder of the SDK drop. 위에서 자세히 설명한 것과 같이 이 도구는 Gradle 플러그 인과 동일한 기능을 수행하지만 사용자 지정 또는 비 Gradle 빌드 시스템에 통합될 수 있습니다.It performs the same function as the Gradle plugin detailed above, but can be integrated into custom or non-Gradle build systems. 또한 좀 더 일반적이고 호출이 좀 더 복잡하므로 Gradle 플러그 인은 가능할 때만 사용해야 합니다.As it is more generic, it is more complex to invoke, so the Gradle plugin should be used when it is possible to do so.

명령줄 도구 사용Using the Command-Line Tool

BuildTool\bin 디렉터리에 있는 제공된 도우미 스크립트를 사용하여 명령줄 도구를 호출할 수 있습니다.The command-line tool can be invoked by using the provided helper scripts located in the BuildTool\bin directory.

이 도구에는 다음 매개 변수가 필요합니다.The tool expects the following parameters.

매개 변수Parameter 설명Description
--input 수정할 클래스 파일의 세미콜론으로 구분된 jar 파일 및 디렉터리 목록입니다.A semi-colon delimited list of jar files and directories of class files to modify. 여기에는 다시 쓰려는 모든 jar/디렉터리가 포함되어야 합니다.This should include all jars/directories that you intend to rewrite.
--output 수정한 클래스를 저장할 세미콜론으로 구분된 jar 파일 및 디렉터리 목록입니다.A semi-colon delimited list of jar files and directories to store the modified classes to. 입력 항목당 하나의 출력 항목이 있으며 순서대로 나열되어야 합니다.There should be one output entry per input entry, and they should be listed in order.
--classpath 빌드 클래스 경로입니다.The build classpath. 여기에는 jar 및 클래스 디렉터리가 둘 다 포함될 수 있습니다.This may contain both jars and class directories.
--excludeClasses 재작성에서 제외해야 하는 클래스의 이름을 포함하는 세미콜론으로 구분된 목록입니다.A semi-colon delimited list containing the names of the classes that should be excluded from rewriting.

선택적인 --excludeClasses를 제외한 모든 매개 변수가 필수입니다.All parameters are required except for --excludeClasses which is optional.

참고

Unix와 비슷한 시스템에서 세미콜론은 명령 구분 기호입니다.On Unix-like systems semi-colon is a command separator. 셸이 명령을 분할하지 못하게 하려면 각 세미콜론을 ''로 이스케이프하거나 전체 매개 변수를 느낌표로 래핑합니다.To avoid the shell from splitting commands, make sure to escape each semi-colon with '' or wrap the full parameter in quotation marks.

명령줄 도구 호출 예제Example Command-Line Tool invocation

> BuildTool\bin\BuildTool.bat --input build\product-foo-project;libs\bar.jar --output mam-build\product-foo-project;mam-build\libs\bar.jar --classpath build\zap.jar;libs\Microsoft.Intune.MAM.SDK\classes.jar;%ANDROID_SDK_ROOT%\platforms\android-27\android.jar --excludeClasses com.contoso.SplashActivity

다음과 같은 결과가 나타납니다.This would have the following effects:

  • product-foo-project 디렉터리는 mam-build\product-foo-project로 다시 작성됩니다.the product-foo-project directory is rewritten to mam-build\product-foo-project
  • bar.jarmam-build\libs\bar.jar로 다시 작성됩니다.bar.jar is rewritten to mam-build\libs\bar.jar
  • zap.jar--classpath에만 나열되므로 다시 작성되지 않습니다.zap.jar is not rewritten because it is only listed in --classpath
  • com.contoso.SplashActivity 클래스는 --input에 있더라도 다시 작성되지 않습니다.The com.contoso.SplashActivity class is not rewritten even if it is in --input

참고

빌드 도구는 현재 aar 파일을 지원하지 않습니다.The build tool does not currently support aar files. 빌드 시스템이 aar 파일을 처리할 때 classes.jar을 아직 추출하지 않은 경우 빌드 도구를 호출하기 전에 이 작업을 수행해야 합니다.If your build system does not already extract classes.jar when dealing with aar files, you will need to do so before invoking the build tool.

클래스 및 메서드 대체Class and method replacements

참고

앱은 SDK 빌드 도구와 ‘통합되어야’ 이 대체 작업이 모두 자동으로 수행됩니다(매니페스트 대체 제외).Apps should integrate with the SDK build tooling, which will perform all of these replacements automatically (except for manifest replacements

Intune 관리를 사용하도록 설정하려면 Android 기본 클래스를 동등한 개별 MAM 클래스로 바꿔야 합니다.Android base classes must be replaced with their respective MAM equivalents in order to enable Intune management. SDK 클래스는 Android 기본 클래스와 앱에서 파생된 고유 버전의 Android 기본 클래스 사이에 존재합니다.The SDK classes live between the Android base class and the app's own derived version of that class. 예를 들어 앱 활동은 Activity > MAMActivity > AppSpecificActivity와 같은 상속 계층을 생성할 수 있습니다.For example, an app activity might end up with an inheritance hierarchy that looks like: Activity > MAMActivity > AppSpecificActivity. MAM 계층은 앱에 관리되는 보기를 원활하게 제공하기 위해 시스템 작업에 대한 호출을 필터링합니다.The MAM layer filters calls to system operations in order to seamlessly provide your app with a managed view of the world.

기본 클래스 외에도, 앱이 파생 없이 사용할 수 있는 일부 클래스(예: MediaPlayer)에 필수 MAM 동급 클래스도 있으며 일부 메서드 호출도 대체해야 합니다.In addition to base classes, some classes your app might use without deriving (e.g. MediaPlayer) also have required MAM equivalents, and some method calls must also be replaced. 정확한 세부 사항은 아래와 같습니다.The precise details are given below.

참고

앱이 SDK 빌드 도구와 통합되는 경우 다음 클래스 및 메서드 대체가 자동으로 수행됩니다.If your app is integrating with SDK build tooling, the following class and method replacements are performed automatically.

Android 기본 클래스Android base class Intune 앱 SDK 대체 항목Intune App SDK replacement
android.app.Activityandroid.app.Activity MAMActivityMAMActivity
android.app.ActivityGroupandroid.app.ActivityGroup MAMActivityGroupMAMActivityGroup
android.app.AliasActivityandroid.app.AliasActivity MAMAliasActivityMAMAliasActivity
android.app.Applicationandroid.app.Application MAMApplicationMAMApplication
android.app.Dialogandroid.app.Dialog MAMDialogMAMDialog
android.app.AlertDialog.Builderandroid.app.AlertDialog.Builder MAMAlertDialogBuilderMAMAlertDialogBuilder
android.app.DialogFragmentandroid.app.DialogFragment MAMDialogFragmentMAMDialogFragment
android.app.ExpandableListActivityandroid.app.ExpandableListActivity MAMExpandableListActivityMAMExpandableListActivity
android.app.Fragmentandroid.app.Fragment MAMFragmentMAMFragment
android.app.IntentServiceandroid.app.IntentService MAMIntentServiceMAMIntentService
android.app.LauncherActivityandroid.app.LauncherActivity MAMLauncherActivityMAMLauncherActivity
android.app.ListActivityandroid.app.ListActivity MAMListActivityMAMListActivity
android.app.ListFragmentandroid.app.ListFragment MAMListFragmentMAMListFragment
android.app.NativeActivityandroid.app.NativeActivity MAMNativeActivityMAMNativeActivity
android.app.PendingIntentandroid.app.PendingIntent MAMPendingIntent(Pending Intent 참조)MAMPendingIntent (see Pending Intent)
android.app.Serviceandroid.app.Service MAMServiceMAMService
android.app.TabActivityandroid.app.TabActivity MAMTabActivityMAMTabActivity
android.app.TaskStackBuilderandroid.app.TaskStackBuilder MAMTaskStackBuilderMAMTaskStackBuilder
android.app.backup.BackupAgentandroid.app.backup.BackupAgent MAMBackupAgentMAMBackupAgent
android.app.backup.BackupAgentHelperandroid.app.backup.BackupAgentHelper MAMBackupAgentHelperMAMBackupAgentHelper
android.app.backup.FileBackupHelperandroid.app.backup.FileBackupHelper MAMFileBackupHelperMAMFileBackupHelper
android.app.backup.SharePreferencesBackupHelperandroid.app.backup.SharePreferencesBackupHelper MAMSharedPreferencesBackupHelperMAMSharedPreferencesBackupHelper
android.content.BroadcastReceiverandroid.content.BroadcastReceiver MAMBroadcastReceiverMAMBroadcastReceiver
android.content.ContentProviderandroid.content.ContentProvider MAMContentProviderMAMContentProvider
android.os.Binderandroid.os.Binder MAMBinder(Binder가 AIDL(Android Interface Definition Language) 인터페이스에서 생성되지 않은 경우에만 필요함)MAMBinder (Only necessary if the Binder is not generated from an Android Interface Definition Language (AIDL) interface)
android.media.MediaPlayerandroid.media.MediaPlayer MAMMediaPlayerMAMMediaPlayer
android.media.MediaMetadataRetrieverandroid.media.MediaMetadataRetriever MAMMediaMetadataRetrieverMAMMediaMetadataRetriever
android.media.MediaRecorderandroid.media.MediaRecorder MAMMediaRecorderMAMMediaRecorder
android.provider.DocumentsProviderandroid.provider.DocumentsProvider MAMDocumentsProviderMAMDocumentsProvider
android.preference.PreferenceActivityandroid.preference.PreferenceActivity MAMPreferenceActivityMAMPreferenceActivity
android.support.multidex.MultiDexApplicationandroid.support.multidex.MultiDexApplication MAMMultiDexApplicationMAMMultiDexApplication
android.widget.PopupWindowandroid.widget.PopupWindow MAMPopupMenuMAMPopupMenu
android.widget.PopupWindowandroid.widget.PopupWindow MAMPopupWindowMAMPopupWindow
android.widget.ListPopupWindowandroid.widget.ListPopupWindow MAMListPopupWindowMAMListPopupWindow
android.widget.TextViewandroid.widget.TextView MAMTextViewMAMTextView
android.widget.AutoCompleteTextViewandroid.widget.AutoCompleteTextView MAMAutoCompleteTextViewMAMAutoCompleteTextView
android.widget.CheckedTextViewandroid.widget.CheckedTextView MAMCheckedTextViewMAMCheckedTextView
android.widget.EditTextandroid.widget.EditText MAMEditTextMAMEditText
android.inputmethodservice.ExtractEditTextandroid.inputmethodservice.ExtractEditText MAMExtractEditTextMAMExtractEditText
android.widget.MultiAutoCompleteTextViewandroid.widget.MultiAutoCompleteTextView MAMMultiAutoCompleteTextViewMAMMultiAutoCompleteTextView
android.view.ViewGroupandroid.view.ViewGroup MAMViewGroupMAMViewGroup

참고

애플리케이션에 자체 파생된 Application 클래스가 필요하지 않은 경우에도 아래 MAMApplication을 참조하십시오.Even if your application does not have a need for its own derived Application class, see MAMApplication below

Microsoft.Intune.MAM.SDK.Support.v4.jar:Microsoft.Intune.MAM.SDK.Support.v4.jar:

Android 클래스Android Class Intune 앱 SDK 대체 항목Intune App SDK replacement
android.support.v4.app.DialogFragmentandroid.support.v4.app.DialogFragment MAMDialogFragmentMAMDialogFragment
android.support.v4.app.FragmentActivityandroid.support.v4.app.FragmentActivity MAMFragmentActivityMAMFragmentActivity
android.support.v4.app.Fragmentandroid.support.v4.app.Fragment MAMFragmentMAMFragment
android.support.v4.app.JobIntentServiceandroid.support.v4.app.JobIntentService MAMJobIntentServiceMAMJobIntentService
android.support.v4.app.TaskStackBuilderandroid.support.v4.app.TaskStackBuilder MAMTaskStackBuilderMAMTaskStackBuilder
android.support.v4.content.FileProviderandroid.support.v4.content.FileProvider MAMFileProviderMAMFileProvider
android.support.v4.content.WakefulBroadcastReceiverandroid.support.v4.content.WakefulBroadcastReceiver MAMWakefulBroadcastReceiverMAMWakefulBroadcastReceiver

Microsoft.Intune.MAM.SDK.Support.v7.jar:Microsoft.Intune.MAM.SDK.Support.v7.jar:

Android 클래스Android Class Intune 앱 SDK 대체 항목Intune App SDK replacement
android.support.v7.app.AlertDialog.Builderandroid.support.v7.app.AlertDialog.Builder MAMAlertDialogBuilderMAMAlertDialogBuilder
android.support.v7.app.AppCompatActivityandroid.support.v7.app.AppCompatActivity MAMAppCompatActivityMAMAppCompatActivity
android.support.v7.widget.AppCompatAutoCompleteTextViewandroid.support.v7.widget.AppCompatAutoCompleteTextView MAMAppCompatAutoCompleteTextViewMAMAppCompatAutoCompleteTextView
android.support.v7.widget.AppCompatCheckedTextViewandroid.support.v7.widget.AppCompatCheckedTextView MAMAppCompatCheckedTextViewMAMAppCompatCheckedTextView
android.support.v7.widget.AppCompatEditTextandroid.support.v7.widget.AppCompatEditText MAMAppCompatEditTextMAMAppCompatEditText
android.support.v7.widget.AppCompatMultiAutoCompleteTextViewandroid.support.v7.widget.AppCompatMultiAutoCompleteTextView MAMAppCompatMultiAutoCompleteTextViewMAMAppCompatMultiAutoCompleteTextView
android.support.v7.widget.AppCompatTextViewandroid.support.v7.widget.AppCompatTextView MAMAppCompatTextViewMAMAppCompatTextView

Microsoft.Intune.MAM.SDK.Support.v17.jar:Microsoft.Intune.MAM.SDK.Support.v17.jar:

Android 클래스Android Class Intune 앱 SDK 대체 항목Intune App SDK replacement
android.support.v17.leanback.widget.SearchEditTextandroid.support.v17.leanback.widget.SearchEditText MAMSearchEditTextMAMSearchEditText

Microsoft.Intune.MAM.SDK.Support.Text.jar:Microsoft.Intune.MAM.SDK.Support.Text.jar:

Android 클래스Android Class Intune 앱 SDK 대체 항목Intune App SDK replacement
android.support.text.emoji.widget.EmojiAppCompatEditTextandroid.support.text.emoji.widget.EmojiAppCompatEditText MAMEmojiAppCompatEditTextMAMEmojiAppCompatEditText
android.support.text.emoji.widget.EmojiAppCompatTextViewandroid.support.text.emoji.widget.EmojiAppCompatTextView MAMEmojiAppCompatTextViewMAMEmojiAppCompatTextView
android.support.text.emoji.widget.EmojiEditTextandroid.support.text.emoji.widget.EmojiEditText MAMEmojiEditTextMAMEmojiEditText
android.support.text.emoji.widget.EmojiTextViewandroid.support.text.emoji.widget.EmojiTextView MAMEmojiTextViewMAMEmojiTextView

이름이 바뀐 메서드Renamed Methods

대부분의 경우, Android 클래스에서 사용할 수 있는 메서드가 MAM 대체 클래스에서 최종본으로 표시되어 있습니다.In many cases, a method available in the Android class has been marked as final in the MAM replacement class. 이 경우 MAM 대체 클래스는 대신 재정의할 유사한 이름의 메서드(일반적으로 접미사 MAM이 붙음)를 제공합니다.In this case, the MAM replacement class provides a similarly named method (generally suffixed with MAM) that you should override instead. 예를 들어 MAMActivity에서 파생되는 경우 ActivityonCreate()를 재정의하고 super.onCreate()를 호출하는 대신 onMAMCreate()를 재정의하고 super.onMAMCreate()를 호출해야 합니다.For example, when deriving from MAMActivity, instead of overriding onCreate() and calling super.onCreate(), Activity must override onMAMCreate() and call super.onMAMCreate(). Java 컴파일러는 동등한 MAM 메서드 대신 원래 메서드가 실수로 재정의되는 것을 방지하기 위해 최종 제한을 적용해야 합니다.The Java compiler should enforce the final restrictions to prevent accidental override of the original method instead of the MAM equivalent.

MAMApplicationMAMApplication

앱이 android.app.Application의 서브클래스를 만드는 경우 빌드 플러그 인은 애플리케이션 클래스를 변환합니다.If your app creates a subclass of android.app.Application, then the build plugin will transform your application class. 앱이 android.app.Application 서브클래스를 만들지 않는 경우 AndroidManifest.xml의 <application> 태그에서 "com.microsoft.intune.mam.client.app.MAMApplication""android:name" 특성으로 설정해야 합니다.If your app does not subclass android.app.Application, then you must set "com.microsoft.intune.mam.client.app.MAMApplication" as the "android:name" attribute in your AndroidManifest.xml's <application> tag.

PendingIntentPendingIntent

PendingIntent.get* 대신 MAMPendingIntent.get* 메서드를 사용해야 합니다.Instead of PendingIntent.get*, you must use the MAMPendingIntent.get* method. 그런 다음 결과로 생성된 PendingIntent를 일반적인 방식으로 사용할 수 있습니다.After this, you can use the resultant PendingIntent as usual.

래핑된 시스템 서비스Wrapped System Services

일부 시스템 서비스 클래스의 경우, 서비스 인스턴스에서 원하는 메서드를 직접 호출하지 않고 MAM 래퍼 클래스에서 정적 메서드를 호출해야 합니다.For some system service classes, it is necessary to call a static method on a MAM wrapper class instead of directly invoking the desired method on the service instance. 예를 들어, getSystemService(ClipboardManager.class).getPrimaryClip()에 대한 호출은 MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class)에 대한 호출이어야 합니다.For example, a call to getSystemService(ClipboardManager.class).getPrimaryClip() must become a call to MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class). 이러한 호출을 수동으로 대체하지 않는 것이 좋습니다.It is not recommended to make these replacements manually. 대신 BuildPlugin을 통해 수행합니다.Instead, let the BuildPlugin do it.

Android 클래스Android Class Intune 앱 SDK 대체 항목Intune App SDK replacement
android.content.ClipboardManagerandroid.content.ClipboardManager MAMClipboardMAMClipboard
android.content.ContentProviderClientandroid.content.ContentProviderClient MAMContentProviderClientManagementMAMContentProviderClientManagement
android.content.ContentResolverandroid.content.ContentResolver MAMContentResolverManagementMAMContentResolverManagement
android.content.pm.PackageManagerandroid.content.pm.PackageManager MAMPackageManagementMAMPackageManagement
android.app.DownloadManagerandroid.app.DownloadManager MAMDownloadManagementMAMDownloadManagement
android.print.PrintManagerandroid.print.PrintManager MAMPrintManagementMAMPrintManagement
android.support.v4.print.PrintHelperandroid.support.v4.print.PrintHelper MAMPrintHelperManagementMAMPrintHelperManagement
android.view.Viewandroid.view.View MAMViewManagementMAMViewManagement
android.view.DragEventandroid.view.DragEvent MAMDragEventManagementMAMDragEventManagement
android.app.NotificationManagerandroid.app.NotificationManager MAMNotificationManagementMAMNotificationManagement
android.support.v4.app.NotificationManagerCompatandroid.support.v4.app.NotificationManagerCompat MAMNotificationCompatManagementMAMNotificationCompatManagement
android.app.blob.BlobStoreManagerandroid.app.blob.BlobStoreManager MAMBlobStoreManagerMAMBlobStoreManager
android.app.blob.BlobStoreManager.Sessionandroid.app.blob.BlobStoreManager.Session MAMBlobStoreManager.SessionMAMBlobStoreManager.Session

ClipboardManager, ContentProviderClient, ContentResolver, PackageManager 같은 클래스는 대부분의 메서드가 래핑되고 DownloadManager, PrintManager, PrintHelper, View, DragEvent, NotificationManagerNotificationManagerCompat과 같은 클래스는 한두 개 메서드만 래핑됩니다.Some classes have most of their methods wrapped, e.g. ClipboardManager, ContentProviderClient, ContentResolver, and PackageManager while other classes have only one or two methods wrapped, e.g. DownloadManager, PrintManager, PrintHelper, View, DragEvent, NotificationManager and NotificationManagerCompat. BuildPlugin을 사용하고 있지 않은지 잘 모르겠으면 MAM에 해당하는 클래스가 노출하는 API를 참조하세요.Please consult APIs exposed by the MAM equivalent classes for the exact method if you do not use the BuildPlugin.

매니페스트 대체Manifest Replacements

Java 코드 외에도 매니페스트에서 위의 클래스 대체를 수행해야 할 수도 있습니다.It may be necessary to perform some of the above class replacements in the manifest as well as in Java code. 특별 참고 사항:Of special note:

  • android.support.v4.content.FileProvider에 대한 매니페스트 참조는 com.microsoft.intune.mam.client.support.v4.content.MAMFileProvider로 대체해야 합니다.Manifest references to android.support.v4.content.FileProvider must be replaced with com.microsoft.intune.mam.client.support.v4.content.MAMFileProvider.

AndroidX 라이브러리AndroidX Libraries

Android P를 사용하면서 Google은 AndroidX라는 새로운 이름의 지원 라이브러리를 발표했으며 버전 28은 기존 android.support 라이브러리의 최신 주 릴리스입니다.With Android P, Google announced a new (renamed) set of support libraries called AndroidX, and version 28 is the last major release of the existing android.support libraries.

Android 지원 라이브러리와 달리, AndroidX 라이브러리의 MAM 변형은 제공하지 않습니다.Unlike with the android support libs, we do not provide MAM variants of the AndroidX libraries. 대신, AndroidX는 다른 외부 라이브러리로 취급되며 빌드 플러그 인/도구로 다시 작성되도록 구성되어야 합니다.Instead, AndroidX should be treated as any other external library and should be configured to be rewritten by the build plugin/tool. Gradle 빌드의 경우 플러그 인 구성의 includeExternalLibraries 필드에 androidx.*를 포함하여 이처럼 구성할 수 있습니다. 명령줄 도구의 호출은 모든 jar 파일을 명시적으로 나열해야 합니다.For Gradle builds, this can be done by including androidx.* in the includeExternalLibraries field of the plugin config. Invocations of the command-lines tool must list all jar files explicitly.

AndroidX 전 아키텍처 구성 요소Pre-AndroidX Architecture Components

Room, ViewModel 및 WorkManager를 포함한 많은 Android 아키텍처가 AndroidX용으로 다시 패키징되었습니다.Many Android architecture components including Room, ViewModel, and WorkManager were repackaged for AndroidX. 앱이 해당 라이브러리의 AndroidX 전 변형을 사용하는 경우 플러그 인 구성의 includeExternalLibraries 필드에 android.arch.*를 포함하여 다시 쓰기가 적용되는지 확인합니다. 또는 라이브러리를 해당 AndroidX 라이브러리로 업데이트합니다.If your app uses the pre-AndroidX variants of these libraries, ensure rewrites apply by including android.arch.* in the includeExternalLibraries field of the plugin config. Alternatively, update the libraries to their AndroidX equivalents.

AndroidX 마이그레이션 문제 해결Troubleshooting AndroidX Migration

SDK 통합 앱을 AndroidX로 마이그레이션하는 동안 다음과 같은 오류가 발생할 수 있습니다.While migrating your SDK-integrated app to AndroidX, you may encounter an error like the following:

incompatible types: android.support.v7.app.ActionBar cannot be converted to androidx.appcompat.app.ActionBar

앱이 MAM 지원 클래스를 참조하기 때문에 이 오류가 발생할 수 있습니다.These errors can occur because your app references MAM support classes. MAM 지원 클래스는 AndroidX로 이동된 Android 지원 클래스를 래핑합니다.MAM support classes wrap Android support classes that have moved in AndroidX. 해당 오류를 해결하려면 모든 MAM 지원 클래스 참조를 해당하는 AndroidX 항목으로 바꿉니다.To combat such errors, replace all MAM support class references with their AndroidX equivalents. 이 작업을 수행하려면 먼저 Gradle 빌드 파일에서 MAM 지원 라이브러리 종속성을 제거합니다.This can be achieved by first removing the MAM support library dependencies from your Gradle build files. 해당하는 줄은 다음과 같이 표시됩니다.The lines in question will look something like the following:

implementation "com.microsoft.intune.mam:android-sdk-support-v4:$intune_mam_version"
implementation "com.microsoft.intune.mam:android-sdk-support-v7:$intune_mam_version"

그런 다음, com.microsoft.intune.mam.client.support.v7com.microsoft.intune.mam.client.support.v4 패키지에서 MAM 클래스에 대한 모든 참조를 AndroidX 항목으로 바꿔서 발생한 컴파일 시간 오류를 해결합니다.Then, fix the resulting compile-time errors by replacing all references to MAM classes in the com.microsoft.intune.mam.client.support.v7 and com.microsoft.intune.mam.client.support.v4 packages with their AndroidX equivalents. 예를 들어 MAMAppCompatActivity에 대한 참조를 AndroidX의 AppCompatActivity로 변경해야 합니다.For example, references to MAMAppCompatActivity should be changed to AndroidX's AppCompatActivity. 위에서 설명한 것처럼 MAM 빌드 플러그 인/도구는 컴파일 시간에 해당하는 MAM 항목을 사용하여 AndroidX 라이브러리의 클래스를 자동으로 다시 작성합니다.As discussed above, the MAM build plugin/tool will automatically rewrite classes in the AndroidX libraries with the appropriate MAM equivalents at compile-time.

로깅Logging

로깅된 데이터를 최대한 활용하려면 초기에 로깅을 초기화해야 합니다.Logging should be initialized early to get the most value out of logged data. 일반적으로 Application.onMAMCreate()는 로깅을 초기화하는 가장 좋은 위치입니다.Application.onMAMCreate() is typically the best place to initialize logging.

앱에서 MAM 로그를 받으려면 Java Handler를 만들어 MAMLogHandlerWrapper에 추가합니다.To receive MAM logs in your app, create a Java Handler and add it to the MAMLogHandlerWrapper. 그러면 애플리케이션 핸들러에서 모든 로그 메시지에 대해 publish()를 호출합니다.This will invoke publish() on the application handler for every log message.

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

진단 정보Diagnostics Information

앱은 회사 포털 로그를 수집하고 MAM 진단을 보기 위해 UI를 표시하는 활동을 시작하는 MAMPolicyManager.showDiagnostics(context) 메서드를 호출할 수 있습니다.Apps can invoke MAMPolicyManager.showDiagnostics(context) method that starts an activity displaying UI for collecting Company Portal logs and viewing MAM diagnostics. 디버깅을 지원할 수 있는 선택적 기능입니다.This is an optional feature that may assist in debugging.

디바이스에 회사 포털이 설치되지 않은 경우에는 이 정보를 현재 사용할 수 없음을 사용자에게 알리는 대화 상자가 표시됩니다.When Company Portal is not installed on device, a dialog will be prompted to inform the user that this information is currently not available. 앱이 MAM 정책으로 관리되는 경우 자세한 MAM 정책 설정이 표시됩니다.When apps are managed by MAM policy, detailed MAM policy settings will be displayed.

MAM Strict 모드MAM Strict Mode

MAM Strict 모드는 MAM API 또는 MAM 제한 플랫폼 API의 앱 사용에서 “오류”를 탐지하는 메커니즘을 제공합니다.MAM Strict Mode provides a mechanism to detect "smells" in app usage of MAM APIs or MAM-restricted platform APIs. Android의 StrictMode 이후 느슨하게 패턴화되며 실패할 경우 오류를 발생시키는 일련의 검사를 실행합니다.It is loosely patterned after Android's StrictMode, and runs a set of checks which raise errors when they fail. 프로덕션 빌드에서 계속 사용하도록 설정되지 않지만, 앱의 내부 개발, 디버그 및/또는 시범 서비스 빌드에서 ‘사용하는 것이 좋습니다’.It is not intended to be left enabled in production builds, but you are strongly encouraged to use it in your app's internal development, debug, and/or dogfood builds.

사용하도록 설정하려면 다음을To enable, call

MAMStrictMode.enable();

애플리케이션 초기화 초기(예: Application.onCreate)에 호출합니다.early in application initialization (e.g. Application.onCreate).

MAM Strict 모드 검사가 실패하는 경우 앱에서 해결할 수 있는 실제 문제인지, 아니면 가양성인지 확인하려고 시도합니다.When a MAM Strict Mode check fails, try to determine whether it is a real issue that can be fixed in your app, or a false positive. 가양성이라고 판단하거나 확실하지 않은 경우에는 Intune MAM 팀에 알려 주세요.If you believe it's a false positive or you aren't sure, please let the Intune MAM team know. 그러면 가양성 결정에 동의하는지 확인하고 향후 릴리스의 검색을 개선할 수 있습니다.This will allow us to make sure we agree with the false positive determination and to attempt to improve detection for future releases. 가양성을 제거하려면 실패한 검사를 사용하지 않도록 설정합니다(아래 추가 정보).To suppress false positives, disable the failing check (more info below).

위반 처리Handling Violations

검사가 실패하면 MAMStrictViolationHandler가 실행됩니다.When a check fails, it runs a MAMStrictViolationHandler. 기본 처리기는 앱 작동이 중단될 것으로 예상되는 Error를 throw합니다.The default handler throws an Error, which is expected to crash the app. 이 동작은 오류의 방해 효과를 최대화하며 프로덕션 빌드에서 strict 모드를 사용하지 않아야 한다는 의도에 부합합니다.This is to make failures as noisy as possible, and fits with the intention that strict mode should not be enabled in production builds.

앱에서 위반을 다르게 처리하려고 하는 경우에는 다음을 호출하여 자체 처리기를 제공할 수 있습니다.If your app would like to handle violations differently, it can supply its own handler by calling:

MAMStrictMode.global().setHandler(handler);

여기서 handlerMAMStrictViolationHandler를 구현합니다.where handler implements MAMStrictViolationHandler.

검사 제거Suppressing Checks

앱이 잘못된 작업을 수행하지 않는 상황에서 검사에 실패하는 경우에는 위에 설명된 대로 오류를 보고합니다.If a check fails in a situation where your app is doing nothing incorrect, please report it as mentioned above. 그러나 경우에 따라 업데이트된 SDK를 기다리는 동안 가양성을 발견하는 검사를 사용하지 않도록 설정해야 할 수 있습니다.At some times, however, it may be necessary to disable the check encountering a false positive, at least while waiting for an updated SDK. 실패한 검사는 기본 처리기에 의해 발생한 오류에 표시되거나, 사용자 지정 처리기(설정된 경우)에 전달됩니다.The check which failed will be shown in the error raised by the default handler, or will be passed to a custom handler if set.

제거는 전역적으로 수행될 수 있지만, 특정 호출 사이트에서 스레드별로 일시적으로 사용하지 않도록 설정하는 것이 좋습니다.Suppression can be done globally, but temporarily disabling per-thread at the specific call site is preferred. 다음 예제는 MAMStrictCheck.IDENTITY_NO_SUCH_FILE(존재하지 않는 파일을 보호하려고 시도하는 경우 발생함)을 사용하지 않도록 설정하는 다양한 방법을 보여 줍니다.The following examples show various ways to disable MAMStrictCheck.IDENTITY_NO_SUCH_FILE (raised if an attempt is made to protect a file which doesn't exist).

스레드별 임시 제거Per-Thread Temporary Suppression

이 제거 메커니즘을 사용하는 것이 좋습니다.This is the preferred suppression mechanism.

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 Permanent Suppression

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

전역(프로세스 수준) 제거Global (Process-Wide) Suppression

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

앱 참여를 요구하는 기능 사용Enable features that require app participation

SDK가 자체적으로 적용할 수 없는 몇 가지 앱 보호 정책이 있습니다.There are some app protection policies the SDK cannot enforce on its own:

  • 로컬 또는 클라우드 스토리지에 파일을 저장하는 데 제한을 적용합니다.Enforce restrictions on saving files to local or cloud storage.
  • 로컬 또는 클라우드 스토리지에서 파일을 여는 데 제한을 적용합니다.Enforce restrictions on opening files from local or cloud storage.
  • 알림 콘텐츠에 제한을 적용합니다.Enforce restrictions on content in notifications.

앱은 AppPolicy 인터페이스의 메서드를 사용하여 이러한 작업이 허용되는지 여부를 확인해야 합니다.Your app should use the methods in the AppPolicy interface to ask whether these actions are allowed. 파일/문서 저장 또는 열기가 허용되는지 테스트하려면 [getIsSaveToLocationAllowed] 및 [getIsOpenFromLocationAllowed]를 사용합니다.To test if saving or opening a file/document is allowed, use [getIsSaveToLocationAllowed] and [getIsOpenFromLocationAllowed]. 알림 콘텐츠에 대한 제한을 확인하려면 getNotificationRestriction을 사용합니다.To determine restrictions on notification content, use getNotificationRestriction. 이러한 모든 시나리오의 확장된 예제는 이 섹션의 뒷부분에서 설명합니다.Expanded examples for all these scenarios are given later in this section.

위의 정책과 관련이 없는 AppPolicy의 메서드는 앱이 더 나은 사용자 환경을 제공하는 데 사용할 수 있는 정보를 제공하지만 정책 적용에는 필요하지 않습니다.Note that methods in AppPolicy which do not pertain to the above policies provide information which your app may use to present a better user experience but are not required for policy enforcement. 예를 들어 AppPolicy는 PIN 및 스크린샷 정책에 대한 정보를 노출하지만 이러한 정책은 자동으로 적용됩니다.For example, AppPolicy exposes information on PIN and screenshot policies, but these are enforced automatically.

AppPolicy 인스턴스를 검색하려면 MAMPolicyManager.getPolicyMAMPolicyManager]를 사용합니다.To retrieve an AppPolicy instance, use MAMPolicyManager.getPolicyMAMPolicyManager].

참고

MAMPolicyManager.getPolicy은 디바이스 또는 앱에 Intune 관리 정책이 적용되지 않더라도 항상 Null이 아닌 앱 정책을 반환합니다.MAMPolicyManager.getPolicy will always return a non-null App Policy, even if the device or app is not under an Intune management policy.

예제: 앱에 PIN이 필요한지 확인Example: Determine if PIN is required for the app

앱에 고유 PIN 사용자 환경이 있는 경우 IT 관리자가 앱 PIN을 묻도록 SDK를 구성했으면 이를 사용하지 않게 설정할 수 있습니다.If the app has its own PIN user experience, you might want to disable it if the IT administrator has configured the SDK to prompt for an app PIN. IT 관리자가 이 앱에 앱 PIN 정책을 배포했는지 확인하려면 현재 최종 사용자에 대해 다음 메소드를 호출하세요.To determine if the IT administrator has deployed the app PIN policy to this app, for the current end user, call the following method:


MAMPolicyManager.getPolicy(currentActivity).getIsPinRequired();

예제: 기본 Intune 사용자 확인Example: Determine the primary Intune user

AppPolicy에서 노출되는 API 외에 MAMUserInfo 인터페이스 안에서 정의된 getPrimaryUser() API에 의해서도 사용자 계정 이름(UPN)이 노출됩니다.In addition to the APIs exposed in AppPolicy, the user principal name (UPN) is also exposed by the getPrimaryUser() API defined inside the MAMUserInfo interface. UPN을 가져오려면 다음을 호출합니다.To get the UPN, call the following:

MAMComponents.get(MAMUserInfo.class).getPrimaryUser();

예제: 앱과 디바이스 또는 클라우드 스토리지 위치 간 데이터 전송Example: Data transfer between apps and device or cloud storage locations

대부분 앱은 최종 사용자가 로컬 파일 스토리지 또는 클라우드 스토리지 서비스에 데이터를 저장하거나 여기에서 데이터를 열 수 있도록 하는 기능을 구현합니다.Many apps implement features that allow the end user to save data to or open data from local file storage or cloud storage services. Intune App SDK에서는 IT 관리자가 조직에 적합하다고 판단하는 대로 정책 제한을 적용하여 데이터 수신 및 유출을 방지할 수 있습니다.The Intune App SDK allows IT administrators to protect against data ingress and leakage by applying policy restrictions as they see fit in their organization.

이 기능을 사용하려면 앱 참여가 필요합니다.App participation is needed to enable the feature. 앱에서 직접 개인 또는 클라우드 위치에 저장하도록 허용 ‘또는’ 앱으로 직접 데이터를 열도록 허용하는 경우에는 IT 관리자가 특정 위치에 저장하거나 해당 위치에서 여는 작업을 허용할지 여부를 제어할 수 있도록 각 기능을 구현해야 합니다.If your app allows saving to personal or cloud locations directly from the app or allows for data to be opened directly into the app, you must implement the respective feature to ensure that the IT administrator can control whether saving to / opening from a location is allowed.

디바이스 또는 클라우드 스토리지에 저장Saving to device or cloud storage

아래 API는 현재 Intune 관리자의 정책에 따라 개인 저장소에 저장하는 작업이 허용되는지 여부를 앱에 알립니다.The API below lets the app know whether saving to a personal store is allowed by the current Intune administrator's policy.

정책이 적용되는지 여부를 확인하기 위해 다음을 호출합니다.To determine if the policy is enforced, make the following call:

MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(
SaveLocation service, String username);

service 매개 변수는 다음 SaveLocation 값 중 하나여야 합니다.The service parameter must be one of the following SaveLocation values:

  • SaveLocation.ONEDRIVE_FOR_BUSINESS
  • SaveLocation.SHAREPOINT
  • SaveLocation.LOCAL
  • SaveLocation.ACCOUNT_DOCUMENT
  • SaveLocation.OTHER

ACCOUNT_DOCUMENT 또는 OTHERgetIsSaveToLocationAllowed에 전달해야 하는지 결정하기 위한 자세한 내용은 알 수 없거나 목록에 없는 위치를 참조하세요.For determining whether ACCOUNT_DOCUMENT or OTHER should be passed to getIsSaveToLocationAllowed see Unknown or unlisted locations for more information.

username 매개 변수에 관한 자세한 내용은 데이터 전송용 사용자 이름을 참조하세요.For the username parameter, see Username for data transfer for more information.

사용자 정책에서 다양한 위치에 데이터를 저장하도록 허용하는지를 결정하는 이전 메소드는 동일한 AppPolicy 클래스에 있는 getIsSaveToPersonalAllowed()입니다.The previous method of determining whether a user’s policy allowed them to save data to various locations was getIsSaveToPersonalAllowed() within the same AppPolicy class. 이 함수는 이제 더 이상 사용되지 않음 이므로 사용하지 않아야 합니다. 다음 호출은 getIsSaveToPersonalAllowed()에 해당합니다.This function is now deprecated and should not be used, the following invocation is equivalent to getIsSaveToPersonalAllowed():

MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(SaveLocation.LOCAL, null);

로컬 또는 클라우드 스토리지 위치에서 데이터 열기Opening data from a local or cloud storage location

아래 API는 현재 Intune 관리자의 정책에 따라 개인 저장소에 여는 작업이 허용되는지 여부를 앱에 알립니다.The API below lets the app know whether opening from a personal store is allowed by the current Intune administrator's policy.

정책이 적용되는지 여부를 확인하기 위해 다음을 호출합니다.To determine if the policy is enforced, make the following call:

MAMPolicyManager.getPolicy(currentActivity).getIsOpenFromLocationAllowed(
OpenLocation location, String username);

location 매개 변수는 다음 OpenLocation 값 중 하나여야 합니다.The location parameter must be one of the following OpenLocation values:

  • OpenLocation.ONEDRIVE_FOR_BUSINESS
  • OpenLocation.SHAREPOINT
  • OpenLocation.CAMERA
  • OpenLocation.LOCAL
  • OpenLocation.ACCOUNT_DOCUMENT
  • OpenLocation.OTHER

앱이 카메라에서 데이터를 열 경우 OpenLocation.CAMERA 위치가 전달되어야 합니다.The OpenLocation.CAMERA location should be passed in when the app is opening data from the camera. 앱이 로컬 디바이스의 외부 스토리지에서 데이터를 열 경우 OpenLocation.LOCAL 위치가 전달되어야 합니다.The OpenLocation.LOCAL location should be passed in when the app is opening data from the external storage on the local device. 앱이 앱에 로그인된 AAD 계정에 속하는 데이터를 열 경우 OpenLocation.ACCOUNT_DOCUMENT 위치가 전달되어야 합니다.The OpenLocation.ACCOUNT_DOCUMENT location should be passed in when the app is opening data that belongs to an AAD account signed into the app.

ACCOUNT_DOCUMENT 또는 OTHERgetIsOpenFromLocationAllowed에 전달해야 하는지 결정하기 위한 자세한 내용은 알 수 없거나 목록에 없는 위치를 참조하세요.For determining whether ACCOUNT_DOCUMENT or OTHER should be passed to getIsOpenFromLocationAllowed see Unknown or unlisted locations for more information.

username 매개 변수에 관한 자세한 내용은 데이터 전송용 사용자 이름을 참조하세요.For the username parameter, see Username for data transfer for more information.

알 수 없거나 목록에 없는 위치Unknown or unlisted locations

원하는 위치가 SaveLocation 또는 OpenLocation 열거형에 나열되지 않거나 알 수 없는 경우에는 service/location 매개 변수인 ACCOUNT_DOCUMENTOTHER의 두 가지 옵션이 있습니다.When the desired location is not listed in the SaveLocation or OpenLocation enums or it is unknown there are two options for the service/location parameter, ACCOUNT_DOCUMENT and OTHER. 데이터가 앱에 로그인된 AAD 계정에 속하지만 ONEDRIVE_FOR_BUSINESS 또는 SHAREPOINT가 아닌 경우 ACCOUNT_DOCUMENT를 사용해야 하지만, 이 경우 이외에는 OTHER를 사용해야 합니다.ACCOUNT_DOCUMENT should be used when the data belongs to an AAD account signed into the app, but is not ONEDRIVE_FOR_BUSINESS or SHAREPOINT whereas OTHER should be used when that is not the case.

관리되는 계정과 관리되는 계정의 UPN을 공유하는 계정을 명확하게 구분하는 것이 중요합니다.It is important to make the distinction clear between the managed account and an account that shares the managed account's UPN. 예를 들어 UPN “user@contoso.com”으로 OneDrive에 로그인한 관리되는 계정은 UPN “user@contoso.com”으로 Dropbox에 로그인한 계정과 같지 않습니다.For example, a managed account with UPN "user@contoso.com" signed into OneDrive is not the same as an account with UPN "user@contoso.com" signed into Dropbox. 관리되는 계정(예: OneDrive에 로그인한 “user@contoso.com”)을 사용하여 알 수 없거나 목록에 없는 서비스에 액세스하는 경우 ACCOUNT_DOCUMENT 위치로 표시되어야 합니다.If an unknown or unlisted service is accessed by signing into the managed account (e.g. "user@contoso.com" signed into OneDrive), it should be represented by the ACCOUNT_DOCUMENT location. 알 수 없거나 목록에 없는 서비스가 다른 계정(예: Dropbox에 로그인한 “user@contoso.com)을 통해 로그인하는 경우 관리되는 계정으로 위치에 액세스하지 않으며 OTHER 위치로 표시되어야 합니다.If the unknown or unlisted service signs in through another account (e.g. "user@contoso.com" signed into Dropbox), it is not accessing the location with a managed account and should be represented by the OTHER location.

데이터 전송용 사용자 이름Username for data transfer

저장 정책을 검사하는 경우 username은 저장되는 클라우드 서비스와 연결된 UPN/사용자 이름/메일이어야 합니다(저장되는 문서를 소유한 사용자와 반드시 같아야 하는 것은 ‘아님’).When checking the save policy, the username should be the UPN/username/email associated with the cloud service being saved to (not necessarily the same as the user owning the document being saved). SaveLocation.LOCAL은 클라우드 서비스가 아니므로 항상 null 사용자 이름 매개 변수와 함께 사용해야 합니다.SaveLocation.LOCAL is not a cloud service and so should always be used with a null username parameter.

열기 정책을 검사하는 경우 username은 열리는 파일 또는 클라우드 서비스와 연결된 UPN/사용자 이름/이메일이어야 합니다.When checking the open policy, the username should be the UPN/username/email associated with the file or cloud service being opened from. OpenLocation.LOCAL은 클라우드 서비스 위치가 아니지만 소유권을 나타내기 위해 ID로 태그를 지정할 수 있습니다.OpenLocation.LOCAL is not a cloud service location, but may be tagged with an identity to indicate ownership. 로컬 스토리지에서 파일을 열 때 파일 소유자의 save-as 정책에서 다른 사용자가 파일을 열도록 허용하거나 허용하지 않을 수 있기 때문에 파일 소유자를 항상 고려해야 합니다.When opening a file from local storage, the file owner must always be considered, because the file owner's save-as policy may or may not permit other users to open the file. ID 태그가 지정된 파일의 경우 username은 파일 소유자의 ID여야 합니다.For identity-tagged files, username should be the the file owner's identity. ID 태그가 없는 파일의 경우 username은 null이어야 합니다.For files without an identity tag, username should be null.

참고

편의상 로컬 스토리지에 있는 파일에 File 매개 변수를 사용하는 AppPolicy.isOpenFromLocalStorageAllowed SDK 메서드가 제공됩니다.For convenience, we provide an SDK method AppPolicy.isOpenFromLocalStorageAllowed that takes a File parameter for a file in local storage. 이 메서드는 File에서 파일 소유자의 username 구문 분석을 처리하는 것을 제외하면 정책 적용 면에서 AppPolicy.isOpenFromLocationAllowed(OpenLocation.LOCAL, username) 호출과 기능상 동일합니다.It terms of enforcing policy, is functionally identical to calling AppPolicy.isOpenFromLocationAllowed(OpenLocation.LOCAL, username) except it handles parsing the file owner's username from the File.

OpenLocation.CAMERA는 클라우드 서비스 위치가 아니므로 항상 null 사용자 이름 매개 변수와 함께 사용해야 합니다.OpenLocation.CAMERA is not a cloud service location and so should always be used with a null username parameter.

다음 위치에는 항상 AAD UPN과 클라우드 서비스 사용자 이름(ONEDRIVE_FOR_BUSINESS, SHAREPOINTACCOUNT_DOCUMENT) 간 매핑을 포함하는 사용자 이름이 필요합니다.The following locations will always expect a username that contains a mapping between the AAD UPN and the cloud service username: ONEDRIVE_FOR_BUSINESS, SHAREPOINT, and ACCOUNT_DOCUMENT.

AAD UPN와 클라우드 서비스 사용자 이름 간에 매핑이 없거나 사용자 이름을 알 수 없으면 null을 사용합니다.If a mapping between the AAD UPN and the cloud service username does not exist or the username is not known use null.

차단된 대화 상자 공유Sharing blocked dialog

이 SDK는 MAM 정책에 의해 데이터 전송 작업이 차단되었음을 사용자에게 알리는 대화 상자를 제공합니다.The SDK provides a dialog to notify the user that a data transfer action was blocked by MAM policy.

[isSaveToAllowedForLocation] 또는 [isOpenFromAllowedForLocation] API 호출로 인해 저장/열기 작업이 차단되는 경우 사용자에게 대화 상자가 표시되어야 합니다.The dialog should be displayed to the user when the [isSaveToAllowedForLocation] or [isOpenFromAllowedForLocation] API call results in the save/open action being blocked. 대화 상자는 일반 메시지를 표시하며 해제될 때 API를 호출한 Activity로 반환됩니다.The dialog displays a generic message and will return to the Activity that called it when dismissed.

대화 상자를 표시하려면 다음을 호출합니다.To display the dialog, make the following call:

MAMUIHelper.showSharingBlockedDialog(currentActivity)

파일 공유 허용Allow for file sharing

퍼블릭 스토리지 위치에 저장할 수 없는 경우 앱은 사용자가 파일을 앱 프라이빗 스토리지로 다운로드하고 시스템 선택기로 열어서 파일을 볼 수 있도록 해야 합니다.If saving to public storage locations is not allowed your app should still allow for the user to view files by downloading them to app private storage and then opening them with the system chooser.

예제: 조직 데이터를 포함하는 알림을 제한해야 하는지 결정Example: Determine if notifications with organization data need to be restricted

앱에 알림이 표시되는 경우 알림을 표시하기 전에 알림과 연결된 사용자에 대한 알림 제한 정책을 확인해야 합니다.If your app displays notifications, you must check the notification restriction policy for the user associated with the notification before showing the notification. 정책이 적용되는지 여부를 확인하기 위해 다음을 호출합니다.To determine if the policy is enforced, make the following call.

NotificationRestriction notificationRestriction =
    MAMPolicyManager.getPolicyForIdentity(notificationIdentity).getNotificationRestriction();

제한이 BLOCKED인 경우 앱은 이 정책과 연결된 사용자에 대한 알림을 표시하지 않아야 합니다.If the restriction is BLOCKED, the app must not show any notifications for the user associated with this policy. BLOCK_ORG_DATA인 경우 앱은 조직 데이터를 포함하지 않는 수정된 알림을 표시해야 합니다.If BLOCK_ORG_DATA, the app must show a modified notification that does not contain organization data. UNRESTRICTED인 경우 모든 알림이 허용됩니다.If UNRESTRICTED, all notifications are allowed.

getNotificationRestriction이 호출되지 않은 경우 MAM SDK는 단일 ID 앱에 대한 알림을 자동으로 제한하도록 최대한 노력합니다.If getNotificationRestriction is not invoked, the MAM SDK will make a best effort to restrict notifications automatically for single-identity apps. 자동 차단이 사용되고 BLOCK_ORG_DATA가 설정된 경우에는 알림이 표시되지 않습니다.If automatic blocking is enabled and BLOCK_ORG_DATA is set, the notification will not be shown at all. 보다 세분화된 제어를 위해 getNotificationRestriction의 값을 확인하고 앱 알림을 적절하게 수정합니다.For more fine-grained control, check the value of getNotificationRestriction and modify app notifications appropriately.

조건부 시작 제한 무시Bypassing conditional launch restrictions

매우 드문 경우지만 특정 작업의 조건부 시작 제한을 무시해야 할 수 있습니다.In very rare scenarios, it may be necessary for conditional launch restrictions to be bypassed for a particular Activity. 예를 들어 전화 걸기 앱은 사용자가 PIN을 먼저 입력하지 않아도 들어오는 호출에 대한 응답이 가능해야 하는 경우가 있습니다.For example, a dialer app may want to allow for an incoming call to be answered without the user having to enter their PIN first. 다중 ID 앱의 경우(아래 다중 ID 참조) 작업에 연결된 ID를 관리되지 않는 ID로 설정하여 이 작업을 수행할 수 있습니다.For a multi-identity app (see Multi-Identity below), this can be accomplished by setting the identity associated with the Activity to an unmanaged identity. 단일 ID 앱에서 비슷한 조건부 시작 제한 무시가 가능하게 하기 위해 MAMPolicyManager를 사용하여 무시하도록 작업을 등록할 수 있습니다.To allow for a similar bypass of conditional launch restrictions in a single-identity app, an Activity can be registered for bypass with the MAMPolicyManager.

MAMPolicyManager.bypassConditionalLaunchChecks(this);

조건부 시작 검사를 효과적으로 무시하려면 onMAMCreate()를 호출하기 전에 이 메서드를 호출해야 합니다.This method must be called before onMAMCreate() is called, in order to effectively bypass the conditional launch checks. 예를 들어 작업의 생성자 또는 재정의에서 attachBaseContext()로 메서드가 호출될 수 있습니다.For example, it could be called from the Activity's constructor, or from an override to attachBaseContext(). attachBaseContext()를 재정의하도록 선택하는 경우 슈퍼클래스의 attachBaseContext()를 호출해야 합니다. 그렇지 않으면 데이터 누수가 발생할 수 있습니다.If you choose to override attachBaseContext(), remember to call the superclass's attachBaseContext(), or data leaks could occur.

참고

이 메서드는 조건부 시작 정책 검사의 무시를 허용하므로 Microsoft에 문의하여 앱의 원하는 동작을 달성할 수 있는 다른 지원되는 방법이 없음을 확인한 후에만 사용 해야 합니다.Because this method allows the bypass of conditional launch policy checks, it should only be used after consulting with Microsoft to confirm there is no other supported way to achieve your app’s desired behavior.

SDK에서 알림 등록Register for notifications from the SDK

개요Overview

Intune 앱 SDK를 사용하면 IT 관리자가 배포하는 선택적 초기화와 같은 특정 정책의 동작을 앱에서 제어할 수 있습니다.The Intune App SDK allows your app to control the behavior of certain policies, such as selective wipe, when they are deployed by the IT administrator. IT 관리자가 해당 정책을 배포하면 Intune 서비스가 알림을 SDK에 보냅니다.When an IT administrator deploys such a policy, the Intune service sends down a notification to the SDK.

앱은 MAMNotificationReceiver를 만들고 MAMNotificationReceiverRegistry에 등록하여 SDK에서 보내는 알림에 등록해야 합니다.Your app must register for notifications from the SDK by creating a MAMNotificationReceiver and registering it with MAMNotificationReceiverRegistry. 다음 예제에 나온 대로 App.onCreate에서 원하는 수신기 및 알림 유형을 제공하면 됩니다.This is done by providing the receiver and the type of notification desired in App.onCreate, as the example below illustrates:

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

MAMNotificationReceiverMAMNotificationReceiver

MAMNotificationReceiver 인터페이스는 Intune 서비스에서 보내는 알림을 수신합니다.The MAMNotificationReceiver interface simply receives notifications from the Intune service. 일부 알림은 SDK에서 직접 처리되지만, 일부 알림의 경우 앱 참여가 필요합니다.Some notifications are handled by the SDK directly, while others require the app's participation. 앱은 알림에서 true 또는 false를 반환 해야 합니다.An app must return either true or false from a notification. 알림의 결과로 시도한 일부 작업에서 오류가 발생하지 않는 한 앱은 항상 true를 반환해야 합니다.It must always return true unless some action it tried to take as a result of the notification failed.

  • 이 오류는 Intune 서비스에 보고될 수 있습니다.This failure may be reported to the Intune service. 예를 들어 IT 관리자가 초기화를 시작한 후 앱에서 사용자 데이터를 초기화하지 못한 경우 보고될 수 있습니다.An example of a scenario to report is if the app fails to wipe user data after the IT administrator initiates a wipe.

참고

해당 콜백이 UI 스레드에서 실행되고 있지 않기 때문에 MAMNotificationReceiver.onReceive에서 차단해도 안전합니다.It is safe to block in MAMNotificationReceiver.onReceive because its callback is not running on the UI thread.

알림 유형Types of notifications

다음과 같은 알림이 앱에 전송되고, 일부 알림의 경우 앱 참여가 필요할 수 있습니다.The following notifications are sent to the app and some of them may require app participation:

  • WIPE_USER_DATA: 이 알림은 MAMUserNotification을 통해 전송됩니다.WIPE_USER_DATA: This notification is sent in a MAMUserNotification. 이 알림이 수신되면 앱은 MAMUserNotification.getUserIdentity()에서 관리형 ID와 연결된 모든 데이터를 ‘삭제해야’ 합니다.When this notification is received, the app must delete all data associated with the managed identity (from MAMUserNotification.getUserIdentity()). 알림은 앱이 unregisterAccountForMAM을 호출하거나, IT 관리자가 초기화를 시작하거나, 관리자에게 필요한 조건부 액세스 정책이 충족되지 않는 경우를 포함한 다양한 이유로 발생할 수 있습니다.The notification may occur for diverse reasons, including when your app calls unregisterAccountForMAM, when an IT admin initiates a wipe, or when admin-required conditional access policies are not satisfied. 앱이 이 알림에 등록하지 않으면 기본 초기화 동작이 수행됩니다.If your app does not register for this notification, default wipe behavior will be performed. 기본 동작은 단일 ID 앱의 모든 파일 또는 다중 ID 앱에 관리형 ID를 사용하여 트리거된 모든 파일을 삭제합니다.The default behavior will delete all files for a single-identity app or all files tagged with the managed identity for a multi-identity app. 이 알림은 UI 스레드에서 전송되지 않습니다.This notification will never be sent on the UI thread.

  • WIPE_USER_AUXILIARY_DATA: Intune 앱 SDK에서 기본 선택적 초기화 동작을 수행하며 초기화 발생 시 일부 보조 데이터도 제거되도록 하려면 앱에서 이 알림을 등록할 수 있습니다.WIPE_USER_AUXILIARY_DATA: Apps can register for this notification if they'd like the Intune App SDK to perform the default selective wipe behavior, but would still like to remove some auxiliary data when the wipe occurs. 이 알림은 단일 ID 앱에는 사용할 수 없습니다. 다중 ID 앱에만 보내집니다.This notification is not available to single identity-apps -- it will only be sent to multi-identity apps. 이 알림은 UI 스레드에서 전송되지 않습니다.This notification will never be sent on the UI thread.

  • REFRESH_POLICY: 이 알림은 MAMUserNotification을 통해 전송됩니다.REFRESH_POLICY: This notification is sent in a MAMUserNotification. 이 알림이 수신되면 앱에서 캐싱한 Intune 정책 결정 사항을 무효화하고 업데이트해야 합니다.When this notification is received, any Intune policy decisions cached by your app must be invalidated and updated. 앱에서 정책 가정을 저장하지 않는 경우 이 알림에 등록할 필요가 없습니다.If your app does not store any policy assumptions, it need not register for this notification. 이 알림이 전송될 스레드에 대한 보장은 없습니다.No guarantees are made as to what thread this notification will be sent on.

  • REFRESH_APP_CONFIG: 이 알림은 MAMUserNotification을 통해 전송됩니다.REFRESH_APP_CONFIG: This notification is sent in a MAMUserNotification. 이 알림이 수신되면 캐싱된 애플리케이션 구성 데이터를 무효화하고 업데이트해야 합니다.When this notification is received, any cached Application Configuration data must be invalidated and updated. 이 알림이 전송될 스레드에 대한 보장은 없습니다.No guarantees are made as to what thread this notification will be sent on.

  • MANAGEMENT_REMOVED: 이 알림은 MAMUserNotification을 통해 전송되며, 앱이 비관리 상태가 될 것임을 알립니다.MANAGEMENT_REMOVED: This notification is sent in a MAMUserNotification and informs the app that it is about to become unmanaged. 비관리 상태가 되면 더 이상 암호화된 파일을 읽거나, MAMDataProtectionManager로 암호화된 데이터를 읽거나, 암호화된 클립보드와 상호 작용하거나, 관리 앱 에코시스템에 참여할 수 없습니다.Once unmanaged, it will no longer be able to read encrypted files, read data encrypted with MAMDataProtectionManager, interact with the encrypted clipboard, or otherwise participate in the managed-app ecosystem. 자세한 내용은 아래를 참조하세요.See further details below. 이 알림은 UI 스레드에서 전송되지 않습니다.This notification will never be sent on the UI thread.

  • MAM_ENROLLMENT_RESULT: 이 알림은 APP-WE 등록 시도가 완료되었으니 해당 시도의 상태를 입력하라고 앱에 알리기 위해 MAMEnrollmentNotification을 통해 전송됩니다.MAM_ENROLLMENT_RESULT: This notification is sent in a MAMEnrollmentNotification to inform the app that an APP-WE enrollment attempt has completed and to provide the status of that attempt. 이 알림이 전송될 스레드에 대한 보장은 없습니다.No guarantees are made as to what thread this notification will be sent on.

  • COMPLIANCE_STATUS: 이 알림은 규정 준수 수정 시도의 결과를 앱에 알리기 위해 MAMComplianceNotification을 통해 전송됩니다.COMPLIANCE_STATUS: This notification is sent in a MAMComplianceNotification to inform the app of the result of a compliance remediation attempt. 이 알림이 전송될 스레드에 대한 보장은 없습니다.No guarantees are made as to what thread this notification will be sent on.

참고

앱에서 WIPE_USER_DATAWIPE_USER_AUXILIARY_DATA 알림 모두를 둘 다 등록할 수 없습니다.An app should never register for both the WIPE_USER_DATA and WIPE_USER_AUXILIARY_DATA notifications.

MANAGEMENT_REMOVEDMANAGEMENT_REMOVED

MANAGEMENT_REMOVED 알림은 이전의 정책 관리형 사용자가 더 이상 Intune MAM 정책을 통해 관리되지 않는다는 것을 나타냅니다.The MANAGEMENT_REMOVED notification indicates that a previously policy-managed user will no longer be managed by Intune MAM policy. 이로 인해 사용자 데이터를 지우거나 사용자를 로그아웃할 필요는 없습니다(데이터를 지워야 하는 경우 WIPE_USER_DATA 알림이 전송됨).This does not require wiping user data or signing out the user (if a wipe were required, a WIPE_USER_DATA notification would be sent). 대부분의 앱은 이 알림을 처리할 필요가 전혀 없지만, MAMDataProtectionManager를 사용하는 앱은 이 알림에 특별히 주의해야 합니다.Many apps may not need to handle this notification at all, however apps which use MAMDataProtectionManager should take special note of this notification.

MAM이 앱의 MANAGEMENT_REMOVED 수신기를 호출하면 다음 사항이 적용됩니다.When MAM calls the app's MANAGEMENT_REMOVED receiver, the following will be true:

  • MAM은 앱에 속한 이전에 암호화된 파일(하지만 보호되지 않는 데이터 버퍼)을 이미 해독했습니다.MAM has already decrypted previously encrypted files (but not protected data buffers) belonging to the app. 앱에 직접 속하지 않은 SD 카드의 공개 위치(예: Documents 또는 Download 폴더)에 있는 파일은 해독되지 않습니다.Files in public locations on the sdcard that don't directly belong to the app (e.g. the Documents or Download folders) are not decrypted.
  • 수신기 메서드(또는 수신기가 시작된 후 실행되는 다른 코드)가 만든 새 파일 또는 보호되는 데이터 버퍼는 암호화되지 않습니다.New files or protected data buffers created by the receiver method (or any other code running after the receiver starts) will not be encrypted.
  • 앱은 여전히 암호화 키에 액세스할 수 있으므로 암호 해독 데이터 버퍼 같은 작업은 성공합니다.The app still has access to encryption keys, so operations such as decryption data buffers will succeed.

앱의 수신기가 반환되면 앱은 더 이상 암호화 키에 액세스할 수 없습니다.Once your app's receiver returns, it will no longer have access to encryption keys.

MSAL(Microsoft 인증 라이브러리) 구성Configure Microsoft Authentication Library (MSAL)

참고

Azure ADAL(Active Directory 인증 라이브러리)은 사용되지 않습니다.Azure Active Directory Authentication Library (ADAL) is deprecated. 자세한 내용은 MSAL(Microsoft 인증 라이브러리)을 사용하도록 애플리케이션 업데이트를 참조하세요.For more information, see Update your applications to use Microsoft Authentication Library (MSAL). ADAL에서 MSAL로 앱을 마이그레이션하려면 Android ADAL을 MSAL로 마이그레이션ADAL과 MSAL의 차이점을 참조하세요.To migrate your app from ADAL to MSAL, see Migrate Android ADAL to MSAL and Differences between ADAL and MSAL.

먼저 GitHub의 MSAL 리포지토리에 있는 MSAL 통합 지침을 읽어 보세요.First, please read the MSAL integration guidelines found in the MSAL repository on GitHub. 자세한 내용은 MSAL(Microsoft 인증 라이브러리) 개요MSAL Wiki를 참조하세요.For more information, see Overview of Microsoft Authentication Library (MSAL) and the MSAL Wiki.

ADAL 사용 중단으로 인해 앱이 MSAL을 통합해야 합니다.Due to ADALs deprecation, apps should integrate with MSAL. 다만 SDK는 해당 인증 및 조건부 시작 시나리오에 여전히 ADAL을 사용합니다.However, the SDK still relies on ADAL for its authentication and conditional launch scenarios. 필요한 구성 값은 AndroidManifest 메타데이터를 통해 SDK에 전달됩니다.The necessary configuration values are communicated to the SDK via AndroidManifest metadata.

Intune의 인증 정책이 제대로 적용되도록 하려면 AndroidManifest.xml의 앱 노드에 다음을 추가합니다.To ensure Intune's authentication policy can be applied properly, add the following to the app node in AndroidManifest.xml. 이러한 일부 구성은 앱에서 일반적으로 인증에 MSAL을 사용하는 경우에만 필요합니다(아래의 일반적인 MSAL 구성 참조). 이 경우 앱이 AAD에 등록하는 데 사용하는 특정한 값이 필요합니다.Some of these configurations are only required (see common MSAL configurations below) if your app uses MSAL for authentication in general; in that case, you will need the specific values your app uses to register itself with AAD. 이것은 AAD에서 별개의 두 등록 값(앱의 값 및 SDK의 값)을 인식하기 때문에 최종 사용자에게 인증을 요구하는 메시지가 두 번 나타나는 일이 없도록 하려는 것입니다.This is done to ensure that the end user does not get prompted for authentication twice, due to AAD recognizing two separate registration values: one from the app and one from the SDK.

<meta-data
    android:name="com.microsoft.intune.mam.aad.Authority"
    android:value="https://AAD authority/" />
<meta-data
    android:name="com.microsoft.intune.mam.aad.ClientID"
    android:value="your-client-ID-GUID" />
<meta-data
    android:name="com.microsoft.intune.mam.aad.NonBrokerRedirectURI"
    android:value="your-redirect-URI" />
<meta-data
    android:name="com.microsoft.intune.mam.aad.SkipBroker"
    android:value="[true | false]" />

MSAL 메타데이터MSAL metadata

  • Authority 는 사용 중인 AAD 권한입니다.Authority is the AAD authority in use. 이 값이 없으면 AAD 공용 환경이 사용됩니다.If this value is absent, the AAD public environment is used.

    참고

    애플리케이션이 소버린 클라우드를 인식하는 경우 이 필드를 설정하지 않습니다.Do not set this field if your application is sovereign cloud aware.

  • ClientID 는 사용할 AAD ClientID(애플리케이션 ID라고도 함)입니다.ClientID is the AAD ClientID (also known as Application ID) to be used. Azure AD에 등록된 경우 자체 앱의 ClientID를 사용하거나, MSAL을 통합하지 않은 경우 기본 등록을 이용해야 합니다.You should use your own app's ClientID if it is registered with Azure AD or leverage Default Enrollment if it does not integrate MSAL.

  • NonBrokerRedirectURI 는 broker가 없는 경우에 사용할 AAD 리디렉션 URI입니다.NonBrokerRedirectURI is the AAD redirect URI to use in broker-less cases. 지정된 값이 없으면 기본값인 urn:ietf:wg:oauth:2.0:oob가 사용됩니다.If none is specified, a default value of urn:ietf:wg:oauth:2.0:oob is used. 이 기본값은 대부분의 앱에 적합합니다.This default is suitable for most apps.

    • NonBrokerRedirectURI는 SkipBroker가 "true"인 경우에 사용됩니다.The NonBrokerRedirectURI is only used when SkipBroker is "true".
  • SkipBroker 는 기본 MSAL SSO 참여 동작을 재정의하는 데 사용됩니다.SkipBroker is used to override the default MSAL SSO participation behavior. SkipBroker는 ClientID를 지정하는 앱에 대해서만 지정해야 하며, 조정된 인증/디바이스 수준 SSO를 지원하지 않습니다.SkipBroker should only be specified for apps that specify a ClientID and do not support brokered authentication/device-wide SSO. 이 경우 "true"로 설정해야 합니다.In this case it should be set to "true". 대부분의 앱은 SkipBroker 매개 변수를 설정하면 안 됩니다.Most apps should not set the SkipBroker parameter.

    • ClientID는 반드시 매니페스트에서 지정하여 SkipBroker 값을 지정해야 합니다.A ClientID must be specified in the manifest to specify a SkipBroker value.

    • ClientID가 지정되면 기본값은 "false"입니다.When a ClientID is specified, the default value is "false".

    • SkipBroker가 "true"이면 NonBrokerRedirectURI가 사용됩니다.When SkipBroker is "true," the NonBrokerRedirectURI will be used. MSAL을 통합하지 않는(따라서 ClientID가 없는) 앱도 기본적으로 "true"로 설정됩니다.Apps that do not integrate MSAL (and therefore have no ClientID) will also default to "true".

일반적인 MSAL 구성Common MSAL configurations

MSAL로 앱을 구성할 수 있는 일반적인 방법은 다음과 같습니다.The following are common ways an app can be configured with MSAL. 앱의 구성을 찾아 MSAL 메타데이터 매개 변수(위에 설명됨)를 필요한 값으로 설정해야 합니다.Find your app's configuration and make sure to set the MSAL metadata parameters (explained above) to the necessary values. 모든 경우에 기본이 아닌 환경에 필요한 경우 Authority를 지정할 수 있습니다.In all cases, the Authority may be specified if desired for non-default environments. 지정하지 않으면 공개 프로덕션 AAD 기관이 사용됩니다.If not specified, the public production AAD authority will be used.

1. 앱이 MSAL 또는 ADAL을 통합하지 않는 경우1. App does not integrate MSAL or ADAL

MSAL/ADAL 메타데이터가 매니페스트에 있으면 안 됩니다.MSAL/ADAL metadata must not be present in the manifest.

2. 앱이 MSAL을 통합하는 경우2. App integrates MSAL

필수 MSAL 매개 변수Required MSAL parameter Value
ClientIDClientID 앱의 ClientID(앱을 등록할 때 Azure AD에서 생성함)The app's ClientID (generated by Azure AD when the app is registered)

필요한 경우 기관을 지정할 수 있습니다.Authority may be specified if necessary.

다음과 같이 앱을 Azure AD에 등록하고 앱 보호 정책 서비스에 대한 액세스 권한을 앱에 제공해야 합니다.You must register your app with Azure AD and give your app access to the app protection policy service:

조건부 액세스를 위한 요구 사항도 참조하세요.Also see the requirements for Conditional Access below.

3. 앱이 MSAL을 통합하지만 조정된 인증/디바이스 수준 SSO를 지원하지 않음3. App integrates MSAL but does not support brokered authentication/device-wide SSO

필수 MSAL 매개 변수Required MSAL parameter Value
ClientIDClientID 앱의 ClientID(앱을 등록할 때 Azure AD에서 생성함)The app's ClientID (generated by Azure AD when the app is registered)
SkipBrokerSkipBroker TrueTrue

필요한 경우 Authority와 NonBrokerRedirectURI를 지정할 수 있습니다.Authority and NonBrokerRedirectURI may be specified if necessary.

조건부 액세스Conditional Access

조건부 액세스(CA)는 AAD 리소스에 대한 액세스 제어에 사용할 수 있는 Azure Active Directory 기능입니다.Conditional Access (CA) is an Azure Active Directory feature which can be used to control access to AAD resources. Intune 관리자는 Intune에서 관리하는 디바이스 또는 앱으로부터의 리소스 액세스만 허용하는 CA 규칙을 정의할 수 있습니다.Intune administrators can define CA rules which allow resource access only from devices or apps which are managed by Intune. 앱이 적절한 때 리소스에 액세스할 수 있게 하려면 아래 단계를 따라야 합니다.In order to ensure that your app is able to access resources when appropriate, it is necessary to follow the steps below. 앱이 AAD 액세스 토큰을 획득하지 않아도 되거나, CA로 보호할 수 없는 리소스에만 액세스하는 경우 이 단계를 생략할 수 있습니다.If your app does not acquire any AAD access tokens, or accesses only resources which cannot be CA-protected, you may skip these steps.

  1. [Azure Active Directory에 애플리케이션을 등록]합니다.Register your application with Azure Active Directory.
    • 그러면 애플리케이션의 Client ID가 생성됩니다.This will generate a Client ID for your application.
  2. MSAL 사용broker를 사용하도록 MSAL 구성의 단계를 수행합니다.Follow the steps for Using MSAL and Configure MSAL to use a broker.
  3. 앱이 MSAL을 통합하는 경우일반적인 MSAL 구성에 따라 매니페스트 메타데이터 매개 변수를 설정합니다(위 참조).Set the manifest meta-data parameters per Common MSAL configurations for App Integrates MSAL, see above.
  4. Microsoft Endpoint Manager 관리 센터에서 디바이스 기반 CA를 사용하도록 설정하고 다음을 확인하여 모든 것이 올바르게 구성되었는지 테스트합니다.Test that everything is configured properly by enabling device-based CA from the Microsoft Endpoint Manager admin center and confirming the following:
    • 앱에 로그인하면 Intune Company Portal 설치 및 등록을 위한 프롬프트 표시That sign-in to your app prompts for installation and enrollment of the Intune Company Portal
    • 등록 후 앱 로그인이 완료됩니다.That after enrollment, sign-in to your app completes successfully.
  5. 앱이 Intune APP SDK 통합을 탑재한 후에는 msintuneappsdk@microsoft.com에 문의하여 앱 기반 조건부 액세스 승인 앱 목록에 추가되게 합니다.Once your app has shipped Intune APP SDK integration, contact msintuneappsdk@microsoft.com to be added to the list of approved apps for app-based Conditional Access
  6. 앱이 승인 목록에 추가되면 앱 기반 CA를 구성하고 앱 로그인이 제대로 완료되는지 확인하여 유효성을 검사합니다.Once your app has been added to the approved list, validate by Configuring app-based CA and ensuring that sign-in to your app completes successfully.

디바이스 등록이 없는 앱 보호 정책App protection policy without device enrollment

개요Overview

디바이스 등록이 없는 Intune 앱 보호 정책(APP-WE 또는 MAM-WE라고도 함)은 Intune MDM에 디바이스를 등록하지 않고도 Intune에서 앱을 관리할 수 있도록 허용합니다.Intune app protection policy without device enrollment, also known as APP-WE or MAM-WE, allows apps to be managed by Intune without the need for the device to be enrolled Intune MDM. APP-WE는 디바이스 등록 유무에 상관없이 작동합니다.APP-WE works with or without device enrollment. 디바이스에 여전히 회사 포털을 설치해야 하지만, 사용자가 회사 포털에 로그인하여 디바이스를 등록하지 않아도 됩니다.The Company Portal is still required to be installed on the device, but the user does not need to sign into the Company Portal and enroll the device.

참고

모든 앱에서 디바이스 등록이 없는 앱 보호 정책을 지원해야 합니다.All apps are required to support app protection policy without device enrollment.

워크플로Workflow

앱에서 새 사용자 계정을 만들 때 Intune 앱 SDK에 관리할 계정을 등록해야 합니다.When an app creates a new user account, it should register the account for management with the Intune App SDK. SDK에서 APP-WE 서비스에 앱을 등록하는 세부 정보를 처리합니다. 실패가 발생하면 필요한 경우 적절한 간격으로 등록을 재시도해야 합니다.The SDK will handle the details of enrolling the app in the APP-WE service; if necessary, it will retry any enrollments at appropriate time intervals if failures occur.

사용자가 회사 콘텐츠에 액세스하지 못하게 차단해야 하는지 확인하기 위해 앱이 Intune 앱 SDK에서 등록된 사용자의 상태도 쿼리할 수 있습니다.The app can also query the Intune App SDK for the status of a registered user to determine if the user should be blocked from accessing corporate content. 관리를 위해 여러 계정을 등록할 수 있지만, 현재로서는 APP-WE 서비스를 통해 한 번에 한 계정만 등록할 수 있습니다.Multiple accounts may be registered for management, but currently only one account can be actively enrolled with the APP-WE service at a time. 즉, 앱에서 한 번에 한 계정만 앱 보호 정책을 받을 수 있습니다.This means only one account on the app can receive app protection policy at a time.

앱은 SDK 대신 MSAL(Microsoft 인증 라이브러리) 또는 Azure ADAL(Active Directory 인증 라이브러리)에서 적절한 액세스 토큰을 획득하는 콜백을 제공해야 합니다.The app is required to provide a callback to acquire the appropriate access token from the Microsoft Authentication Library (MSAL) or the Azure Active Directory Authentication Library (ADAL) on behalf of the SDK. 앱이 사용자 인증과 자체 액세스 토큰 획득을 위해 이미 MSAL 또는 ADAL을 사용하고 있다고 가정합니다.It is assumed that the app already uses MSAL or ADAL for user authentication and to acquire its own access tokens.

앱에서 계정을 완전히 제거하면 앱이 더 이상 해당 사용자에 대해 정책을 적용하지 않아야 함을 표시하도록 해당 계정을 등록 취소해야 합니다.When the app removes an account completely, it should unregister that account to indicate that the app should no longer apply policy for that user. 사용자가 MAM 서비스에 등록된 경우 사용자의 등록이 취소되고 앱이 초기화됩니다.If the user was enrolled in the MAM service, the user will be unenrolled and the app will be wiped.

앱 요구 사항 개요Overview of app requirements

APP-WE 통합을 구현하려면 앱에서 MAM SDK에 사용자 계정을 등록해야 합니다.To implement APP-WE integration, your app must register the user account with the MAM SDK:

  1. 앱은 MAMServiceAuthenticationCallback 인터페이스의 인스턴스를 구현하고 등록해야 합니다.The app must implement and register an instance of the MAMServiceAuthenticationCallback interface. 콜백 인스턴스는 앱의 수명 주기에서 최대한 빨리 등록해야 합니다(일반적으로 애플리케이션 클래스의 onMAMCreate() 메서드 사용).The callback instance should be registered as early as possible in the app's lifecycle (typically in the onMAMCreate() method of the application class).

  2. 사용자 계정이 만들어지고 사용자가 MSAL로 로그인하면 앱이 registerAccountForMAM을 호출해야 합니다.When a user account is created and the user successfully signs in with MSAL, the app must call registerAccountForMAM.

  3. 사용자 계정이 제거되면 앱에서 unregisterAccountForMAM을 호출하여 Intune 관리에서 계정을 제거해야 합니다.When a user account is removed, the app should call unregisterAccountForMAM to remove the account from Intune management.

    참고

    사용자가 임시로 앱에서 로그아웃하면 앱에서 unregisterAccountForMAM()을 호출하지 않아도 됩니다.If a user signs out of the app temporarily, the app does not need to call unregisterAccountForMAM(). 이 호출에서 초기화를 시작하여 사용자의 회사 데이터를 완전히 제거할 수 있습니다.The call may initiate a wipe to completely remove corporate data for the user.

MAMEnrollmentManagerMAMEnrollmentManager

필요한 모든 인증 및 등록 API는 MAMEnrollmentManager 인터페이스에 있습니다.All the necessary authentication and registration APIs can be found in the MAMEnrollmentManager interface. MAMEnrollmentManager에 대한 참조는 다음과 같이 얻을 수 있습니다.A reference to the MAMEnrollmentManager can be obtained as follows:

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

// make use of mgr

반환된 MAMEnrollmentManager 인스턴스는 null이 되지 않습니다.The MAMEnrollmentManager instance returned is guaranteed not to be null. API 메서드는 두 가지 범주, 즉 인증계정 등록 으로 나뉩니다.The API methods fall into two categories: authentication and account registration.

계정 인증Account authentication

이 섹션에서는 MAMEnrollmentManager의 인증 API 메서드와 해당 사용 방법에 대해 설명합니다.This section describes the authentication API methods in MAMEnrollmentManager and how to use them.

interface MAMServiceAuthenticationCallback {
    String acquireToken(String upn, String aadId, String resourceId);
}
void registerAuthenticationCallback(MAMServiceAuthenticationCallback callback);
void updateToken(String upn, String aadId, String resourceId, String token);
  1. SDK가 지정된 사용자와 리소스 ID의 AAD 토큰을 요청할 수 있으려면 앱이 MAMServiceAuthenticationCallback 인터페이스를 구현해야 합니다.The app must implement the MAMServiceAuthenticationCallback interface to allow the SDK to request an AAD token for the given user and resource ID. registerAuthenticationCallback 메서드를 호출하여 MAMEnrollmentManager에 콜백 인스턴스를 제공해야 합니다.The callback instance must be provided to the MAMEnrollmentManager by calling its registerAuthenticationCallback method. 앱 수명 주기 중 초기에 등록 재시도 또는 앱 보호 정책 새로 고침 체크인을 위해 토큰이 필요할 수 있으므로 콜백을 등록하는 데 이상적인 위치는 앱 MAMApplication 하위 클래스의 onMAMCreate() 메서드에 있습니다.A token may be needed early in the app lifecycle for enrollment retries or app protection policy refresh check-ins, so the ideal place to register the callback is in the onMAMCreate() method of the app's MAMApplication subclass.

  2. acquireToken 메서드는 지정된 사용자에 대해 요청된 리소스 ID의 액세스 토큰을 획득해야 합니다.The acquireToken method should acquire the access token for the requested resource ID for the given user. 요청된 토큰을 획득할 수 없으면 null을 반환해야 합니다.If it can't acquire the requested token, it should return null.

    참고

    올바른 토큰을 획득할 수 있도록 앱이 acquireToken()에 전달된 resourceIdaadId 매개 변수를 사용해야 합니다.Ensure that your app utilizes the resourceId and the aadId parameters passed to acquireToken() so that the correct token is acquired. resourceId를 사용하여 적절한 범위를 생성하고, aadId를 사용하여 올바른 계정을 전달해야 합니다.The resourceId should be used to generate the proper scopes and the aadId should be used to pass along the correct account.

    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 메서드를 호출하여 나중에 토큰을 제공할 수 있습니다.In case the app is unable to provide a token when the SDK calls acquireToken() -- for example, if silent authentication fails and it is an inconvenient time to show a UI -- the app can provide a token at a later time by calling the updateToken method. 이전 acquireToken() 호출을 통해 요청한 동일한 UPN, AAD ID 및 리소스 ID를 마지막으로 획득한 토큰과 함께 updateToken()에 전달해야 합니다.The same UPN, AAD ID, and resource ID that were requested by the prior call to acquireToken() must be passed to updateToken(), along with the token that was finally acquired. 제공된 콜백에서 null을 반환한 다음 앱에서 최대한 빨리 이 메서드를 호출해야 합니다.The app should call this method as soon as possible after returning null from the provided callback.

    참고

    SDK에서 토큰을 가져오기 위해 주기적으로 acquireToken()을 호출하므로 updateToken()을 반드시 호출할 필요가 없습니다.The SDK will call acquireToken() periodically to get the token, so calling updateToken() is not strictly required. 그러나 등록과 앱 보호 정책 체크 인이 적시에 완료될 수 있으므로 호출하는 것이 매우 좋습니다.However, it is strongly recommended as it can help enrollments and app protection policy check-ins complete in a timely manner.

계정 등록Account Registration

이 섹션에서는 MAMEnrollmentManager의 계정 등록 API 메서드와 해당 사용 방법에 대해 설명합니다.This section describes the account registration API methods in MAMEnrollmentManager and how to use them.

void registerAccountForMAM(String upn, String aadId, String tenantId);
void registerAccountForMAM(String upn, String aadId, String tenantId, String authority);
void unregisterAccountForMAM(String upn);
Result getRegisteredAccountStatus(String upn);
  1. 관리 계정을 등록하려면 앱에서 registerAccountForMAM()을 호출해야 합니다.To register an account for management, the app should call registerAccountForMAM(). 사용자 계정은 UPN과 AAD 사용자 ID 모두를 사용하여 식별합니다.A user account is identified by both its UPN and its AAD user ID. 등록 데이터를 사용자의 AAD 테넌트와 연결하려면 테넌트 ID도 필요합니다.The tenant ID is also required to associate enrollment data with the user's AAD tenant. 사용자 권한을 제공하여 특정 소버린 클라우드의 등록을 허용할 수도 있습니다. 자세한 내용은 소버린 클라우드 등록을 참조하세요.The user's authority may also be provided to allow enrollment against specific sovereign clouds; for more information see Sovereign Cloud Registration. SDK가 MAM 서비스에서 지정된 사용자의 앱을 등록하려고 시도할 수 있습니다. 등록에 실패하면 계정을 등록 취소할 때까지 주기적으로 등록을 시도합니다.The SDK may attempt to enroll the app for the given user in the MAM service; if enrollment fails, it will periodically retry enrollment until the account is unregistered. 재시도 기간은 일반적으로 12~24시간입니다.The retry period will typically be 12-24 hours. SDK에서는 알림을 통해 비동기적으로 등록 시도 상태를 제공합니다.The SDK provides the status of enrollment attempts asynchronously via notifications.

  2. AAD 인증이 필요하므로 사용자가 앱에 로그인한 후 MSAL을 사용하여 성공적으로 인증되고 나면 사용자 계정을 등록하는 것이 좋습니다.Because AAD authentication is required, the best time to register the user account is after the user has signed into the app and is successfully authenticated using MSAL. 사용자의 AAD ID와 테넌트 ID는 IAuthenticationResult와 관련된 IAccount 개체의 일부로 MSAL 인증 호출에서 반환됩니다.The user's AAD ID and tenant ID are returned from the MSAL authentication call as part of the IAccount related to the IAuthenticationResult.

    • 계정은 IAuthenticationResult.getAccount() 메서드에서 가져오며 관련 사용자 정보를 포함합니다.The account comes from the IAuthenticationResult.getAccount() method and contains the pertinent user information.
    • 테넌트 ID는 IAccount.getTenantId() 메서드를 통해 제공됩니다.The tenant ID comes from the IAccount.getTenantId() method.
    • AAD ID는 IAccount.getId() 메서드에서 제공됩니다.The AAD ID comes from the IAccount.getId() method.
  3. Intune 관리에서 계정을 등록 취소하려면 앱에서 unregisterAccountForMAM()을 호출해야 합니다.To unregister an account from Intune management, the app should call unregisterAccountForMAM(). 계정이 성공적으로 등록되어 관리되면 SDK에서 계정의 등록을 취소하고 데이터를 초기화합니다.If the account has been successfully enrolled and is managed, the SDK will unenroll the account and wipe its data. 계정을 주기적으로 등록하려는 시도도 중지됩니다.Periodic enrollment retries for the account will be stopped. SDK에서는 알림을 통해 비동기적으로 등록 취소 요청 상태를 제공합니다.The SDK provides the status of unenrollment request asynchronously via notification.

소버린 클라우드 등록Sovereign Cloud Registration

소버린 클라우드 인식 애플리케이션은 authorityregisterAccountForMAM()에 제공해야 합니다.Applications that are sovereign cloud aware must provide the authority to registerAccountForMAM().

MSAL 지침MSAL Guidance

MSAL의 경우 MSAL 구성 파일에서 multiple_clouds_supportedtrue로 설정합니다.For MSAL, set multiple_clouds_supported to true in the MSAL configuration file.

{
  "multiple_clouds_supported": true,
}

ADAL 지침ADAL Guidance

참고

소버린 클라우드 등록을 지원하려면 ADAL 라이브러리 버전 1.14.0 이상이 필요합니다.Support for sovereign cloud registration requires version 1.14.0 (or greater) of the ADAL library.

ADAL의 경우 instance_aware=trueacquireTokenextraQueryParameters 매개 변수로 전달한 후 AuthenticationCallback AuthenticationResult에서 getAuthority()를 호출합니다.For ADAL, pass instance_aware=true to acquireToken as an extraQueryParameters parameter followed by invoking getAuthority() on the AuthenticationCallback AuthenticationResult.

mAuthContext.acquireToken(this, RESOURCE_ID, CLIENT_ID, REDIRECT_URI, PromptBehavior.FORCE_PROMPT, "instance_aware=true",
        new AuthenticationCallback<AuthenticationResult>() {
            @Override
            public void onError(final Exception exc) {
                // authentication failed
            }

            @Override
            public void onSuccess(final AuthenticationResult result) {
                mAuthority = result.getAuthority();
                // handle other parts of the result
            }
        });

참고

AndroidManifest.xml에서 com.microsoft.intune.mam.aad.Authority 메타데이터 항목을 설정하지 않습니다.Do not set the com.microsoft.intune.mam.aad.Authority meta-data item in AndroidManifest.xml.

참고

MAMServiceAuthenticationCallback::acquireToken() 메서드에서 권한이 올바르게 설정되었는지 확인합니다.Ensure that the authority is correctly set in your MAMServiceAuthenticationCallback::acquireToken() method.

현재 지원되는 소버린 클라우드Currently Supported Sovereign Clouds

  1. Azure US Government 클라우드Azure US Government Cloud
  2. 21Vianet이 운영하는 Microsoft Azure(Azure 중국)Microsoft Azure operated by 21Vianet (Azure China)

중요한 구현 참고 사항Important implementation notes

인증Authentication

  • 앱이 registerAccountForMAM을 호출하는 경우 해당 MAMServiceAuthenticationCallback 인터페이스와 잠시 후 다른 스레드에서 콜백을 수신할 수 있습니다.When the app calls registerAccountForMAM, it may receive a callback on its MAMServiceAuthenticationCallback interface shortly thereafter, on a different thread. 이론적으로 앱은 요청된 토큰을 신속하게 획득하기 위해 계정을 등록하기 전에 자체 AAD 토큰을 획득했습니다.Ideally, the app acquired its own AAD token prior to registering the account to expedite the acquisition of the requested token. 앱이 콜백에서 유효한 토큰을 반환하면 등록이 진행되고 앱이 알림을 통해 최종 결과를 받습니다.If the app returns a valid token from the callback, enrollment will proceed and the app will get the final result via a notification.

  • 엡에서 유효한 AAD 토큰을 반환하지 않으면 등록을 시도한 후의 최종 결과는 AUTHORIZATION_NEEDED입니다.If the app doesn't return a valid AAD token, the final result from the enrollment attempt will be AUTHORIZATION_NEEDED. 앱이 알림을 통해 이 결과를 받으면 이전에 acquireToken에서 요청한 사용자 및 리소스의 토큰을 획득하고 updateToken 메서드를 호출해 등록 프로세스를 다시 시작하여 등록 프로세스를 단축하는 것이 좋습니다.If the app receives this Result via notification, it is strongly recommended to expedite the enrollment process by acquiring the token for the user and resource previously requested from acquireToken and calling the updateToken method to initiate the enrollment process again.

  • 주기적 앱 보호 정책 새로 고침 체크인을 위한 토큰을 획득하기 위해 앱의 등록된 MAMServiceAuthenticationCallback도 호출됩니다. 요청 시 앱에서 토큰을 제공할 수 없으면 알림을 받지 못하지만, 체크인 프로세스를 빠르게 수행하도록 다음 번 적절한 시기에 토큰을 획득하고 updateToken()을 호출하도록 시도해야 합니다.The app's registered MAMServiceAuthenticationCallback will also be called to acquire a token for periodic app protection policy refresh check-ins. If the app is unable to provide a token when requested, it will not get a notification, but it should attempt to acquire a token and call updateToken() at the next convenient time to expedite the check-in process. 토큰을 제공하지 않으면 다음 번 체크인 시에도 여전히 콜백이 호출됩니다.If a token is not provided, the callback will still be called at the next check-in attempt.

  • 소버린 클라우드 지원을 위해서는 권한을 제공해야 합니다.Support for sovereign clouds requires providing the authority.

등록Registration

  • 사용자의 편의를 위해 등록 메서드는 idempotent입니다. 예를 들어 계정이 아직 등록되지 않은 경우 registerAccountForMAM이 계정을 등록하고 앱 등록만 시도하며, 계정이 현재 등록된 경우 unregisterAccountForMAM이 계정의 등록만 취소합니다.For your convenience, the registration methods are idempotent; for example, registerAccountForMAM will only register an account and attempt to enroll the app if the account is not already registered, and unregisterAccountForMAM will only unregister an account if it is currently registered. 그 이후의 호출은 작동하지 않으므로 이 메서드를 두 번 이상 호출해도 문제가 되지 않습니다.Subsequent calls are no-ops, so there is no harm in calling these methods more than once. 또한 이러한 메서드의 호출과 결과 알림이 서로 대응하지 않을 수 있습니다. 즉, 이미 등록된 ID에 대해 registerAccountForMAM()이 호출되면 해당 ID에 대해 알림이 다시 전송되지 않을 수 있습니다.Additionally, correspondence between calls to these methods and notifications of results are not guaranteed: i.e. if registerAccountForMAM() is called for an identity that is already registered, the notification may not be sent again for that identity. SDK가 백그라운드에서 주기적으로 등록을 시도하고 Intune 서비스에서 받은 초기화 요청을 통해 등록 취소가 트리거될 수 있으므로, 이러한 메서드 호출에 해당하지 않는 알림이 전송될 수 있습니다.It is possible that notifications are sent that don't correspond to any calls to these methods, since the SDK may periodically try enrollments in the background, and unenrollments may be triggered by wipe requests received from the Intune service.

  • 여러 다른 ID에 대해 등록 메서드를 호출할 수 있지만, 현재로서는 하나의 사용자 계정만 등록될 수 있습니다.The registration methods can be called for any number of different identities, but currently only one user account can become successfully enrolled. Intune에 대한 사용권이 있으며 앱 보호 정책을 통해 대상으로 지정된 여러 사용자 계정이 동시 또는 거의 동시에 등록되는 경우 어떤 계정이 등록될지 모릅니다.If multiple user accounts that are licensed for Intune and targeted by app protection policy are registered at or near the same time, there is no guarantee on which one will win the race.

  • 마지막으로 MAMEnrollmentManager를 쿼리하여 특정 계정이 등록되었는지 확인하고 getRegisteredAccountStatus 메서드를 사용하여 현재 상태를 가져올 수 있습니다.Finally, you can query the MAMEnrollmentManager to see if a particular account is registered and to get its current status using the getRegisteredAccountStatus method. 제공된 계정이 등록되지 않은 경우 이 메서드에서 null 을 반환합니다.If the provided account is not registered, this method will return null. 계정이 등록되면 이 메서드에서 MAMEnrollmentManager.Result 열거형의 멤버 중 하나로 계정의 상태를 반환합니다.If the account is registered, this method will return the account's status as one of the members of the MAMEnrollmentManager.Result enumeration.

결과 및 상태 코드Result and status codes

계정을 처음 등록하면 PENDING 상태로 시작하여, 초기 MAM 서비스 등록 시도가 완료되지 않았음을 나타냅니다.When an account is first registered, it begins in the PENDING state, indicating that the initial MAM service enrollment attempt is incomplete. 등록 시도가 완료되면 아래 테이블의 결과 코드 중 하나를 포함한 알림이 전송됩니다.After the enrollment attempt finishes, a notification will be sent with one of the Result codes in the table below. 또한 getRegisteredAccountStatus 메서드에서 계정의 상태를 반환하므로 해당 사용자가 회사 콘텐츠에 액세스하지 못하게 차단되었는지 앱에서 항상 확인할 수 있습니다.In addition, the getRegisteredAccountStatus method will return the account's status so the app can always determine if access to corporate content is blocked for that user. SDK가 백그라운드에서 등록을 재시도하므로 등록에 실패해도 시간이 경과함에 따라 계정의 상태가 변경될 수 있습니다.If the enrollment attempt fails, the account's status may change over time as the SDK retries enrollment in the background.

결과 코드Result code 설명Explanation
AUTHORIZATION_NEEDED 이 결과는 앱의 등록된 MAMServiceAuthenticationCallback 인스턴스에서 토큰을 제공하지 않았거나 제공된 토큰이 유효하지 않음을 나타냅니다.This result indicates that a token was not provided by the app's registered MAMServiceAuthenticationCallback instance, or the provided token was invalid. 가능하면 앱에서 유효한 토큰을 획득하고 updateToken을 호출해야 합니다.The app should acquire a valid token and call updateToken if possible.
NOT_LICENSED 사용자에게 Intune에 대한 사용권이 없거나 Intune MAM 서비스에 연결하려 했지만 실패했습니다.The user is not licensed for Intune, or the attempt to contact the Intune MAM service failed. 앱은 비관리(정상) 상태로 지속되어야 하며 사용자를 차단하지 않아야 합니다.The app should continue in an unmanaged (normal) state and the user should not be blocked. 사용자에게 나중에 사용권이 부여되는 경우를 대비하여 주기적으로 등록을 시도합니다.Enrollments will be retried periodically in case the user becomes licensed in the future.
ENROLLMENT_SUCCEEDED 등록에 성공하거나 사용자가 이미 등록되었습니다.The enrollment attempt succeeded, or the user is already enrolled. 등록에 성공하면 이 알림 전에 정책 새로 고침 알림이 전송됩니다.In the case of a successful enrollment, a policy refresh notification will be sent before this notification. 회사 데이터에 액세스하도록 허용해야 합니다.Access to corporate data should be allowed.
ENROLLMENT_FAILED 등록에 실패했습니다.The enrollment attempt failed. 자세한 내용은 디바이스 로그에 있습니다.Further details can be found in the device logs. 사용자에게 Intune에 대한 사용권이 있음이 이미 확인되었으므로 앱에서는 이 상태로 회사 데이터에 액세스하게 허용하지 않아야 합니다.The app should not allow access to corporate data in this state, since it was previously determined that the user is licensed for Intune. 모든 앱은 앱이 ENROLLMENT_SUCCEEDED를 얻을 때까지 회사 데이터 액세스 권한이 없는지 확인해야 합니다.All apps should ensure that corporate data access is unauthorized, until ENROLLMENT_SUCCEEDED is obtained by your app.
WRONG_USER MAM 서비스를 통해 디바이스당 한 명의 사용자만 앱을 등록할 수 있습니다.Only one user per device can enroll an app with the MAM service. 이 결과는 이 결과를 받은 사용자(두 번째 사용자)가 MAM 정책을 통해 대상으로 지정되지만 다른 사용자가 이미 등록되었음을 나타냅니다.This result indicates that the user for whom this result was delivered (the second user) is targeted with MAM policy, but a different user is already enrolled. 두 번째 사용자에게 MAM 정책을 적용할 수 없기 때문에 앱은 나중에 이 사용자의 등록이 성공하지 않는 한/성공할 때까지 이 사용자의 데이터에 대한 액세스를 허용하지 않아야 합니다(앱에서 사용자를 제거하여 설정할 수 있음).Because MAM policy cannot be enforced for the second user, your app must not allow access to this user's data (possibly by removing the user from your app) unless/until enrollment for this user succeeds at a later time. WRONG_USER 결과를 제공하는 동시에 MAM은 기존 계정을 제거하는 옵션이 포함된 프롬프트를 표시합니다.Concurrent with delivering this WRONG_USER result, MAM will prompt with the option to remove the existing account. 실제 사용자가 긍정적으로 대답하는 경우 잠시 후 두 번째 사용자를 등록할 수 있습니다.If the human user answers in the affirmative, it will indeed be possible to enroll the second user a short time later. 두 번째 사용자가 등록된 상태로 유지되는 동안 MAM은 주기적으로 등록을 다시 시도합니다.As long as the second user remains registered, MAM will retry enrollment periodically.
UNENROLLMENT_SUCCEEDED 등록이 취소되었습니다.Unenrollment was successful.
UNENROLLMENT_FAILED 등록 취소 요청이 실패했습니다.The unenrollment request failed. 자세한 내용은 디바이스 로그에 있습니다.Further details can be found in the device logs. 일반적으로 앱이 유효한(null이 아니며 비어 있지 않음) UPN을 전달하는 경우 이 동작은 발생하지 않습니다.In general, this will not occur as long as the app passes a valid (neither null nor empty) UPN. 앱에서 수행할 수 있는 직접적이고 신뢰할 수 있는 해결 방법은 없습니다.There is no direct, reliable remediation the app can take. 유효한 UPN의 등록을 취소할 때 이 값이 수신되면 Intune MAM 팀에 버그로 보고해 주세요.If this value is received when unregistering a valid UPN, please report as a bug to the Intune MAM team.
PENDING 사용자의 초기 등록을 진행 중입니다.The initial enrollment attempt for the user is in progress. 등록 결과를 알 때까지 앱에서 회사 데이터에 대한 액세스를 차단할 수 있지만, 필수는 아닙니다.The app can block access to corporate data until the enrollment result is known, but is not required to do so.
COMPANY_PORTAL_REQUIRED Intune에 대한 사용권이 부여되지만, 디바이스에 회사 포털 앱을 설치해야 앱을 등록할 수 있습니다.The user is licensed for Intune, but the app cannot be enrolled until the Company Portal app is installed on the device. Intune 앱 SDK에서 지정된 사용자가 앱에 액세스하지 못하게 차단하고 회사 포털 앱을 설치하도록 지시합니다(자세한 내용은 아래 참조).The Intune App SDK will attempt to block access to the app for the given user and direct them to install the Company Portal app (see below for details).

회사 포털 요구 사항 프롬프트 재정의(선택사항)Company Portal requirement prompt override (optional)

COMPANY_PORTAL_REQUIRED 결과를 받으면 SDK에서 등록이 요청된 ID를 사용하는 활동의 사용을 차단합니다.If the COMPANY_PORTAL_REQUIRED Result is received, the SDK will block use of activities that use the identity for which enrollment was requested. 대신 SDK에서는 해당 활동이 회사 포털을 다운로드하도록 프롬프트를 표시합니다.Instead, the SDK will cause those activities to display a prompt to download the Company Portal. 앱에서 이 동작을 방지하려면 작업을 통해 [MAMActivity.onMAMCompanyPortalRequired]를 구현할 수 있습니다.If you want to prevent this behavior in your app, activities may implement [MAMActivity.onMAMCompanyPortalRequired].

이 메서드는 SDK에서 기본 차단 UI를 표시하기 전에 호출됩니다.This method is called before the SDK displays its default blocking UI. 앱에서 활동 ID를 변경하거나 등록을 시도한 사용자의 등록을 취소하면 SDK가 활동을 차단하지 않습니다.If the app changes the activity identity or unregisters the user who attempted to enroll, the SDK will not block the activity. 이 경우 앱에서 회사 데이터가 누수되지 않게 합니다.In this situation, it is up to the app to avoid leaking corporate data. 다중 ID 앱(뒷부분에서 설명)만 작업 ID를 변경할 수 있습니다.Only multi-identity apps (discussed later) will be able to change the activity identity.

MAMActivity를 명시적으로 상속하지 않지만(빌드 도구를 통해 변경) 이 알림을 처리해야 하는 경우, MAMActivityBlockingListener를 대신 구현할 수 있습니다.If you do not explicitly inherit MAMActivity (because the build tooling will make that change), but still need to handle this notification you may instead implement MAMActivityBlockingListener.

알림Notifications

앱이 MAM_ENROLLMENT_RESULT 형식의 알림을 등록하면 등록 요청이 완료되었음을 앱에 알리기 위해 MAMEnrollmentNotification이 전송됩니다.If the app registers for notifications of type MAM_ENROLLMENT_RESULT, a MAMEnrollmentNotification will be sent in order to inform the app that the enrollment request has completed. MAMEnrollmentNotificationSDK에서 알림 등록 섹션에 설명된 대로 MAMNotificationReceiver 인터페이스를 통해 받습니다.The MAMEnrollmentNotification will be received through the MAMNotificationReceiver interface as described in the Register for notifications from the SDK section.

public interface MAMEnrollmentNotification extends MAMUserNotification {
    MAMEnrollmentManager.Result getEnrollmentResult();
}

getEnrollmentResult 메서드에서 등록 요청의 결과를 반환합니다.The getEnrollmentResult method returns the result of the enrollment request. MAMEnrollmentNotification에서 MAMUserNotification을 확장하므로 등록을 시도하는 사용자의 ID도 사용 가능합니다.Since MAMEnrollmentNotification extends MAMUserNotification, the identity of the user for whom the enrollment was attempted is also available. SDK에서 알림 등록 섹션에 자세히 설명된 대로 앱에서 이러한 알림을 받도록 MAMNotificationReceiver 인터페이스를 구현해야 합니다.The app must implement the MAMNotificationReceiver interface to receive these notifications, detailed in the Register for notifications from the SDK section.

등록 알림을 받을 때 등록된 사용자 계정의 상태가 변경될 수 있지만, 모든 경우에 변경되지는 않습니다(예: WRONG_USER와 같은 자세한 정보를 포함하는 결과 다음에 AUTHORIZATION_NEEDED 알림을 받으면, 자세한 정보를 포함하는 결과가 계정의 상태로 유지 관리됨).The registered user account's status may change when an enrollment notification is received, but it will not change in all cases (for example, if AUTHORIZATION_NEEDED notification is received after a more informative result such as WRONG_USER, the more informative result will be maintained as the account's status). 계정이 성공적으로 등록되면 계정이 등록 취소되거나 초기화될 때까지 ENROLLMENT_SUCCEEDED 상태로 유지됩니다.Once the account is successfully enrolled, the status will remain as ENROLLMENT_SUCCEEDED until the account is unenrolled or wiped.

APP CA with Policy AssuranceAPP CA with Policy Assurance

개요Overview

APP CA(Conditional Access) with Policy Assurance를 사용하면 Intune 앱 보호 정책 애플리케이션에서 리소스 액세스가 조건부로 허용됩니다.With APP CA (Conditional Access) with Policy Assurance, access to resources is conditionalized on the application of Intune App Protection Policies. AAD는 APP CA with Policy Assurance 보호된 리소스에 대한 액세스 권한을 액세스 토큰에 부여하기 전에 앱을 등록하고 APP을 통해 관리할 것을 요구하여 조건부 액세스를 적용합니다.AAD enforces this by requiring the app to be enrolled and managed by APP before granting a token to access an APP CA with Policy Assurance protected resource. 앱은 토큰 획득에 MSAL broker를 사용해야 하고, 설정은 위의 조건부 액세스에 설명한 것과 동일합니다.The app is required to use the MSAL broker for token acquisition, and the setup is the same as described above in Conditional Access.

참고

APP CA with Policy Assurance 지원에는 MSAL 라이브러리 버전 1.0.0 이상이 필요합니다.Support for APP CA with Policy Assurance requires version 1.0.0 (or greater) of the MSAL library.

MSAL을 사용하여 비준수 처리Handle non-compliance with MSAL

사용자 토큰을 획득할 때 MSAL 라이브러리는 앱 관리를 준수하지 않음을 나타내는 MsalIntuneAppProtectionPolicyRequiredException을 반환하거나 throw할 수 있습니다.When acquiring a token for a user, the MSAL library may return or throw an MsalIntuneAppProtectionPolicyRequiredException to indicate non-compliance with APP management. 준수 수정에 사용하기 위해 예외에서 추가 매개 변수를 추출할 수 있습니다(MAMComplianceManager 참조).Additional parameters can be extracted from the exception for use in remediating compliance (see MAMComplianceManager). 수정에 성공하면 앱이 MSAL을 통해 토큰 획득을 다시 시도할 수 있습니다.Once the remediation is successful, the app can re-attempt the token acquisition through MSAL.

MAMComplianceManagerMAMComplianceManager

MSAL에서 정책 필요 오류가 수신되면 MAMComplianceManager 인터페이스가 사용됩니다.The MAMComplianceManager interface is used when the policy-required error is received from MSAL. 이 인터페이스에는 앱을 규정 준수 상태로 만들기 위해 호출해야 하는 remediateCompliance 메서드가 포함되어 있습니다.It contains the remediateCompliance method that should be called to attempt to put the app into a compliant state. MAMComplianceManager에 대한 참조는 다음과 같이 얻을 수 있습니다.A reference to the MAMComplianceManager can be obtained as follows:

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

// make use of mgr

반환된 MAMComplianceManager 인스턴스는 null이 되지 않습니다.The MAMComplianceManager instance returned is guaranteed not to be null.

package com.microsoft.intune.mam.policy;

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

AAD가 요청된 토큰을 제공하기 위한 조건을 충족할 수 있도록, 앱을 관리 대상에 넣으려고 시도하는 remediateCompliance() 메서드가 호출됩니다.The remediateCompliance() method is called to attempt to put the app under management to satisfy the conditions for AAD to grant the requested token. 처음 네 개 매개 변수는 MSAL AuthenticationCallback.onError() 메서드가 수신한 예외에서 추출할 수 있습니다(아래 코드 샘플 참조).The first four parameters can be extracted from the exception received by the MSAL AuthenticationCallback.onError() method (see code sample below). 마지막 매개 변수는 규정 준수를 시도하는 동안 UX 표시 여부를 제어하는 부울입니다.The final parameter is a boolean which controls whether a UX is shown during the compliance attempt. 다음은 이 작업이 진행되는 동안 사용자 지정된 UX를 표시할 필요가 없는 앱의 기본값으로 제공되는 간단한 차단 진행률 스타일 인터페이스입니다.This is a simple blocking progress style interface provided as a default for apps that don't have a need to show customized UX during this operation. 규정 준수 문제 해결이 진행되는 동안에만 차단하며 최종 결과를 표시하지 않습니다.It will only block while the compliance remediation is in progress and will not display the final result. 앱은 규정 준수 문제 해결 시도의 성공 또는 실패를 처리하는 알림 수신기를 등록해야 합니다(아래 참조).The app should register a notification receiver to handle the success or failure of the compliance remediation attempt (see below).

remediateCompliance() 메서드는 규정 준수 설정의 일부로 MAM 등록을 수행할 수 있습니다.The remediateCompliance() method may do a MAM enrollment as part of establishing compliance. 앱이 등록 알림을 위한 알림 수신기를 등록한 경우 등록 알림을 받게 될 수 있습니다.The app may receive an enrollment notification if it has registered a notification receiver for enrollment notifications. 앱의 등록된 MAMServiceAuthenticationCallback에는 MAM 등록을 위한 토큰을 가져오기 위해 호출되는 자체 acquireToken 메서드가 있습니다.The app's registered MAMServiceAuthenticationCallback will have its acquireToken method called to get a token for the MAM enrollment. acquireToken()은 앱이 자체 토큰을 획득하기 전에 호출되므로, 앱이 토큰 획득 이후에 수행하는 기록 또는 계정 만들기 작업이 아직 완료되지 않았을 수 있습니다.acquireToken() will be called before the app has acquired its own token, so any bookkeeping or account creation tasks that the app does after a successful token acquisition may not have been done yet. 이 경우 콜백이 토큰을 획득할 수 있어야 합니다.The callback must be able to acquire a token in this case. acquireToken()에서 토큰을 반환할 수 없는 경우 규정 준수 문제 해결 시도가 실패합니다.If you can't return a token from acquireToken(), the compliance remediation attempt will fail. 나중에 요청된 리소스에 대한 유효한 토큰을 사용하여 updateToken을 호출하면 제공된 토큰을 사용하여 규정 준수 수정이 즉시 다시 시도됩니다.If you call updateToken later with a valid token for the requested resource, the compliance remediation will be retried immediately with the given token.

참고

사용자는 MsalIntuneAppProtectionPolicyRequiredException 예외가 발생하기 전에 이미 broker를 설치하고 디바이스를 등록하는 방법을 배웠을 것이므로 여전히 acquireToken()에서 자동 토큰 획득이 가능합니다.Silent token acquisition will still be possible in acquireToken() because the user will have already been guided to install the broker and register the device before the MsalIntuneAppProtectionPolicyRequiredException exception is received. 이로 인해 broker의 캐시에 유효한 새로 고침 토큰이 있으므로 요청된 토큰의 자동 획득이 성공할 수 있습니다.This results in the broker having a valid refresh token in its cache, allowing silent acquisition of the requested token to succeed.

다음은 AuthenticationCallback.onError() 메서드에서 정책 필요 오류를 수신한 다음, MAMComplianceManager를 호출하여 오류를 처리하는 샘플입니다.Here is a sample of receiving the policy-required error in the AuthenticationCallback.onError() method, and calling the MAMComplianceManager to handle the error.

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

상태 알림Status Notifications

앱이 COMPLIANCE_STATUS 형식의 알림에 등록하면 앱에 규정 준수 수정 시도의 최종 상태를 알리기 위해 MAMComplianceNotification이 전송됩니다.If the app registers for notifications of type COMPLIANCE_STATUS, a MAMComplianceNotification will be sent in order to inform the app of the final status of the compliance remediation attempt. MAMComplianceNotificationSDK에서 알림 등록 섹션에 설명된 대로 MAMNotificationReceiver 인터페이스를 통해 받습니다.The MAMComplianceNotification will be received through the MAMNotificationReceiver interface as described in the Register for notifications from the SDK section.

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

getComplianceStatus() 메서드는 규정 준수 수정 시도의 결과를 MAMCAComplianceStatus 열거형의 값으로 반환합니다.The getComplianceStatus() method returns the result of the compliance remediation attempt as a value from the MAMCAComplianceStatus enum.

상태 코드Status code 설명Explanation
알 수 없음UNKNOWN 상태를 알 수 없습니다.Status is unknown. 예기치 않은 실패 이유를 나타내는 것일 수 있습니다.This could indicate an unanticipated failure reason. 회사 포털 로그에서 추가 정보를 찾을 수 있습니다.Additional information may be found in the Company Portal logs.
규정 준수COMPLIANT 규정 준수 문제 해결이 성공하여 앱이 이제 정책을 준수합니다.Compliance remediation succeeded and the app is now compliant with policy. MSAL 토큰 획득을 다시 시도해야 합니다.The MSAL token acquisition should be retried.
NOT_COMPLIANTNOT_COMPLIANT 규정 준수 문제를 해결하기 위한 시도가 실패했습니다.The attempt to remediate compliance failed. 앱이 규정을 준수하지 않으므로 오류 조건을 해결하기 전에는 MSAL 토큰 획득을 다시 시도하면 안 됩니다.The app is not compliant and MSAL token acquisition should not be retried until the error condition is corrected. 추가 오류 정보가 MAMComplianceNotification과 함께 전송됩니다.Additional error information is sent with the MAMComplianceNotification.
SERVICE_FAILURESERVICE_FAILURE Intune 서비스에서 규정 준수 데이터를 검색하는 동안 오류가 발생했습니다.There was a failure while attempting to retrieve compliance data from the Intune Service. 회사 포털 로그에서 추가 정보를 찾을 수 있습니다.Additional information may be found in the Company Portal logs.
NETWORK_FAILURENETWORK_FAILURE Intune 서비스에 연결할 때 오류가 발생했습니다.There was an error connecting to the Intune Service. 네트워크 연결이 복원되면 앱에서 토큰 획득을 다시 시도해야 합니다.The app should try its token acquisition again when the network connection is restored.
CLIENT_ERRORCLIENT_ERROR 클라이언트와 관련된 어떤 이유로 규정 준수 문제 해결 시도가 실패했습니다.The attempt to remediate compliance failed for some reason related to the client. 예를 들어 토큰이 없거나 잘못된 사용자가 원인일 수 있습니다.For example, no token or wrong user. 추가 오류 정보가 MAMComplianceNotification과 함께 전송됩니다.Additional error information is sent with the MAMComplianceNotification.
PENDINGPENDING 시간 제한을 초과했을 때 서비스에서 상태 응답이 도착하지 않아 규정 준수 문제 해결 시도가 실패했습니다.The attempt to remediate compliance failed because the status response had not yet been received from the service when the time limit was exceeded. 앱이 나중에 토큰 획득을 다시 시도해야 합니다.The app should try its token acquisition again later.
COMPANY_PORTAL_REQUIREDCOMPANY_PORTAL_REQUIRED 규정 준수 문제 해결을 성공하려면 디바이스에 회사 포털을 설치해야 합니다.The Company Portal must be installed on the device in order for compliance remediation to succeed. 디바이스에 회사 포털이 이미 설치된 경우 앱을 다시 시작해야 합니다.If the Company Portal is already installed on the device, the app needs to be restarted. 이 경우 사용자에게 앱을 다시 시작할 것을 요청하는 대화 상자가 표시됩니다.In this case, a dialog will be shown asking the user to restart the app.

규정 준수 상태가 MAMCAComplianceStatus.COMPLIANT인 경우 앱은 자체 리소스에 대한 원래 토큰 획득을 다시 시작해야 합니다.If the compliance status is MAMCAComplianceStatus.COMPLIANT, the app should re-initiate its original token acquisition (for its own resource). 규정 준수 수정 문제 해결 시도가 실패한 경우 getComplianceErrorTitle()getComplianceErrorMessage() 메서드는 앱이 최종 사용자에게 표시할 수 있는(표시하도록 선택하는 경우) 지역화된 문자열을 반환합니다.If the compliance remediation attempt failed, the getComplianceErrorTitle() and getComplianceErrorMessage() methods will return localized strings that the app can display to the end user if it chooses. 대부분의 오류는 앱에서 해결할 수 없으므로 일반적인 오류인 경우 계정 만들기 또는 로그인을 실패로 처리하고 사용자가 나중에 다시 시도할 수 있게 하는 것이 가장 좋습니다.Most of the error cases aren't remediable by the app, so for the general case it may be best to fail account creation or login and allow the user to try again later. 오류가 계속되면 MAM 로그를 검토하여 원인을 파악할 수 있습니다.If a failure is persistent, the MAM logs may help determine the cause. 최종 사용자는 로그를 제출할 수 있습니다.The end user can submit the logs. 자세한 내용은 로그 업로드 및 메일로 보내기를 참조하세요.For more information, see Upload and email logs.

MAMComplianceNotification에서 MAMUserNotification을 확장하므로 복원을 시도한 사용자의 ID도 사용 가능합니다.Since MAMComplianceNotification extends MAMUserNotification, the identity of the user for whom the remediation was attempted is also available.

다음은 MAMNotificationReceiver 인터페이스를 구현하기 위해 익명 클래스를 사용하여 수신기를 등록하는 예제입니다.Here is an example of registering a receiver using an anonymous class to implement the MAMNotificationReceiver interface:

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()를 호출하기 전에 알림 수신기를 등록해야 합니다.The notification receiver must be registered before calling remediateCompliance() to avoid a race condition that could result in the notification being missed.

구현 노트Implementation Notes

참고

앱의 MAMServiceAuthenticationCallback.acquireToken() 메서드는 forceRefresh 플래그에 대해 falseacquireTokenSilentAsync()에 전달해야 합니다.The app's MAMServiceAuthenticationCallback.acquireToken() method should pass false for forceRefresh flag to acquireTokenSilentAsync().

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

acquireTokenSilentAsync(acquireTokenSilentParameters);

참고

문제 해결을 시도하는 동안 사용자 지정 차단 UX를 표시하려면 remediateCompliance()의 showUX 매개 변수에 대한 값으로 false 를 전달해야 합니다.If you want to show a custom blocking UX during the remediation attempt, you should pass false for the showUX parameter to remediateCompliance(). UX를 표시하고 알림 수신기를 등록한 후 remediateCompliance()를 호출해야 합니다.You must ensure that you show your UX and register your notification listener first before calling remediateCompliance(). 이렇게 하면 remediateCompliance()가 매우 빠르게 실패할 경우 알림이 누락될 수 있는 경합 상태를 방지할 수 있습니다.This will prevent a race condition where the notification could be missed if remediateCompliance() fails very quickly. 예를 들어 Activity 서브클래스의 onCreate() 또는 onMAMCreate() 메서드는 알림 수신기를 등록한 후 remediateCompliance()를 호출하는 가장 이상적인 장소입니다.For example, the onCreate() or onMAMCreate() method of an Activity subclass is the ideal place to register the notification listener and then call remediateCompliance(). remediateCompliance()의 매개 변수는 UX에 의도 추가 기능으로 전달할 수 있습니다.The parameters for remediateCompliance() can be passed to your UX as Intent extras. 규정 준수 상태 알림이 수신되면 결과를 표시할 수도 있고, 작업을 그냥 완료할 수도 있습니다.When the compliance status notification is received, you can display the result or simply finish the activity.

참고

remediateCompliance()는 계정을 등록하고 등록을 시도합니다.remediateCompliance() will register the account and attempt enrollment. 주 토큰을 획득하면 registerAccountForMAM()을 호출할 필요가 없지만, 호출해도 아무 문제 없습니다.Once the main token is acquired, calling registerAccountForMAM() is not necessary, but there is no harm in doing so. 반면, 앱이 토큰 획득에 실패하여 사용자 계정을 제거하려는 경우 unregisterAccountForMAM()을 호출하여 계정을 제거하고 백그라운드 등록 재시도를 차단해야 합니다.On the other hand, if the app fails to acquire its token and wishes to remove the user account, it must call unregisterAccountForMAM() to remove the account and prevent background enrollment retries.

백업 데이터 보호Protecting Backup data

Android Marshmallow(API 23) 현재, Android에는 앱이 데이터를 백업하는 두 가지 방법이 있습니다.As of Android Marshmallow (API 23), Android has two ways for an app to back up its data. 각 옵션을 앱에서 사용할 수 있으며 여러 단계를 거쳐 Intune 데이터 보호가 적절하게 구현되도록 해야 합니다.Each option is available to your app and requires different steps to ensure that Intune data protection is correctly implemented. 아래 표를 검토하면 올바른 데이터 보호 동작에 필요한 적절한 작업에 대해 살펴볼 수 있습니다.You can review the table below on corresponding actions required for correct data protection behavior. Android API 가이드에서 백업 방법에 대해 알아볼 수 있습니다.You can read more about the backup methods in the Android API guide.

앱에 대한 자동 백업Auto Backup for Apps

Android는 앱의 대상 API에 관계없이 Android Marshmallow 디바이스에서 앱의 Google Drive에 자동 전체 백업 기능을 제공하기 시작했습니다.Android began offering automatic full backups to Google Drive for apps on Android Marshmallow devices, regardless of the app's target API. AndroidManifest.xml에서 android:allowBackupfalse 로 명시적으로 설정하면 앱은 Android에서 수행하는 백업용 큐에 추가되지 않고 “회사” 데이터가 앱 내에서 유지됩니다.In your AndroidManifest.xml, if you explicitly set android:allowBackup to false, then your app will never be queued for backups by Android and "corporate" data will stay within the app. 이 경우 추가 작업이 필요하지 않습니다.In this case, no further action is necessary.

그러나 매니페스트 파일에서 android:allowBackup을 지정하지 않더라도 기본적으로 android:allowBackup 특성은 true로 설정됩니다.However, by default the android:allowBackup attribute is set to true, even if android:allowBackup isn't specified in the manifest file. 즉, 모든 앱 데이터가 사용자의 Google Drive 계정에 자동으로 백업되는, 이 동작은 데이터 누출의 위험 이 있습니다.This means all app data is automatically backed up to the user's Google Drive account, a default behavior that poses a data leak risk. 따라서 데이터 보호가 적용되도록 아래 개략적인 설명대로 SDK를 변경해야 합니다.Therefore, the SDK requires the changes outlined below to ensure that data protection is applied. Android Marshmallow 디바이스에서 앱을 실행하려면 아래의 지침에 따라 고객 데이터를 제대로 보호해야 합니다.It is important to follow the guidelines below to protect customer data properly if you want your app to run on Android Marshmallow devices.

Intune을 통해 XML에서 사용자 지정 규칙을 정의하는 기능을 비롯하여 Android에서 제공하는 모든 자동 백업 기능을 이용할 수 있지만 아래 단계에 따라 데이터를 보호해야 합니다.Intune allows you to utilize all the Auto Backup features available from Android, including the ability to define custom rules in XML, but you must follow the steps below to secure your data:

  1. 앱에서 고유 사용자 지정 BackupAgent를 사용하지 않으면 Intune 정책을 준수하는 자동 전체 백업을 허용하려면 기본 MAMBackupAgent를 사용합니다.If your app does not use its own custom BackupAgent, use the default MAMBackupAgent to allow for automatic full backups that are Intune policy compliant. 앱 매니페스트에 다음을 둡니다.Place the following in the app manifest:

    android:fullBackupOnly="true"
    android:backupAgent="com.microsoft.intune.mam.client.app.backup.MAMDefaultBackupAgent"
    
  2. [선택 사항] 선택적 사용자 지정 BackupAgent를 구현한 경우 MAMBackupAgent 또는 MAMBackupAgentHelper를 사용해야 합니다.[Optional] If you implemented an optional custom BackupAgent, you need to make sure to use MAMBackupAgent or MAMBackupAgentHelper. 다음 섹션을 참조하세요.See the following sections. 1단계에 설명된 Android M 이상에서 쉬운 백업을 제공하는 Intune의 MAMDefaultBackupAgent로 전환하는 것이 좋습니다.Consider switching to using Intune's MAMDefaultBackupAgent, described in step 1, which provides easy back-up on Android M and above.

  3. 앱이 받아야 하는 전체 백업 유형을 결정할 경우(필터링되지 않음, 필터링됨 또는 없음) 앱에서 android:fullBackupContent 특성을 true, false 또는 XML 리소스로 설정해야 합니다.When you decide which type of full backup your app should receive (unfiltered, filtered, or none), you'll need to set the attribute android:fullBackupContent to true, false, or an XML resource in your app.

  4. 그런 다음 android:fullBackupContent에 넣은 내용이 무엇이든 매니페스트에서 com.microsoft.intune.mam.FullBackupContent라는 메타데이터 태그에 복사 해야 합니다.Then, you must copy whatever you put into android:fullBackupContent into a metadata tag named com.microsoft.intune.mam.FullBackupContent in the manifest.

    예제 1: 앱에 예외 없이 전체가 백업되도록 하려면 android:fullBackupContent 특성과 com.microsoft.intune.mam.FullBackupContent 메타데이터 태그를 모두 true 로 설정합니다.Example 1: If you want your app to have full backups without exclusions, set both the android:fullBackupContent attribute and com.microsoft.intune.mam.FullBackupContent metadata tag to true:

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

    예제 2: 앱에서 사용자 지정 BackupAgent를 사용하고 Intune 정책을 준수하는 전체 자동 백업에서 옵트아웃하려면 특성과 메타데이터 태그를 false 로 설정해야 합니다.Example 2: If you want your app to use its custom BackupAgent and opt out of full, Intune policy compliant, automatic backups, you must set the attribute and metadata tag to false:

    android:fullBackupContent="false"
    ...
    <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="false" />  
    

    예제 3: XML 파일에 정의된 사용자 지정 규칙에 따라 앱에 전체 백업이 있도록 특성과 메타데이터 태그를 동일한 XML 리소스로 설정합니다.Example 3: If you want your app to have full backups according to your custom rules defined in an XML file, set the attribute and metadata tag to the same XML resource:

    android:fullBackupContent="@xml/my_scheme"
    ...
    <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:resource="@xml/my_scheme" />  
    

Key/Value BackupKey/Value Backup

키/값 백업 옵션이 모든 API 8+에서 사용 가능하며, 앱 데이터를 Android 백업 서비스에 업로드합니다.The Key/Value Backup option is available to all APIs 8+ and uploads app data to the Android Backup Service. 앱의 사용자당 데이터 크기는 5MB로 제한됩니다.The amount of data per user of your app is limited to 5 MB. 키/값 백업을 사용하는 경우 [BackupAgentHelper] 또는 [BackupAgent]를 사용해야 합니다.If you use Key/Value Backup, you must use a [BackupAgentHelper] or a [BackupAgent].

BackupAgentHelperBackupAgentHelper

[BackupAgentHelper]는 기본 Android 기능 및 Intune MAM 통합 면에서 [BackupAgent]에 비해 훨씬 더 간단하게 구현할 수 있습니다.[BackupAgentHelper] is easier to implement than [BackupAgent] both in terms of native Android functionality and Intune MAM integration. BackupAgentHelper의 경우 개발자는 전체 파일 및 공유 기본 설정을 FileBackupHelperSharedPreferencesBackupHelper에 각각 등록할 수 있으며 이들 항목은 생성된 BackupAgentHelper에 추가됩니다.BackupAgentHelper allows the developer to register entire files and shared preferences to a FileBackupHelper and SharedPreferencesBackupHelper (respectively) which are then added to the BackupAgentHelper upon creation. 아래 단계를 따라 Intune MAM과 함께 BackupAgentHelper를 사용합니다.Follow the steps below to use a BackupAgentHelper with Intune MAM:

  1. BackupAgentHelper를 사용하여 다중 ID 백업을 활용하려면 Android 가이드를 따라 BackupAgentHelper 확장을 수행합니다.To utilize multi-identity backup with a BackupAgentHelper, follow the Android guide to Extending BackupAgentHelper.

  2. 클래스에서 BackupAgentHelper, FileBackupHelper 및 SharedPreferencesBackupHelper에 해당하는 MAM의 항목을 확장하게 합니다.Have your class extend the MAM equivalent of BackupAgentHelper, FileBackupHelper, and SharedPreferencesBackupHelper.

Android 클래스Android class MAM 해당 항목MAM equivalent
BackupAgentHelperBackupAgentHelper MAMBackupAgentHelperMAMBackupAgentHelper
FileBackupHelperFileBackupHelper MAMFileBackupHelperMAMFileBackupHelper
SharedPreferencesBackupHelperSharedPreferencesBackupHelper MAMSharedPreferencesBackupHelperMAMSharedPreferencesBackupHelper

다음 지침을 따르면 다중 ID 백업 및 복원에 성공합니다.Following these guidelines will lead to a successful multi-identity backup and restore.

BackupAgentBackupAgent

BackupAgent를 사용하면 백업되는 데이터에 대해 훨씬 더 명확히 지정할 수 있습니다.A BackupAgent allows you to be much more explicit about what data is backed up. 개발자가 구현을 수행해야 하므로 Intune에서 데이터를 적절하게 보호하기 위해 필요한 추가 단계가 있습니다.Because the developer is fairly responsible for the implementation, there are more steps required to ensure appropriate data protection from Intune. 대부분의 작업을 개발자가 담당하게 되므로, Intune 통합이 약간 더 개입됩니다.Since most of the work is pushed onto you, the developer, Intune integration is slightly more involved.

MAM 통합:Integrate MAM:

  1. BackupAgent 구현에서 Android 지침을 따르도록 키/값 백업 및 특히 BackupAgent 확장에 대한 Android 설명서를 자세히 읽어 보세요.Carefully read the Android guide for Key/Value Backup and specifically Extending BackupAgent to ensure your BackupAgent implementation follows Android guidelines.

  2. 클래스가 MAMBackupAgent를 확장하도록 합니다.Have your class extend MAMBackupAgent.

다중 ID 백업:Multi-identity Backup:

  1. 백업을 시작하기 전에 다중 ID 시나리오에서 백업하려는 파일 또는 데이터 버퍼를 IT 관리자가 백업하도록 허용 되는지 확인합니다.Before beginning your backup, check that the files or data buffers you plan to back up are indeed permitted by the IT administrator to be backed up in multi-identity scenarios. 이를 확인하도록 MAMFileProtectionManagerMAMDataProtectionManagerisBackupAllowed 함수가 제공됩니다.We provide you with the isBackupAllowed function in MAMFileProtectionManager and MAMDataProtectionManager to determine this. 파일 또는 데이터 버퍼를 백업하도록 허용하지 않는 경우에는 백업에 계속 포함하지 않아야 합니다.If the file or data buffer is not allowed to be backed up, then you should not continue including it in your backup.

  2. 1단계에 확인한 파일의 ID를 백업하려는 경우에는 백업 도중 특정 시점에 데이터를 추출할 파일에 대해 backupMAMFileIdentity(BackupDataOutput data, File … files)를 호출해야 합니다.At some point during your backup, if you want to back up the identities for the files you checked in step 1, you must call backupMAMFileIdentity(BackupDataOutput data, File … files) with the files from which you plan to extract data. 그러면 자동으로 새 백업 엔터티가 생성되고 이 엔터티가 BackupDataOutput 에 작성됩니다.This will automatically create new backup entities and write them to the BackupDataOutput for you. 이러한 엔터티는 복원 시 자동으로 사용됩니다.These entities will be automatically consumed upon restore.

다중 ID 복원:Multi-identity Restore:

데이터 백업 안내서에서는 애플리케이션의 데이터를 복원하는 일반 알고리즘을 지정하고 BackupAgent 확장 섹션에서 코드 샘플을 제공합니다.The Data Backup guide specifies a general algorithm for restoring your application’s data and provides a code sample in the Extending BackupAgent section. 다중 ID 복원에 성공하려면 이 코드 샘플에 제공된 일반 구조를 따르고 다음에 특히 주의해야 합니다.In order to have a successful multi-identity restore, you must follow the general structure provided in this code sample with special attention to the following:

  1. while(data.readNextHeader())* 루프를 활용하여 백업 엔티티를 조사해야 합니다.You must utilize a while(data.readNextHeader())* loop to go through the backup entities.

  2. data.getKey()*가 onBackup에서 작성한 키와 일치하지 않으면 data.skipEntityData()*를 호출해야 합니다.You must call data.skipEntityData()* if data.getKey()* does not match the key you wrote in onBackup. 이 단계를 수행하지 않으면 복원에 성공하지 못할 수 있습니다.Without performing this step, your restores may not succeed.

  3. 자동으로 작성하는 엔티티가 유실되므로, while(data.readNextHeader())* 구성에서 백업 엔티티를 사용하는 동안 반환하지 마세요.Avoid returning while consuming backup entities in the while(data.readNextHeader())* construct, as the entities we automatically write will be lost.

  • 여기서 data는 복원 시 앱에 전달되는 MAMBackupDataInput의 지역 변수 이름입니다.Where data is the local variable name for the MAMBackupDataInput that is passed to your app upon restore.

다중 ID(선택 사항)Multi-Identity (optional)

개요Overview

기본적으로 Intune 앱 SDK는 앱에 전체적으로 정책을 적용합니다.By default, the Intune App SDK will apply policy to the app as a whole. 다중 ID는 정책을 ID 수준별로 적용하기 위해 설정할 수 있는 선택적 Intune 앱 보호 기능입니다.Multi-identity is an optional Intune app protection feature that can be enabled to allow policy to be applied on a per-identity level. 이 기능을 사용하려면 다른 앱 보호 기능보다 훨씬 더 많은 앱 참여가 필요합니다.This requires significantly more app participation than other app protection features.

참고

올바른 앱 참여가 없으면 데이터가 누수되고 다른 보안 문제가 발생할 수 있습니다.A lack of the correct app participation can result in data leaks and other security issues.

사용자가 디바이스 또는 앱을 등록하고 나면 SDK에서 이 ID를 등록하고 이를 기본 Intune 관리 ID로 간주합니다.Once the user enrolls the device or the app, the SDK registers this identity and considers it the primary Intune managed identity. 앱의 다른 사용자는 무제한 정책 설정이 적용되는 관리되지 않는 항목으로 처리됩니다.Other users in the app will be treated as unmanaged, with unrestricted policy settings.

참고

현재 Intune 관리 ID는 디바이스당 하나만 지원됩니다.Currently, only one Intune managed identity is supported per device.

ID는 문자열로 정의됩니다.An identity is defined as a string. ID는 대/소문자를 구분하지 않음이며, ID와 관련한 SDK에 대한 요청은 ID를 설정할 때 원래 사용된 것과 같은 대/소문자를 반환하지 않을 수도 있습니다.Identities are case-insensitive, and requests to the SDK for an identity may not return the same casing that was originally used when setting the identity.

앱은 활성 ID를 변경하려는 경우 SDK에 알려야 합니다.The app must inform the SDK when it intends to change the active identity. 경우에 따라 SDK는 ID 변경이 필요한 경우 앱에도 알립니다.In some cases, the SDK will also notify the app when an identity change is required. 그러나 대부분의 경우 MAM은 어떤 데이터가 UI에 표시되거나 특정 시점에 스레드에서 사용되고 있고 데이터 누수를 피하기 위해 올바른 ID를 설정하는 데 앱을 사용하는지 알 수 없습니다.In most cases, however, MAM cannot know what data is being displayed in the UI or used on a thread at a given time and relies on the app to set the correct identity in order to avoid data leak. 다음에 나오는 섹션에서는 앱 작업이 필요한 일부 특정 시나리오가 설명됩니다.In the sections that follow, some particular scenarios which require app action will be called out.

다중 ID 사용Enabling Multi-Identity

기본적으로 모든 앱은 단일 ID 앱으로 간주합니다.By default, all apps are considered to be single-identity apps. AndroidManifest.xml에 다음 메타데이터를 두어 앱에서 다중 ID를 인식할 수 있음을 선언할 수 있습니다.You can declare an app to be multi-identity aware by placing the following metadata in AndroidManifest.xml.

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

ID 설정Setting the Identity

개발자는 다음 수준에서 앱 사용자의 ID를 우선순위에 따라 내림차순으로 설정할 수 있습니다.Developers can set the identity of the app user on the following levels in descending priority:

  1. 스레드 수준Thread level
  2. Context(일반적으로 Activity) 수준Context (generally Activity) level
  3. 프로세스 수준Process level

스레드 수준에서 설정된 ID는 Context 수준에서 설정된 ID를 대체하고 프로세스 수준에서 설정된 ID를 대체합니다.An identity set at the thread level supersedes an identity set at the Context level, which supersedes an identity set at the process level. Context에서 설정된 ID는 해당하는 관련 시나리오에만 사용됩니다.An identity set on a Context is only used in appropriate associated scenarios. 예를 들어 파일 IO 작업에는 연결된 Context가 없습니다.File IO operations, for example, do not have an associated Context. 일반적으로 앱은 Activity에 대한 Context ID를 설정합니다.Most commonly, apps will set the Context identity on an Activity. Activity ID가 동일한 ID로 설정되지 않는 한 앱은 관리되는 ID에 대한 데이터를 표시하면 안 됩니다.An app must not display data for a managed identity unless the Activity identity is set to that same identity. 일반적으로 프로세스 수준 ID는 모든 스레드에서 한 번에 한 명의 사용자만 앱을 사용하는 경우에만 유용합니다.In general, the process-level identity is only useful if the app works only with a single user at a time on all threads. 대부분의 앱은 해당 ID를 사용할 필요가 없을 수 있습니다.Many apps may not need to make use of it.

앱에서 Application 컨텍스트를 사용하여 시스템 서비스를 획득하는 경우 스레드 또는 프로세스 ID가 설정되었는지, 또는 앱의 Application 컨텍스트에서 UI ID를 설정했는지 확인해야 합니다.If your app uses the Application context to acquire system services, ensure that the thread or process identity has been set, or that you have set the UI identity on your app's Application context.

앱이 Service 컨텍스트를 사용하여 의도를 시작하거나, 콘텐츠 확인자를 사용하거나, 다른 시스템 서비스를 이용하는 경우 Service 컨텍스트에서 ID를 설정해야 합니다.If your app uses a Service context to launch intents, use content resolvers, or leverage other system services be sure to set the identity on the Service context.

setUIPolicyIdentity 또는 switchMAMIdentity로 UI ID를 업데이트하는 특수한 경우를 처리하기 위해 두 메서드 모두에 IdentitySwitchOption 값의 집합을 전달할 수 있습니다.To handle special cases when updating the UI identity with setUIPolicyIdentity or switchMAMIdentity, both methods can be passed a set of IdentitySwitchOption values.

  • IGNORE_INTENT: 현재 작업과 연결된 의도를 무시해야 하는 ID 전환을 요청하는 경우에 사용합니다.IGNORE_INTENT: Use if requesting an identity switch that should ignore the intent associated with the current activity. 예를 들면 다음과 같습니다.For example:

    1. 관리형 문서를 포함하고 있는 관리 ID에서 의도를 수신하는 앱이 문서를 표시합니다.Your app receives an intent from a managed identity containing a managed document, and your app displays the document.
    2. 사용자가 자신의 개인 ID로 전환하고, 앱은 UI ID 전환을 요청합니다.The user switches to their personal identity, so your app requests a UI identity switch. 개인 ID에서는 앱이 더 이상 문서를 표시하지 않으므로 ID 전환을 요청할 때 IGNORE_INTENT를 사용합니다.In the personal identity, your app is no longer displaying the document, so you use IGNORE_INTENT when requesting the identity switch.
  • DATA_FROM_INTENT: 의도의 데이터가 작업에 표시될 때 ID 전환을 요청하는 경우에 사용합니다.DATA_FROM_INTENT: Use if requesting an identity switch when data from the intent will be displayed in the activity. IGNORE_INTENT의 반대입니다.The opposite of IGNORE_INTENT. 그러면 의도를 수신 데이터로 처리하도록 새 ID에 대한 정책이 수신됩니다.This will cause receive policy for the new identity to treat the intent as incoming data.

    예를 들면 다음과 같습니다. 앱은 앱을 특정 계정에 상호 연결하는 메타데이터가 포함된 의도를 수신합니다.For example: Your app receives an intent containing metadata that correlates it to a specific account. 앱은 ID 전환을 요청하지만 원래 의도의 데이터를 표시합니다.Your app requests an identity switch, but will be displaying data from the original intent.

둘 다 설정하지 않으면 이전 버전과의 호환성을 위해 중간쯤이 기본 동작이 됩니다.If neither is set, the default behavior is somewhere in-between for historical compatibility. MAM은 DATA_FROM_INTENT와 같이 가장 최근 의도가 앱에서 아직 사용된다고 가정하지만 동일한 앱 내에서 또는 시스템 시작 관리자에서 전송된 의도를 비롯한 특정 조건의 범위는 데이터 수신 검사를 무시합니다.MAM will assume that the most recent intent is still being used in the app as with DATA_FROM_INTENT, however a range of special conditions including the intent having been sent from within the same app or from the system launcher will bypass data ingress checking.

참고

CLIPBOARD_SERVICE는 UI 작업에 사용되므로, SDK는 포그라운드 작업의 UI ID를 ClipboardManager 작업에 사용합니다.Because the CLIPBOARD_SERVICE is used for UI operations, the SDK uses the UI identity of the foreground activity for ClipboardManager operations.

MAMPolicyManager의 다음 메서드는 ID를 설정하고 이전에 설정한 ID 값을 검색하는 데 사용될 수 있습니다.The following methods in MAMPolicyManager may be used to set the identity and retrieve the identity values previously set.

public static void setUIPolicyIdentity(final Context context, final String identity, final MAMSetUIIdentityCallback mamSetUIIdentityCallback,
final EnumSet<IdentitySwitchOption> options);

public static String getUIPolicyIdentity(final Context context);

public static MAMIdentitySwitchResult setProcessIdentity(final String identity);

public static String getProcessIdentity();

public static MAMIdentitySwitchResult setCurrentThreadIdentity(final String identity);

public static String getCurrentThreadIdentity();

/**
 * Get the current app policy. This does NOT take the UI (Context) identity into account.
 * If the current operation has any context (e.g. an Activity) associated with it, use the overload below.
 */
public static AppPolicy getPolicy();

/**
 * Get the current app policy. This DOES take the UI (Context) identity into account.
 * If the current operation has any context (e.g. an Activity) associated with it, use this function.
 */
public static AppPolicy getPolicy(final Context context);


public static AppPolicy getPolicyForIdentity(final String identity);

public static boolean getIsIdentityManaged(final String identity);

참고

앱의 ID를 Null로 설정하여 ID를 지울 수 있습니다.You can clear the identity of the app by setting it to null.

빈 문자열을 앱 보호 정책이 없는 ID로 사용할 수 있습니다.The empty string may be used as an identity that will never have app protection policy.

결과Results

ID를 설정하는 데 사용된 모든 메서드는 MAMIdentitySwitchResult를 통해 결과 값을 다시 보고합니다.All the methods used to set the identity report back result values via MAMIdentitySwitchResult. 반환될 수 있는 네 개의 값은 다음과 같습니다.There are four values that can be returned:

반환 값Return value 시나리오Scenario
SUCCEEDED ID가 변경되었습니다.The identity change was successful.
NOT_ALLOWED ID 변경이 허용되지 않습니다.The identity change is not allowed. 현재 스레드에 다른 ID가 설정되어 있을 때 UI(Context) ID를 설정하려고 할 경우 이 작업이 수행됩니다.This occurs if an attempt is made to set the UI (Context) identity when a different identity is set on the current thread.
CANCELLED 사용자가 보통 PIN 또는 인증 프롬프트에서 뒤로 단추를 눌러 ID 변경을 취소했습니다.The user canceled the identity change, generally by pressing the back button on a PIN or authentication prompt.
FAILED 알 수 없는 이유로 ID 변경에 실패했습니다.The identity change failed for an unspecified reason.

앱에서 회사 데이터를 표시하거나 사용하기 전에 ID 전환이 성공적인지 확인해야 합니다.The app should ensure that an identity switch is successful before displaying or using corporate data. 현재는 다중 ID 사용 앱에 대한 프로세스 및 스레드 ID 전환이 항상 성공하지만, 실패 조건을 추가할 권한은 Microsoft가 보유합니다.Currently, process and thread identity switches will always succeed for a multi-identity-enabled app, however we reserve the right to add failure conditions. UI ID가 스레드 ID와 충돌하거나 사용자가 조건부 시작 요구 사항을 취소하는 경우 잘못된 인수로 인해 UI ID 전환이 실패할 수 있습니다(예: PIN 화면에서 [뒤로] 단추를 누름).The UI identity switch may fail for invalid arguments, if it would conflict with the thread identity, or if the user cancels out of conditional launch requirements (for example, presses the back button on the PIN screen). 작업에 대한 실패한 UI ID 스위치의 기본 동작은 작업을 마치는 것입니다(아래 onSwitchMAMIdentityComplete 참조).The default behavior for a failed UI identity switch on an activity is to finish the activity (see onSwitchMAMIdentityComplete below).

setUIPolicyIdentity를 통해 Context ID를 설정할 경우 결과는 비동기적으로 보고됩니다.In the case of setting a Context identity via setUIPolicyIdentity, the result is reported asynchronously. ContextActivity인 경우에는 SDK가 PIN이나 전체 회사 자격 증명을 입력해야 할 수 있는 조건부 시작이 수행된 후까지 ID 변경에 성공했는지 알 수 없게 됩니다.If the Context is an Activity, the SDK doesn't know if the identity change succeeded until after conditional launch is performed -- which may require the user to enter a PIN or corporate credentials. 앱은 MAMSetUIIdentityCallback를 구현하여 이 결과를 수신하거나 콜백 개체에 대해 null을 전달할 수 있습니다.The app may implement a MAMSetUIIdentityCallback to receive this result, or may pass null for the callback object. ‘동일한 컨텍스트에서’ setUIPolicyIdentity에 대한 이전 호출의 결과가 아직 전달되지 않았지만 setUIPolicyIdentity가 호출된 경우 새 콜백이 이전 콜백을 대체하고 원래 콜백은 결과를 수신하지 않습니다.Note that if a call is made to setUIPolicyIdentity while the result from a previous call to setUIPolicyIdentity on the same context has not yet been delivered, the new callback will supersede the old one and the original callback will never receive a result.

MAMPolicyManager.setUIPolicyIdentity를 호출하는 대신 MAMActivity의 메서드를 통해 직접 작업의 ID를 설정할 수도 있습니다.You can also set the identity of an activity directly through a method in MAMActivity instead of calling MAMPolicyManager.setUIPolicyIdentity. 이렇게 하려면 다음 메서드를 사용하세요.Use following method to do so:

     public final void switchMAMIdentity(final String newIdentity, final EnumSet<IdentitySwitchOption> options);

해당 활동의 ID를 변경하려는 시도의 결과를 앱에 알리려는 경우 MAMActivity의 메서드를 재정의할 수도 있습니다.You can also override a method in MAMActivity if you want the app to be notified of the result of attempts to change the identity of that activity.

    public void onSwitchMAMIdentityComplete(final MAMIdentitySwitchResult result);

onSwitchMAMIdentityComplete를 재정의하지 않으면(또는 super 메서드를 호출하면) 작업에 대한 ID 전환 실패 시 작업이 완료됩니다.If you do not override onSwitchMAMIdentityComplete (or call the super method), a failed identity switch on an activity will result in the activity being finished. 메서드를 재정의하는 경우 ID 전환이 실패한 후 회사 데이터가 표시되지 않도록 주의해야 합니다.If you do override the method, you must take care that corporate data is not displayed after a failed identity switch.

참고

ID를 전환하려면 작업을 다시 만들어야 할 수 있습니다.Switching the identity may require recreating the activity. 이 경우 onSwitchMAMIdentityComplete 콜백이 작업의 새 인스턴스에 전달됩니다.In this case, the onSwitchMAMIdentityComplete callback will be delivered to the new instance of the activity.

명시적 ID 변경Implicit Identity Changes

앱의 ID 설정 기능 이외에도, 앱 보호 정책이 적용된 다른 Intune 관리 앱의 데이터 수신에 따라 스레드 또는 컨텍스트의 ID가 변경될 수 있습니다.In addition to the app's ability to set the identity, a thread, or a context's identity may change based on data ingress from another Intune-managed app that has app protection policy.

Examples

  1. 다른 MAM 앱에서 보낸 Intent에서 작업이 시작된 경우에는 Intent가 전송된 시점의 다른 앱에서 유효한 ID에 따라 작업 ID가 설정됩니다.If an activity is launched from an Intent sent by another MAM app, the activity's identity will be set based on the effective identity in the other app at the point the Intent was sent.

  2. 서비스의 경우 onStart 또는 onBind 호출 기간 동안 스레드 ID가 비슷하게 설정됩니다.For services, the thread identity will be set similarly for the duration of an onStart or onBind call. onBind에서 반환된 Binder 호출도 일시적으로 스레드 ID를 설정합니다.Calls into the Binder returned from onBind will also temporarily set the thread identity.

  3. 마찬가지로 ContentProvider 호출은 해당 기간에 대한 스레드 ID를 설정합니다.Calls into a ContentProvider will similarly set the thread identity for their duration.

또한 사용자가 작업을 조작하면 암시적 ID 전환이 수행될 수 있습니다.In addition, user interaction with an activity may cause an implicit identity switch.

예제: 사용자가 Resume 중에 인증 프롬프트에서 취소하면 암시적으로 빈 ID로 전환됩니다.Example: A user canceling out of an authorization prompt during Resume will result in an implicit switch to an empty identity.

앱은 이러한 변경 내용을 인식하고 필요한 경우 앱에서 변경을 금지할 수 있습니다.The app is given an opportunity to be made aware of these changes, and, if it must, the app can forbid them. MAMServiceMAMContentProvider는 서브클래스가 재정의할 수 있는 다음 메서드를 공개합니다.MAMService and MAMContentProvider expose the following method that subclasses may override:

public void onMAMIdentitySwitchRequired(final String identity,
        final AppIdentitySwitchResultCallback callback);

MAMActivity 클래스에서 메서드에 다음과 같은 추가 매개 변수가 있습니다.In the MAMActivity class, an additional parameter is present in the method:

public void onMAMIdentitySwitchRequired(final String identity,
        final AppIdentitySwitchReason reason,
        final AppIdentitySwitchResultCallback callback);
  • AppIdentitySwitchReason은 암시적 전환의 원인을 캡처하며 CREATE, RESUME_CANCELLEDNEW_INTENT 값을 사용할 수 있습니다.The AppIdentitySwitchReason captures the source of the implicit switch, and can accept the values CREATE, RESUME_CANCELLED, and NEW_INTENT. RESUME_CANCELLED 이유는 작업이 다시 시작되어 PIN,인증 또는 기타 준수 UI가 표시되고 사용자가 일반적으로 뒤로 단추를 사용하여 해당 UI를 취소하려고 할 때 사용됩니다.The RESUME_CANCELLED reason is used when activity resume causes PIN, authentication, or other compliance UI to be displayed and the user attempts to cancel out of that UI, generally though use of the back button.

    • AppIdentitySwitchResultCallback은 다음과 같습니다.The AppIdentitySwitchResultCallback is as follows:

      public interface AppIdentitySwitchResultCallback {
          /**
            * @param result
            *            whether the identity switch can proceed.
            */
          void reportIdentitySwitchResult(AppIdentitySwitchResult result);
        }
      

      여기서 [AppIdentitySwitchResult]는 SUCCESS 또는 FAILURE입니다.Where [AppIdentitySwitchResult] is either SUCCESS or FAILURE.

MAMService.onMAMBind에서 반환된 Binder 를 통해 적용된 변경을 제외하고 모든 암시적 ID 변경에 대해 onMAMIdentitySwitchRequired 메서드가 호출됩니다.The method onMAMIdentitySwitchRequired is called for all implicit identity changes except for those made through a Binder returned from MAMService.onMAMBind. 기본 onMAMIdentitySwitchRequired 구현에서 즉시 다음을 호출합니다.The default implementations of onMAMIdentitySwitchRequired immediately call:

  • 이유가 RESUME_CANCELLED이면 callback.reportIdentitySwitchResult(FAILURE).callback.reportIdentitySwitchResult(FAILURE) when the reason is RESUME_CANCELLED.

  • 다른 모든 경우에는 callback.reportIdentitySwitchResult(SUCCESS).callback.reportIdentitySwitchResult(SUCCESS) in all other cases.

    대부분 앱은 ID 전환을 다른 방식으로 차단하거나 연기할 필요가 없지만, 앱이 이렇게 해야 할 경우에는 다음 사항을 고려해야 합니다.It is not expected that most apps will need to block or delay an identity switch in a different manner, but if an app needs to do so, the following points must be considered:

    • ID 전환을 차단하는 경우의 결과는 Receive 공유 설정이 데이터 수신을 금지한 경우와 동일합니다.If an identity switch is blocked, the result is the same as if Receive sharing settings had prohibited the data ingress.

    • 서비스가 주 스레드에서 실행 중이면 reportIdentitySwitchResult를 동기적으로 호출 해야 합니다. 그러지 않으면 UI 스레드가 응답을 중지합니다.If a Service is running on the main thread, reportIdentitySwitchResult must be called synchronously or the UI thread stops responding.

    • Activity 생성의 경우 onMAMIdentitySwitchRequiredonMAMCreate 전에 호출됩니다.For Activity creation, onMAMIdentitySwitchRequired will be called before onMAMCreate. 앱이 ID 전환 허용 여부를 결정하기 위해 UI를 표시해야 할 경우 해당 UI는 다른 작업을 통해 표시되어야 합니다.If the app must show UI to determine whether to allow the identity switch, that UI must be shown using a different activity.

    • Activity 에서 RESUME_CANCELLED와 같은 이유로 빈 ID로 전환해야 할 경우 앱은 데이터를 해당 ID 전환과 일관되게 표시하도록 다시 시작된 작업을 수정해야 합니다.In an Activity, when a switch to the empty identity is requested with the reason as RESUME_CANCELLED, the app must modify the resumed activity to display data consistent with that identity switch. 이 작업을 수행할 수 없으면 앱은 전환을 거부하고 사용자에게는 ID를 다시 시작하기 위해 정책을 준수할지 묻는 메시지가 다시 표시됩니다(예: 앱 PIN 입력 화면 표시).If this is not possible, the app should refuse the switch, and the user will be asked again to comply with policy for the resuming identity (for example, by being presented with the app PIN entry screen).

      참고

      다중 ID 앱은 항상 관리되는 앱과 관리되지 않는 앱에서 들어오는 데이터를 둘 다 수신합니다.A multi-identity app will always receive incoming data from both managed and unmanaged apps. 앱은 관리되는 ID의 데이터를 관리되는 방식으로 처리해야 합니다.It is the responsibility of the app to treat data from managed identities in a managed manner.

    요청된 ID가 관리되지만(MAMPolicyManager.getIsIdentityManaged를 사용하여 확인) 앱이 이메일 계정 등의 계정을 먼저 설정해야 하기 때문에 해당 계정을 사용할 수 없다면 ID 전환이 거부됩니다.If a requested identity is managed (use MAMPolicyManager.getIsIdentityManaged to check), but the app is not able to use that account (for example, because accounts, such as email accounts, must be set up in the app first) then the identity switch should be refused.

빌드 플러그 인/도구 고려 사항Build plugin / tool considerations

MAMActivity, MAMService 또는 MAMContentProvider에서 명시적으로 상속하지 않지만(빌드 도구를 통한 변경을 허용하기 때문에) 프로세스 ID 전환은 필요한 경우, Activity에 대해서는 MAMActivityIdentityRequirementListener, Service 또는 ContentProviders에 대해서는 MAMIdentityRequirementListener를 대신 구현할 수 있습니다.If you do not explicitly inherit from MAMActivity, MAMService, or MAMContentProvider (because you allow the build tooling to make that change), but still need to process identity switches, you may instead implement MAMActivityIdentityRequirementListener for an Activity or MAMIdentityRequirementListener for a Service or ContentProviders. 정적 메서드 MAMActivity.defaultOnMAMIdentitySwitchRequired(activity, identity, reason, callback)를 호출하여 MAMActivity.onMAMIdentitySwitchRequired의 기본 동작에 액세스할 수 있습니다.The default behavior for MAMActivity.onMAMIdentitySwitchRequired can be accessed by calling the static method MAMActivity.defaultOnMAMIdentitySwitchRequired(activity, identity, reason, callback).

마찬가지로 MAMActivity.onSwitchMAMIdentityComplete을 재정의해야 하는 경우 MAMActivity에서 명시적으로 상속하지 않고 MAMActivityIdentitySwitchListener를 구현할 수 있습니다.Similarly, if you need to override MAMActivity.onSwitchMAMIdentityComplete, you may implement MAMActivityIdentitySwitchListener without explicitly inheriting from MAMActivity.

비동기 작업에서 ID 유지Preserving Identity In Async Operations

UI 스레드의 작업에서 백그라운드 작업을 다른 스레드에 발송하는 것은 일반적입니다.It is common for operations on the UI thread to dispatch background tasks to another thread. 다중 ID 앱은 이러한 백그라운드 작업이 적절한 ID로 작동하는지 확인하려고 합니다. 적절한 ID는 ID를 발송한 작업에 사용되는 ID와 동일한 경우가 많습니다.A multi-identity app will want to make sure that these background tasks operate with the appropriate identity, which is often the same identity used by the activity that dispatched them. MAM SDK는 ID 보존에 도움이 되도록 편의상 MAMAsyncTaskMAMIdentityExecutors를 제공합니다.The MAM SDK provides MAMAsyncTask and MAMIdentityExecutors as a convenience to aid in preserving the identity. 비동기 작업에서 회사 데이터를 파일에 쓸 수 있거나 다른 앱과 통신할 수 있을 때 사용해야 합니다.These must be used if the asynchronous operation could write corporate data to a file or could communicate with other apps.

MAMAsyncTaskMAMAsyncTask

MAMAsyncTask를 사용하려면 AsyncTask 대신 해당 함수를 상속 받고 doInBackgroundonPreExecute의 재정의를 각각 doInBackgroundMAMonPreExecuteMAM으로 바꿉니다.To use MAMAsyncTask, simply inherit from it instead of AsyncTask and replace overrides of doInBackground and onPreExecute with doInBackgroundMAM and onPreExecuteMAM respectively. MAMAsyncTask 생성자는 작업 컨텍스트를 사용합니다.The MAMAsyncTask constructor takes an activity context. 예를 들면 다음과 같습니다.For example:

AsyncTask<Object, Object, Object> task = new MAMAsyncTask<Object, Object, Object>(thisActivity) {

    @Override
    protected Object doInBackgroundMAM(final Object[] params) {
        // Do operations.
    }

    @Override
    protected void onPreExecuteMAM() {
        // Do setup.
    };
}

MAMIdentityExecutorsMAMIdentityExecutors

MAMIdentityExecutors를 사용하면 wrapExecutorwrapExecutorService 메서드를 통해 기존의 Executor 또는 ExecutorService 인스턴스를 ID를 유지하는 Executor/ExecutorService로 래핑할 수 있습니다.MAMIdentityExecutors allows you to wrap an existing Executor or ExecutorService instance as an identity-preserving Executor/ExecutorService with wrapExecutor and wrapExecutorService methods. For example

Executor wrappedExecutor = MAMIdentityExecutors.wrapExecutor(originalExecutor, activity);
ExecutorService wrappedService = MAMIdentityExecutors.wrapExecutorService(originalExecutorService, activity);

파일 보호File Protection

모든 파일은 만들어질 때 스레드 및 프로세스 ID를 기준으로 하는 ID에 연결됩니다.Every file has an identity associated with it at the time of creation, based on thread and process identity. 이 ID는 파일 암호화 및 선택적 초기화에 둘 다 사용됩니다.This identity will be used for both file encryption and selective wipe. ID가 관리되고 암호화를 요구하는 정책이 있는 파일만 암호화됩니다.Only files whose identity is managed and has policy requiring encryption will be encrypted. SDK의 기본 선택적 기능 초기화는 초기화가 요청된 관리 ID와 연결된 파일만 초기화합니다.The SDK's default selective functionality wipe will only wipe files associated with the managed identity for which a wipe has been requested. 앱은 MAMFileProtectionManager 클래스를 사용하여 파일의 ID를 쿼리하거나 변경할 수 있습니다.The app may query or change a file’s identity using the MAMFileProtectionManager class.

앱 책임App Responsibility

MAM은 읽고 있는 파일과 Activity에 표시되는 데이터 간 관계를 자동으로 유추할 수 없습니다. 앱은 회사 데이터를 표시하기 전에 UI ID를 적절하게 설정해야 합니다. 여기에는 파일에서 읽은 데이터가 포함됩니다. 파일이 앱 외부에서 제공된 경우(ContentProvider에서 제공되거나 공개적으로 쓰기 가능한 위치에서 읽은 경우) 앱은 파일에서 읽은 정보를 표시하기 전에 파일 ID를 확인하려고 시도해야 합니다(데이터 원본에 대해 올바른 MAMFileProtectionManager.getProtectionInfo 오버로드 사용). getProtectionInfo가 null이 아니고 비어 있지 않은 ID를 보고할 경우 UI ID는 이 ID와 일치하도록 설정되어야 합니다(MAMActivity.switchMAMIdentity 또는 MAMPolicyManager.setUIPolicyIdentity 사용).MAM cannot automatically infer a relationship between files being read and data being displayed in an Activity. Apps must set the UI identity appropriately before displaying corporate data. This includes data read from files. If a file comes from outside the app (either from a ContentProvider or read from a publicly writable location), the app must attempt to determine the file identity (using the correct MAMFileProtectionManager.getProtectionInfo overload for the data source) before displaying information read from the file. If getProtectionInfo reports a non-null, non-empty identity, the UI identity must be set to match this identity (using MAMActivity.switchMAMIdentity or MAMPolicyManager.setUIPolicyIdentity). ID 전환에 실패하는 경우 파일의 데이터가 표시되지 않아야 합니다.If the identity switch fails, data from the file must not be displayed.

예제 흐름은 다음과 같이 표시될 수 있습니다.An example flow might look something like the following:

  • 사용자가 앱에서 열 문서를 선택합니다.User selects a document to open in the app.

  • 열기 흐름 중에 디스크에서 데이터를 읽기 전에 앱이 콘텐츠를 표시하는 데 사용되어야 하는 ID를 확인합니다.During the open flow, prior to reading data from disk, the app confirms the identity that should be used to display the content:

    MAMFileProtectionInfo info = MAMFileProtectionManager.getProtectionInfo(docPath)
    if (info != null)
        MAMPolicyManager.setUIPolicyIdentity(activity, info.getIdentity(), callback, EnumSet.noneOf<IdentitySwitchOption.class>)
    
  • 앱이 결과가 콜백에 보고될 때까지 기다립니다.The app waits until a result is reported to callback.

  • 보고된 결과가 실패인 경우 앱이 문서를 표시하지 않습니다.If the reported result is a failure, the app does not display the document.

  • 앱이 파일을 열고 렌더링합니다.The app opens and renders the file.

앱이 Android DownloadManager를 사용하여 파일을 다운로드하는 경우 MAM SDK는 프로세스 ID를 사용하여 이 파일을 자동으로 보호하려고 시도합니다.If an app uses the Android DownloadManager to download files, the MAM SDK will attempt to protect these files automatically using the process identity. 다운로드한 파일에 회사 데이터가 포함되어 있으면 다운로드한 후 파일을 이동하거나 다시 만들 경우 앱이 protect를 호출해야 합니다.If the downloaded files contain corporate data, it is the app's responsibility to call protect if the files are moved or recreated after download.

단일 ID에서 다중 ID로 전환Single-Identity to Multi-Identity Transition

이전에 단일 ID Intune을 통합하여 릴리스된 앱이 이후에 다중 ID를 통합하는 경우 이전에 설치된 앱이 전환됩니다(사용자에게는 보이지 않으며 연결된 UX는 없음). 앱이 이 전환을 처리하기 위해 명시적으로 해야 하는 것은 없습니다. 전환 이전에 생성된 모든 파일은 계속해서 관리되는 것으로 간주됩니다(따라서 암호화 정책이 설정된 상태이면 암호화 상태 유지). 원한다면 업그레이드를 검색하고 MAMFileProtectionManager.protect를 사용하여 특정 파일 또는 디렉터리에 빈 ID를 태그로 지정할 수 있습니다(이렇게 하면 암호화된 파일 또는 디렉터리의 암호화가 제거됩니다).If an app which previously released with single-identity Intune integration later integrates multi-identity, previously installed apps will experience a transition (not visible to the user, there is no associated UX). The app is not required to do anything explicit to handle this transition. All files created before the transition will continue being regarded as managed (so they will stay encrypted if encryption policy is on). If desired, you can detect the upgrade and use MAMFileProtectionManager.protect to tag specific files or directories with the empty identity (which will remove encryption if they were encrypted).

오프라인 시나리오Offline Scenarios

오프라인 모드에서 파일 ID 태그를 지정할 경우 주의하세요.File identity tagging is sensitive to offline mode. 다음 사항을 고려해야 합니다.The following points should be taken into account:

  • 회사 포털이 설치되지 않으면 파일에 ID 태그를 지정할 수 없습니다.If the Company Portal is not installed, files cannot be identity-tagged.

  • 회사 포털이 설치되어 있지만 앱에 Intune MAM 정책이 없으면 파일에 안정적으로 ID 태그를 지정할 수 없습니다.If the Company Portal is installed, but the app does not have Intune MAM policy, files cannot be reliably tagged with identity.

  • 파일 ID 태그 지정을 사용할 수 있으면 이전에 만든 모든 파일이 빈 문자열 ID에 속한 개인용/비관리로 처리됩니다. 단, 앱이 이전에 파일이 등록된 사용자에게 속하는 것으로 처리되는 경우의 단일 ID 관리 앱으로 설치된 경우는 개인용으로 처리되지 않습니다.When file identity tagging becomes available, all previously created files are treated as personal/unmanaged (belonging to the empty-string identity) unless the app was previously installed as a single-identity managed app in which case they are treated as belonging to the enrolled user.

디렉터리 보호Directory Protection

파일을 보호하는 데 사용하는 protect 메서드와 동일한 메서드로 디렉터리를 보호할 수 있습니다.Directories may be protected using the same protect method used to protect files. 디렉터리 보호는 디렉터리에 포함된 모든 파일과 하위 디렉터리 및 해당 디렉터리에서 만들 새 파일에 반복적으로 적용됩니다.Directory protection applies recursively to all files and subdirectories contained in the directory, and to new files created within the directory. 디렉터리 보호는 반복적으로 적용되므로 protect 호출에서 매우 큰 디렉토리를 완료하는 데 시간이 오래 걸릴 수 있습니다.Because directory protection is applied recursively, the protect call can take some time to complete for large directories. 이런 이유로 인해 다수의 파일을 포함하는 디렉터리에 보호를 적용하는 앱이 백그라운드 스레드에서 비동기적으로 protect를 실행할 수 있습니다.For that reason, apps applying protection to a directory that contains a large number of files might wish to run protect asynchronously on a background thread.

데이터 보호Data Protection

여러 ID에 속하는 것으로 파일에 태그를 지정할 수는 없습니다.It is not possible to tag a file as belonging to multiple identities. 여러 사용자에게 속한 데이터를 같은 파일에 저장해야 하는 앱은 MAMDataProtectionManager에서 제공한 기능을 사용하여 이 작업을 수행할 수 있습니다.Apps that must store data belonging to different users in the same file can do so manually, using the features provided by MAMDataProtectionManager. 이렇게 하면 앱이 데이터를 암호화하고 특정 사용자에게 연결할 수 있습니다.This allows the app to encrypt data and tie it to a particular user. 암호화된 데이터는 파일로 디스크에 저장하는 데 적합합니다.The encrypted data is suitable for storing to disk in a file. ID와 연결된 데이터를 쿼리하고 나중에 데이터를 암호 해제할 수 있습니다.You can query the data associated with the identity and the data can be unencrypted later.

MAMDataProtectionManager를 활용하는 앱에서는 MANAGEMENT_REMOVED 알림의 수신기를 구현해야 합니다.Apps that make use of MAMDataProtectionManager should implement a receiver for the MANAGEMENT_REMOVED notification. 이 알림이 완료되고 나면, 버퍼를 보호할 때 파일 암호화가 사용된 경우 이 클래스를 통해 보호된 버퍼를 더 이상 읽을 수 없게 됩니다.After this notification completes, buffers that were protected via this class will no longer be readable if file encryption was enabled when the buffers were protected. 앱에서 이 알림 중에 모든 버퍼에서 MAMDataProtectionManager.unprotect를 호출하여 이 상황을 해결할 수 있습니다.An app can remediate this situation by calling MAMDataProtectionManager.unprotect on all buffers during this notification. 또한 ID 정보를 유지하려는 경우 이 알림 중에 보호를 호출하는 것이 안전합니다. 알림 중에는 암호화가 사용되지 않습니다.It is also safe to call protect during this notification if it is desired to preserve identity information -- encryption is guaranteed to be disabled during the notification.

콘텐츠 공급자Content Providers

앱에서 ContentProvider를 통해 ParcelFileDescriptor 이외의 회사 데이터를 제공하는 경우 앱에서 MAMContentProviderisProvideContentAllowed(String) 메서드를 호출하여 콘텐츠에 대한 소유자 ID의 UPN(사용자 계정 이름)을 전달해야 합니다.If the app provides corporate data other than a ParcelFileDescriptor through a ContentProvider, the app must call the method isProvideContentAllowed(String) in MAMContentProvider, passing the owner identity's UPN (user principal name) for the content. 이 함수가 false를 반환하면 콘텐츠가 호출자에게 반환 하지 말아야 합니다.If this function returns false, the content must not be returned to the caller. 콘텐츠 공급자를 통해 반환된 파일 설명자는 파일 ID에 따라 자동으로 처리됩니다.File descriptors returned through a content provider are handled automatically based on the file identity.

MAMContentProvider를 명시적으로 상속하는 대신 빌드 도구가 변경 작업을 처리하도록 허용하는 경우 동일한 MAMContentProvider.isProvideContentAllowed(provider, contentIdentity) 메서드의 정적 버전을 호출할 수 있습니다.If you do not inherit MAMContentProvider explicitly and instead allow the build tooling to make that change, you may call a static version of the same method: MAMContentProvider.isProvideContentAllowed(provider, contentIdentity).

선택적 초기화Selective Wipe

WIPE_USER_DATA 알림에 대해 다중 ID 앱을 등록할 경우, 해당 사용자에게 속한 것으로 ID 태그된 모든 파일을 포함하여 초기화된 사용자의 모든 데이터를 제거할 책임이 앱에 있습니다. 앱이 파일에서 사용자 데이터를 제거하지만 다른 데이터는 파일에 남겨 두려는 경우 파일의 ID를 변경해야 합니다(MAMFileProtectionManager.protect를 통해 개인 사용자 또는 빈 ID로 변경).If a multi-identity app registers for the WIPE_USER_DATA notification, it is the app's responsibility to remove all data for the user being wiped, including all files that have been identity-tagged as belonging to that user. If the app removes user data from a file but wishes to leave other data in the file, it must change the identity of the file (via MAMFileProtectionManager.protect to a personal user or the empty identity). 암호화 정책을 사용할 경우 정리되는 사용자에 속한 모든 나머지 파일은 암호 해독되지 않으며 초기화 후에 앱에 액세스할 수 없게 됩니다.If encryption policy is in use, any remaining files belonging to the user being wiped will not be decrypted and will become inaccessible to the app after wipe.

WIPE_USER_DATA에 등록한 앱에는 SDK 기본 선택적 초기화 동작이 적용되지 않습니다.An app registering for WIPE_USER_DATA will not receive the benefit of the SDK's default selective wipe behavior. 다중 ID 인식 앱의 경우 MAM 기본 선택적 초기화는 초기화의 대상이 되는 ID가 있는 파일만 초기화하므로 더 많이 유실될 수 있습니다.For multi-identity aware apps, this loss may be more significant since MAM default selective wipe will wipe only files whose identity is targeted by a wipe. 다중 ID 인식 애플리케이션에서 MAM 기본 선택적 초기화를 수행하고 초기화 시 자체 작업 또한 수행하려는 경우 WIPE_USER_AUXILIARY_DATA 알림에 등록해야 합니다.If a multi-identity aware application wishes MAM default selective wipe to be done and wishes to perform its own actions on wipe, it should register for WIPE_USER_AUXILIARY_DATA notifications. 이 알림은 MAM 기본 선택적 초기화를 수행하기 직전에 SDK에서 즉시 전송합니다.This notification will be sent immediately by the SDK before it performs the MAM default selective wipe. 앱에서 WIPE_USER_DATAWIPE_USER_AUXILIARY_DATA를 둘 다 등록할 수는 없습니다.An app should never register for both WIPE_USER_DATA and WIPE_USER_AUXILIARY_DATA.

기본 선택적 초기화는 앱을 정상적으로 종료하여 작업을 완료하고 앱 프로세스를 종료합니다.The default selective wipe will close the app gracefully, finishing activities and killing the app process. 앱이 기본 선택적 초기화를 재정의하는 경우 초기화 후 사용자가 메모리 내 데이터에 액세스할 수 없도록 앱을 수동으로 종료하는 것이 좋습니다.If your app overrides the default selective wipe, you may want to consider closing your app manually to prevent the user from accessing in-memory data after a wipe occurs.

Android 애플리케이션에 대해 MAM 대상 구성 사용(선택 사항)Enabling MAM targeted configuration for your Android applications (optional)

MAM-WEAndroid Enterprise에 대한 Intune 콘솔에서 애플리케이션별 키-값 쌍을 구성할 수 있습니다.Application-specific key-value pairs may be configured in the Intune console for MAM-WE and Android Enterprise. 이러한 키-값 쌍은 Intune에서 전혀 해석되지 않고 앱에 전달됩니다.These key-value pairs are not interpreted by Intune at all, but are passed on to the app. 해당 구성을 수신하려는 애플리케이션은 MAMAppConfigManagerMAMAppConfig 클래스를 사용하여 구성을 수신할 수 있습니다.Applications that want to receive such configuration can use the MAMAppConfigManager and MAMAppConfig classes to do so. 동일한 앱에서 여러 정책을 대상으로 지정하면 동일한 키에 사용할 수 있는 여러 개의 충돌 값이 발생할 수 있습니다.If multiple policies are targeted at the same app, there may be multiple conflicting values available for the same key.

참고

MAM-WE를 통해 전송하는 구성 설정은 offline으로 전송할 수 없습니다(회사 포털이 설치되지 않은 경우).Configurations setup for delivery via MAM-WE can not be delivered in offline (when the Company Portal is not installed). 오직 Android Enterprise AppRestrictions만이 이 예의 빈 ID에 대한 MAMUserNotification을 통해 전송됩니다.Only Android Enterprise AppRestrictions will be delivered via a MAMUserNotification on an empty identity in this case.

사용자의 앱 구성 가져오기Get the App Config For a User

다음과 같이 앱 구성을 검색할 수 있습니다.App config may be retrieved as follows:

MAMAppConfigManager configManager = MAMComponents.get(MAMAppConfigManager.class);
String identity = "user@contoso.com"
MAMAppConfig appConfig = configManager.getAppConfig(identity);

MAM에 등록된 사용자가 없지만, 앱이 Android 엔터프라이즈 구성(특정 사용자를 대상으로 하지 않음)을 계속 검색하려는 경우에는 null 또는 빈 문자열을 전달하면 됩니다.If there is no MAM-registered user, but your app would still like to retrieve Android Enterprise configuration (which will not be targeted at a specific user), you can pass a null or empty string.

충돌Conflicts

MAM 앱 구성에 설정된 값은 Android 엔터프라이즈 구성에 설정된 동일한 키로 값을 재정의합니다.A value set in MAM app config will override a value with the same key set in Android Enterprise config.

관리자가 동일한 키에 대해 충돌하는 값을 구성하는 경우(예: 동일한 키가 포함된 여러 앱 구성 세트의 대상을 동일한 사용자를 포함하는 여러 그룹으로 설정) Intune은 이 충돌을 자동으로 해결할 수 없으며 모든 값을 앱에 사용 가능하도록 설정합니다.If an admin configures conflicting values for the same key (e.g by targeting different app config sets with the same key to multiple groups containing the same user), Intune does not have any way of resolving this conflict automatically and will make all values available to your app.

앱은 MAMAppConfig 개체에서 지정된 키의 모든 값을 요청할 수 있습니다.Your app can request all values for a given key from a MAMAppConfig object:

List<Boolean> getAllBooleansForKey(String key)
List<Long> getAllIntegersForKey(final String key)
List<Double> getAllDoublesForKey(final String key)
List<String> getAllStringsForKey(final String key)

또는 선택할 값을 요청합니다.or request a value to be chosen:

Boolean getBooleanForKey(String key, BooleanQueryType queryType)
Long getIntegerForKey(String key, NumberQueryType queryType)
Double getDoubleForKey(String key, NumberQueryType queryType)
String getStringForKey(String key, StringQueryType queryType)

앱은 원시 데이터를 키-값 쌍 세트 목록으로 요청할 수도 있습니다.Your app can also request the raw data as a list of sets of key-value pairs.

List<Map<String, String>> getFullData()

전체 예Full Example

MAMAppConfigManager configManager = MAMComponents.get(MAMAppConfigManager.class);
String identity = "user@contoso.com"
MAMAppConfig appConfig = configManager.getAppConfig(identity);
String fooValue = null;
if (appConfig.hasConflict("foo")) {
    List<String> values = appConfig.getAllStringsForKey("foo");
    fooValue = chooseBestValue(values);
} else {
    valueToUse = appConfig.getStringForKey("foo", MAMAppConfig.StringQueryType.Any);
}
Long barValue = appConfig.getIntegerForKey("bar", MAMAppConfig.NumberQueryType.Min);

알림Notification

앱 구성이 다음과 같은 새 알림 형식을 추가합니다.App config adds a new notification type:

  • REFRESH_APP_CONFIG: 이 알림은 MAMUserNotification을 통해 전송되며 새 앱 구성 데이터가 사용 가능함을 앱에 알립니다.REFRESH_APP_CONFIG: This notification is sent in a MAMUserNotification and informs the app that new app config data is available.

추가 참고 자료Further Reading

Android에서 MAM 대상 앱 구성 정책을 만드는 방법에 대한 자세한 내용은 Android for Work용 Microsoft Intune 앱 구성 정책을 사용하는 방법에서 MAM 대상 앱 구성 섹션을 참조하세요.For more information about how to create a MAM targeted app configuration policy in Android, see the section on MAM targeted app config in How to use Microsoft Intune app configuration policies for Android.

Graph API를 사용하여 앱 구성을 구성할 수도 있습니다.App config can also be configured using the Graph API. 자세한 내용은 MAM 대상 구성에 대한 Graph API 문서를 참조하세요.For information, see the Graph API docs for MAM Targeted Config.

사용자 지정 테마(선택 사항)Custom Themes (optional)

모든 MAM 화면 및 대화 상자에 적용될 MAM SDK에 사용자 지정 테마를 제공할 수 있습니다.A custom theme can be provided to the MAM SDK which will be applied to all MAM screens and dialogs. 테마를 제공하지 않으면 기본 MAM 테마가 사용됩니다.If a theme is not provided, a default MAM theme will be used.

테마를 제공하는 방법How to provide a theme

테마를 제공하려면 Application.onCreate 메서드에서 다음 코드 줄을 추가해야 합니다.To provide a theme, you need to add the following line of code in the Application.onCreate method:

MAMThemeManager.setAppTheme(R.style.AppTheme);

위의 예제에서는 R.style.AppTheme을 SDK를 통해 적용할 스타일 테마로 바꿉니다.In the above example, you need to replace R.style.AppTheme with the style theme that you want the SDK to apply.

스타일 사용자 지정(사용되지 않음)Style Customization (deprecated)

이 기능은 이제 사용되지 않으며 위의 사용자 지정 테마가 보기를 사용자 지정하는 기본 방법입니다.This is now deprecated and Custom Themes (above) is the preferred way of customizing views.

통합된 앱과 더 정확하게 일치하도록 MAM SDK에서 생성한 보기를 시각적으로 사용자 지정할 수 있습니다.Views generated by the MAM SDK can be visually customized to more closely match the app in which it is integrated. 앱 로고의 크기 외에도 기본, 보조 및 배경 색상을 사용자 지정할 수 있습니다.You can customize primary, secondary, and background colors, as well as the size of the app logo. 이 스타일 사용자 지정은 선택사항이며 사용자 지정 스타일을 구성하지 않은 경우 기본값을 사용합니다.This style customization is optional and defaults will be used if no custom style is configured.

사용자 지정 방법How to customize

Intune MAM 보기에 스타일 변경을 적용하려면 먼저 스타일 재정의 XML 파일을 만들어야 합니다.In order to have style changes apply to the Intune MAM views, you must first create a style override XML file. 이 파일은 앱의 “/res/xml” 디렉터리에 두어야 하며 원하는 대로 이름을 지정할 수 있습니다.This file should be placed in the “/res/xml” directory of your app and you may name it whatever you like. 다음은 이 파일이 따라야 하는 형식의 예입니다.Below is an example of the format this file needs to follow.

<?xml version="1.0" encoding="utf-8"?>
<styleOverrides>
    <item
        name="foreground_color"
        resource="@color/red"/>
    <item
        name="accent_color"
        resource="@color/blue"/>
    <item
        name="background_color"
        resource="@color/green"/>
    <item
        name="logo_image"
        resource="@drawable/app_logo"/>
</styleOverrides>

앱에 이미 있는 리소스를 다시 사용해야 합니다.You must reuse resources that already exist within your app. 예를 들어, colors.xml 파일에 녹색을 정의한 다음 여기에서 참조해야 합니다.For example, you must define the color green in the colors.xml file and reference it here. 16진 색상 코드인 “#0000ff”를 사용할 수 없습니다.You cannot use the Hex color code “#0000ff." 앱 로고의 최대 크기는 110dip(dp)입니다.The maximum size for the app logo is 110 dip (dp). 작은 로고 이미지를 사용해야 하지만, 이 최대 크기를 사용하면 가장 우수한 결과를 얻을 수 있습니다.You may use a smaller logo image, but adhering to the maximum size will yield the best looking results. 110dip 제한을 초과하면 이미지가 축소되며 흐릿하게 표시될 수 있습니다.If you exceed the 110 dip limit, the image will scale down and possibly cause blurring.

다음은 허용된 스타일 특성, 해당 특성이 제어하는 UI 요소, 해당 XML 특성 항목 이름 및 각각에 필요한 리소스 유형이 나열된 전체 목록입니다.Below is the complete list of allowed style attributes, the UI elements they control, their XML attribute item names, and the type of resource expected for each.

스타일 특성Style attribute 영향을 받는 UI 요소UI elements affected 특성 항목 이름Attribute item name 예상 리소스 유형Expected resource type
배경색Background color PIN 화면 배경색PIN screen background color
PIN 상자 채우기 색PIN box fill color
background_colorbackground_color 색상Color
전경색Foreground color 전경 텍스트 색Foreground text color
기본 상태의 PIN 상자 테두리PIN box border in default state
사용자가 PIN을 입력할 때 PIN 상자의 문자(난독 처리된 문자 포함)Characters (including obfuscated characters) in PIN box when user enters a PIN
foreground_colorforeground_color 색상Color
강조 색Accent color 강조 표시할 때 PIN 상자 테두리PIN box border when highlighted
하이퍼링크Hyperlinks
accent_coloraccent_color 색상Color
앱 로고App logo Intune 앱 PIN 화면에 표시되는 큰 아이콘Large icon that appears in the Intune app PIN screen logo_imagelogo_image 그리기 가능Drawable

기본 등록(선택 사항)Default enrollment (optional)

다음은 자동 APP-WE 서비스 등록(이 섹션에서는 기본값 등록 이라고 함)을 위해 앱 시작 시 사용자 프롬프트를 요구하는 것에 관한 지침으로, Intune 보호 사용자만 SDK 통합 Android LOB 앱을 사용할 수 있도록 허용하는 Intune 앱 보호 정책을 요구합니다.The following is guidance for requiring user prompt on app launch for an automatic APP-WE service enrollment (we call this default enrollment in this section), requiring Intune app protection policies to allow only Intune protected users to use your SDK-integrated Android LOB app. 또한 SDK 통합 Android LOB 앱에 SSO를 사용하는 방법에 관해서도 설명합니다.It also covers how to enable SSO for your SDK-integrated Android LOB app. 이것은 Intune 이외의 사용자가 사용할 수 있는 스토어 앱에서는 지원되지 않습니다.This is not supported for store apps that can be used by non-Intune users.

참고

기본값 등록 의 이점에는 디바이스의 앱에 관한 APP-WE 서비스에서 정책을 얻는 단순화된 방법이 포함됩니다.The benefits of default enrollment include a simplified method of obtaining policy from APP-WE service for an app on the device.

참고

기본 등록 은 소버린 클라우드를 인식합니다.Default enrollment is sovereign cloud aware.

다음 단계에 따라 기본 등록을 사용합니다.Enable default enrollment with the following steps:

  1. 앱이 MSAL을 통합하거나 SSO를 설정해야 하는 경우 일반적인 MSAL 구성 #2에 따라 MSAL을 구성합니다.If your app integrates MSAL or you need to enable SSO, configure MSAL following common MSAL configurations #2. 그렇지 않은 경우 이 단계를 건너뛰어도 됩니다.If not, you may skip this step.

  2. 매니페스트에서 <application> 태그 아래에 다음 값을 추가하여 기본 등록을 사용하도록 설정합니다.Enable default enrollment by adding the following value in the manifest under the <application> tag:

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

    참고

    이것은 앱에서 유일한 MAM-WE 통합이어야 합니다.This must be the only MAM-WE integration in the app. MAMEnrollmentManager API를 호출하려는 다른 시도가 있으면 충돌이 발생합니다.If there are any other attempts to call MAMEnrollmentManager APIs, conflicts will arise.

  3. 매니페스트에서 <application> 태그 아래에 다음 값을 추가하여 필요한 MAM 정책을 사용하도록 설정합니다.Enable MAM policy required by adding the following value in the manifest under the <application> tag:

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

    참고

    이렇게 하면 사용자는 디바이스에 회사 포털을 다운로드하고 사용하기 전에 기본 등록 절차를 완료해야 합니다.This forces the user to download the Company Portal on the device and complete the default enrollment flow before use.

제한 사항Limitations

정책 적용 제한 사항Policy enforcement limitations

  • 콘텐츠 확인자 사용: “전송 또는 수신” Intune 정책이 다른 앱에서 콘텐츠 확인자를 사용하여 콘텐츠 공급자에 액세스하는 것을 차단하거나 부분적으로 차단할 수 있습니다.Using Content Resolvers: The "transfer or receive" Intune policy may block or partially block the use of a content resolver to access the content provider in another app. 이로 인해 ContentResolver 메서드에서 null이 반환되거나 오류 값이 발생합니다(예: 차단된 경우 openOutputStream에서 FileNotFoundException이 throw됨).This will cause ContentResolver methods to return null or throw a failure value (for example, openOutputStream will throw FileNotFoundException if blocked). 앱에서는 콘텐츠 확인자를 통한 데이터 쓰기가 정책으로 인해 실패했거나 정책으로 인해 실패할 것인지 여부를 다음을 호출하여 확인할 수 있습니다.The app can determine whether a failure to write data through a content resolver was caused by policy (or would be caused by policy) by making the call:

    MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(contentURI);
    

    또는 연결된 활동이 없는 경우:or if there is no associated activity:

    MAMPolicyManager.getPolicy().getIsSaveToLocationAllowed(contentURI);
    

    이 두 번째 사례에서 다중 ID 앱은 스레드 ID를 적절하게 설정하도록 주의해야 합니다(또는 getPolicy 호출에 명시적 ID 전달).In this second case, multi-identity apps must take care to set the thread identity appropriately (or pass an explicit identity to the getPolicy call).

내보낸 서비스Exported services

Intune 앱 SDK에 포함된 AndroidManifest.xml 파일에는 MAMNotificationReceiverService 가 포함되어 있으며, 이것은 회사 포털이 관리하는 앱에 알림을 보낼 수 있도록 하는 내보낸 서비스여야 합니다.The AndroidManifest.xml file included in the Intune App SDK contains MAMNotificationReceiverService, which must be an exported service to allow the Company Portal to send notifications to a managed app. 이 서비스는 호출자를 검사하여 회사 포털만 알림을 보낼 수 있는지 확인합니다.The service checks the caller to ensure that only the Company Portal is allowed to send notifications.

리플렉션 제한 사항Reflection limitations

일부 MAM 기본 클래스(예: MAMActivity, MAMDocumentsProvider)는 특정 API 수준 위에만 존재하는 반환 형식 또는 매개 변수를 사용하는 메서드(원래 Android 기본 클래스 기반)를 포함합니다.Some of the MAM base classes (for example, MAMActivity, MAMDocumentsProvider) contain methods (based on the original Android base classes) which use parameter or return types only present above certain API levels. 이런 이유 때문에 리플렉션을 사용하여 앱 구성 요소의 모든 메서드를 열거하는 것이 항상 가능하지는 않습니다.For this reason, it may not always be possible to use reflection to enumerate all methods of app components. 이 제한 사항은 MAM에 국한되지 않으며 앱 자체가 Android 기본 클래스에서 이러한 메서드를 구현하는 경우 적용되는 것과 동일한 제한 사항입니다.This restriction is not limited to MAM, it is the same restriction that would apply if the app itself implemented these methods from the Android base classes.

RobolectricRobolectric

Robolectric에서는 MAM SDK 동작 테스트가 지원되지 않습니다.Testing MAM SDK behavior under Robolectric is not supported. Robolectric에서는 실제 디바이스나 에뮬레이터에서 동작을 정확하게 재현하지는 못하기 때문에 Robolectric에서의 MAM SDK 실행에는 알려진 문제가 있습니다.There are known issues running the MAM SDK under Robolectric due to behaviors present under Robolectric that do not accurately mimic those on real devices or emulators.

Robolectric에서 애플리케이션을 테스트해야 할 경우 권장되는 해결 방법은 애플리케이션 클래스 논리를 도우미로 이동하고 MAMApplication에서 상속하지 않는 애플리케이션 클래스로 단위 테스트 apk를 생성하는 것입니다.If you need to test your application under Robolectric, the recommended workaround is to move your application class logic to a helper and produce your unit-testing apk with an application class that does not inherit from MAMApplication.

SDK 소비자의 기대Expectations of the SDK consumer

Intune SDK는 Android API에서 제공되는 계약을 유지하지만, 정책 적용의 결과로 오류 상태가 더 빈번하게 트리거될 수 있습니다.The Intune SDK maintains the contract provided by the Android API, though failure conditions may be triggered more frequently as a result of policy enforcement. 다음 Android 모범 사례는 오류 가능성을 줄입니다.These Android best practices will reduce the likelihood of failure:

  • null을 반환할 수 있는 Android SDK 함수가 null일 가능성이 높아졌습니다.Android SDK functions that may return null have a higher likelihood of being null now. 문제를 최소화하려면 올바른 위치에서 null 검사가 이루어지도록 합니다.To minimize issues, ensure that null checks are in the right places.

  • 확인할 수 있는 기능은 MAM 대체 API를 통해 확인해야 합니다.Features that can be checked for must be checked for through their MAM replacement APIs.

  • 파생된 함수는 상위 클래스 버전을 통해 호출해야 합니다.Any derived functions must call through to their super class versions.

  • API를 모호한 방식으로 사용해서는 안 됩니다.Avoid use of any API in an ambiguous way. 예를 들어 requestCode 확인 없이 Activity.startActivityForResult를 사용하면 이상한 동작이 발생합니다.For example, using Activity.startActivityForResult without checking the requestCode will cause strange behavior.

서비스Services

정책 적용은 서비스 상호 작용에 영향을 줄 수 있습니다.Policy enforcement may affect service interactions. Context.bindService와 같은 바인딩된 서비스 연결을 설정하는 메서드는 Service.onBind의 기본 정책 적용으로 인해 실패할 수 있으며 ServiceConnection.onNullBinding 또는 ServiceConnection.onServiceDisconnected를 생성할 수 있습니다.Methods that establish a bound service connection such as Context.bindService may fail due to underlying policy enforcement in Service.onBind and may result in ServiceConnection.onNullBinding or ServiceConnection.onServiceDisconnected. 설정된 바인딩된 서비스와 상호 작용하면 Binder.onTransact의 정책 적용으로 인해 SecurityException을 throw할 수 있습니다.Interacting with an established bound service may throw a SecurityException due to policy enforcement in Binder.onTransact.

원격 분석Telemetry

Android 용 Intune 앱 SDK는 앱에서 데이터 수집을 제어하지 않습니다.The Intune App SDK for Android does not control data collection from your app. 기본적으로 회사 포털 애플리케이션은 시스템 생성 데이터를 기록합니다.The Company Portal application logs system-generated data by default. 이 데이터는 Microsoft Intune로 전송됩니다.This data is sent to Microsoft Intune. Microsoft 정책에 따라 Microsoft는 개인 데이터를 수집하지 않습니다.As per Microsoft Policy, we do not collect any personal data.

참고

최종 사용자가 이 데이터를 보내지 않도록 선택하는 경우 회사 포털 앱의 [설정]에서 원격 분석을 해제해야 합니다.If end users choose not to send this data, they must turn off telemetry under Settings on the Company Portal app. 자세한 내용은 Microsoft 사용량 현황 데이터 수집 해제를 참조하세요.To learn more, see Turn off Microsoft usage data collection.

  • 가능한 경우 모든 라이브러리 프로젝트에서 동일한 android:package를 공유해야 합니다.All library projects should share the same android:package where possible. 이 문제는 전적으로 빌드 시에 발생하므로, 런타임 시에는 산발적으로 장애가 발생하지 않습니다.This will not sporadically fail in run-time; this is purely a build-time problem. Intune 앱 SDK의 최신 버전에서는 중복성이 제거됩니다.Newer versions of the Intune App SDK will remove some of the redundancy.

  • 최신 Android SDK 빌드 도구를 사용합니다.Use the newest Android SDK build tools.

  • 불필요한 라이브러리 및 사용하지 않는 라이브러리(예: android.support.v4)를 모두 제거합니다.Remove all unnecessary and unused libraries (for example, android.support.v4)

테스트Testing

테스트 가이드를 참조하세요.See the Testing Guide.