관리 구성 설정

기업용 앱을 개발하는 경우 조직의 정책에 따라 설정된 특정 요구사항을 충족할 수 있습니다. 관리 구성(이전 명칭: 애플리케이션 제한사항)은 조직의 IT 관리자가 원격으로 설정을 지정하도록 허용 있습니다. 이 기능은 조직에서 승인한 서비스, 직장 프로필에 배포된 앱

예를 들어 조직은 승인된 앱이 IT 관리자가 수행할 작업:

  • 웹브라우저의 URL 허용 또는 차단하기
  • 앱이 모바일 데이터를 통해 콘텐츠를 동기화할 수 있는지 구성 Wi-Fi 이용
  • 앱의 이메일 설정 구성

이 가이드에서는 다음에서 관리 구성 설정을 구현하는 방법을 보여줍니다. 있습니다. 관리 구성이 있는 샘플 앱을 보려면 ManagedConfigurations를 참고하세요. 엔터프라이즈 모바일 관리 (EMM) 개발자인 경우 Android Management API 가이드를 참고하세요.

참고: 기록상의 이유로 이러한 구성 설정은 제한하며 이를 사용하는 파일과 클래스로 구현됩니다. 검색어 (예: RestrictionsManager) 그러나 이러한 실제로 다양한 구성 옵션을 구현할 수 있습니다. 제한 사항이 아닙니다.

원격 구성 개요

앱은 원격으로 설정 가능한 관리 구성 옵션을 정의함 IT 관리자가 설정합니다. 이는 2개 이상일 수 있는 임의 설정이며 변경할 수 없습니다. 앱이 직장 프로필에서 실행되는 경우 IT 관리자가 앱의 관리 구성을 변경할 수 있습니다.

관리 구성 제공자는 동일한 기기에서 실행되는 다른 앱입니다. 이 앱은 일반적으로 IT 관리자가 제어합니다. 이 IT 관리자가 구성 변경사항을 구성 제공업체 앱을 선택합니다. 그러면 앱이 앱의 구성을 변경합니다.

외부 관리 구성을 제공하려면 다음 단계를 따르세요.

  • 앱 매니페스트에서 관리 구성을 선언합니다. 행동 IT 관리자가 앱의 Google Play API를 통해 구성을 변경할 수 있습니다.
  • 앱이 다시 시작될 때마다 RestrictionsManager 객체를 사용하여 현재 앱의 UI와 동작을 변경하여 이러한 구성을 준수해야 합니다
  • 듣기: ACTION_APPLICATION_RESTRICTIONS_CHANGED 인텐트를 처리하세요. 이 알림을 받으면 RestrictionsManager를 확인하여 현재 관리 구성을 확인하고 필요한 경우 앱의 동작을 볼 수 있습니다.

관리 구성 정의

앱은 정의하고자 하는 모든 관리 구성을 지원할 수 있습니다. 사용자는 관리 구성 파일에 앱의 관리 구성을 저장하고 매니페스트의 구성 파일에 있습니다. 구성 파일을 만들면 를 사용하여 앱이 제공하는 관리 구성을 검토하세요. EMM 파트너 Google Play API를 사용하여 앱의 구성을 읽을 수 있습니다.

앱의 원격 구성 옵션을 정의하려면 다음 요소를 추가합니다. 매니페스트의 <ph type="x-smartling-placeholder"></ph> <application> 요소:

<meta-data android:name="android.content.APP_RESTRICTIONS"
    android:resource="@xml/app_restrictions" />

앱의 app_restrictions.xml 파일에 res/xml 디렉터리 해당 파일의 구조는 RestrictionsManager의 참조입니다. 파일에는 단일 최상위 <restrictions> 요소. 이 요소는 모든 구성당 하나의 <restriction> 하위 요소 옵션을 선택합니다.

참고: 관리 구성 파일에 액세스할 수 있습니다 이 앱에는 단일 관리 구성 파일이므로, 구성은 모든 언어로 앱에 일관된 환경을 제공합니다.

엔터프라이즈 환경에서 EMM은 일반적으로 관리 IT팀을 위한 원격 콘솔을 생성하는 구성 스키마 액세스할 수 있어야 합니다. 애플리케이션입니다.

관리 구성 공급자가 앱을 쿼리하여 세부정보를 찾을 수 있음 앱의 사용 가능한 구성(설명 포함) 있습니다. 구성 제공업체 및 IT 관리자가 앱의 관리 구성을 언제든지 중지할 수 있습니다.

예를 들어, 앱이 특정 정책에서 사용자를 허용하거나 금지하도록 모바일 데이터 연결을 통해 데이터를 다운로드할 수 있습니다. 여러분의 앱에는 <restriction> 요소가 다음과 같이 표시됩니다.

<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">

  <restriction
    android:key="downloadOnCellular"
    android:title="@string/download_on_cell_title"
    android:restrictionType="bool"
    android:description="@string/download_on_cell_description"
    android:defaultValue="true" />

</restrictions>

각 구성의 android:key 속성을 사용하여 다음을 수행합니다. 해당 값을 읽을 수 있습니다 따라서 각 구성에는 고유한 키 문자열이 있어야 하며 없습니다. 문자열 리터럴로 지정해야 합니다.

참고: 프로덕션 앱에서는 android:titleandroid:description는 현지화된 리소스에서 가져와야 합니다. 를 참조하세요. 리소스를 사용한 현지화.

앱은 bundle_array 내의 번들을 사용하여 제한을 정의합니다. 예를 들어 VPN 연결 옵션이 여러 개인 앱은 각 VPN 서버를 정의할 수 있습니다. 여러 개의 컨테이너가 있는 bundle의 번들 배열로 그룹화된 번들:

<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android" >

  <restriction
    android:key="vpn_configuration_list"
    android:restrictionType="bundle_array">
    <restriction
      android:key="vpn_configuration"
      android:restrictionType="bundle">
      <restriction
        android:key="vpn_server"
        android:restrictionType="string"/>
      <restriction
        android:key="vpn_username"
        android:restrictionType="string"/>
      <restriction
        android:key="vpn_password"
        android:restrictionType="string"/>
    </restriction>
  </restriction>

</restrictions>

android:restrictionType 요소에 지원되는 유형 표 1에 나와 있으며 RestrictionsManager에 대한 참조 및 RestrictionEntry입니다.

표 1. 제한 항목 유형 및 용도

유형 android:restrictionType 일반적인 용도
TYPE_BOOLEAN "bool" 불리언 값(true 또는 false)입니다.
TYPE_STRING "string" 문자열 값(예: 이름)
TYPE_INTEGER "integer" 다음 값 중 하나를 갖는 정수입니다. MIN_VALUE부터 MAX_VALUE입니다.
TYPE_CHOICE "choice" android:entryValues에서 선택된 문자열 값 일반적으로 단일 선택 목록으로 표시됩니다.
TYPE_MULTI_SELECT "multi-select" android:entryValues에서 선택된 값이 있는 문자열 배열. 두 개 이상의 선택 항목이 표시되는 다중 선택 목록을 표시할 때 사용합니다. 항목을 선택할 수 있습니다(예: 허용 목록에 추가할 특정 타이틀을 선택하는 경우).
TYPE_NULL "hidden" 숨겨진 제한 유형입니다. 이 유형을 사용하여 전달되어야 하지만 설정할 수 있습니다. 단일 문자열 값을 저장합니다.
TYPE_BUNDLE_ARRAY "bundle_array" 제한 배열을 저장하는 데 사용 bundles Android 6.0 (API 수준 23)에서 사용할 수 있습니다.

참고: android:entryValues는 컴퓨터에서 읽을 수 있으며 읽을 수 없습니다. 현지화되었습니다. android:entries를 사용하여 현지화할 수 있는 사람이 읽을 수 있는 값을 표시합니다. 각 항목에는 android:entryValues에 상응하는 색인이 있어야 합니다.

관리 구성 확인

다른 앱에서 구성 설정을 구성합니다. 대신 포드의 관리형 서비스가 구성은 앱이 시작되거나 재개될 때이며 시스템 인텐트를 사용하여 애플리케이션이 실행되는 동안 구성이 변경되는지 확인할 수 있습니다

현재 구성 설정을 확인하기 위해 앱에서는 RestrictionsManager 객체. 앱은 다음과 같아야 합니다. 다음과 같은 시점에 현재 관리 구성을 확인합니다.

RestrictionsManager 객체를 가져오려면 현재 getActivity() 활동 후 해당 활동의 Activity.getSystemService() 메서드를 호출합니다.

Kotlin

var myRestrictionsMgr =
        activity?.getSystemService(Context.RESTRICTIONS_SERVICE) as RestrictionsManager

자바

RestrictionsManager myRestrictionsMgr =
    (RestrictionsManager) getActivity()
        .getSystemService(Context.RESTRICTIONS_SERVICE);

RestrictionsManager가 있으면 다음을 얻을 수 있습니다. 현재 구성 설정을 getApplicationRestrictions() 메서드:

Kotlin

var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions

자바

Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

참고: 편의를 위해 현재 클러스터의 상태를 다음을 호출하여 UserManager로 구성을 생성할 수 있습니다. UserManager.getApplicationRestrictions()입니다. 이 메서드는 RestrictionsManager.getApplicationRestrictions()와 동일합니다.

getApplicationRestrictions() 메서드는 데이터 저장소에서 읽기가 필요하므로 가급적 사용하지 마세요. 필요할 때마다 이 메서드를 호출하지 마세요. 현재 구성을 알아야 합니다 대신 앱이 포드를 실행하려고 할 때 시작 또는 재개하고, 가져온 관리 구성 번들을 캐시합니다. 그런 다음 들어요 ACTION_APPLICATION_RESTRICTIONS_CHANGED 인텐트에 따라 앱 상태를 변경할 수 있습니다(자세한 내용은 아래 페이지 참조). 관리 구성 변경사항 수신 대기

관리 구성 읽기 및 적용

getApplicationRestrictions() 메서드는 Bundle를 반환합니다. 키-값 쌍이 포함되어 있습니다. 이 값은 모두 Boolean, int, String, String[] kubectl 명령어를 관리 구성 Bundle을(를) 보려면 현재 표준 Bundle 메서드로 구성 설정 해당 데이터 유형(예: getBoolean()) 또는 getString()입니다.

참고: 관리 구성 Bundle는 에는 게시자가 명시적으로 설정한 모든 구성에 관리 구성 제공업체를 선택할 수 있습니다 그러나 단일 VM이 운영되고 있다고 가정할 수는 없습니다. 기본 포드를 정의했기 때문에 구성이 번들에 표시됩니다 값을 찾을 수 있습니다.

현재 상황에 따라 적절한 조치를 취하는 것은 개발자의 몫입니다. 관리 구성 설정에 액세스할 수 있습니다 예를 들어 앱에 특정 서버를 통해 데이터를 다운로드할 수 있는지 여부를 셀룰러 연결이 있고 구성이 다음으로 설정되어 있음을 false, 다음과 같은 경우 이외의 경우에는 데이터 다운로드를 중지해야 합니다. 다음 코드 예와 같이 기기가 Wi-Fi에 연결되어 있어야 합니다.

Kotlin

val appCanUseCellular: Boolean =
        if (appRestrictions.containsKey("downloadOnCellular")) {
            appRestrictions.getBoolean("downloadOnCellular")
        } else {
            // cellularDefault is a boolean using the restriction's default value
            cellularDefault
        }

if (!appCanUseCellular) {
    // ...turn off app's cellular-download functionality
    // ...show appropriate notices to user
}

자바

boolean appCanUseCellular;

if (appRestrictions.containsKey("downloadOnCellular")) {
    appCanUseCellular = appRestrictions.getBoolean("downloadOnCellular");
} else {
    // cellularDefault is a boolean using the restriction's default value
    appCanUseCellular = cellularDefault;
}

if (!appCanUseCellular) {
    // ...turn off app's cellular-download functionality
    // ...show appropriate notices to user
}

중첩된 제한사항을 여러 개 적용하려면 다음을 참고하세요. bundle_array Parcelable 객체의 컬렉션으로서의 제한 항목 Bundle로 전송합니다. 이 예에서 각 VPN의 구성은 데이터가 파싱되어 서버 연결 선택의 목록을 작성하는 데 사용됩니다.

Kotlin

// VpnConfig is a sample class used store config data, not defined
val vpnConfigs = mutableListOf<VpnConfig>()

val parcelables: Array<out Parcelable>? =
        appRestrictions.getParcelableArray("vpn_configuration_list")

if (parcelables?.isNotEmpty() == true) {
    // iterate parcelables and cast as bundle
    parcelables.map { it as Bundle }.forEach { vpnConfigBundle ->
        // parse bundle data and store in VpnConfig array
        vpnConfigs.add(VpnConfig()
                .setServer(vpnConfigBundle.getString("vpn_server"))
                .setUsername(vpnConfigBundle.getString("vpn_username"))
                .setPassword(vpnConfigBundle.getString("vpn_password")))
    }
}

if (vpnConfigs.isNotEmpty()) {
    // ...choose a VPN configuration or prompt user to select from list
}

자바

// VpnConfig is a sample class used store config data, not defined
List<VpnConfig> vpnConfigs = new ArrayList<>();

Parcelable[] parcelables =
    appRestrictions.getParcelableArray("vpn_configuration_list");

if (parcelables != null && parcelables.length > 0) {
    // iterate parcelables and cast as bundle
    for (int i = 0; i < parcelables.length; i++) {
        Bundle vpnConfigBundle = (Bundle) parcelables[i];
        // parse bundle data and store in VpnConfig array
        vpnConfigs.add(new VpnConfig()
            .setServer(vpnConfigBundle.getString("vpn_server"))
            .setUsername(vpnConfigBundle.getString("vpn_username"))
            .setPassword(vpnConfigBundle.getString("vpn_password")));
    }
}

if (!vpnConfigs.isEmpty()) {
    // ...choose a VPN configuration or prompt user to select from list
}

관리형 구성 변경사항 수신 대기

앱의 관리 구성이 변경될 때마다 시스템은 ACTION_APPLICATION_RESTRICTIONS_CHANGED 인텐트를 처리하세요. 여러분의 앱은 이 인텐트를 사용하여 구성 설정이 변경될 때 앱의 동작을 변경할 수 있습니다. 있습니다.

참고: ACTION_APPLICATION_RESTRICTIONS_CHANGED 인텐트는 리스너로만 전송됩니다. (선언된 리스너에는 대지 않고 동적으로 등록됨) 선언됩니다.

다음 코드는 broadcast receiver를 동적으로 등록하는 방법을 보여줍니다. 이 인텐트의 예입니다.

Kotlin

val restrictionsFilter = IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED)

val restrictionsReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {

        // Get the current configuration bundle
        val appRestrictions = myRestrictionsMgr.applicationRestrictions

        // Check current configuration settings, change your app's UI and
        // functionality as necessary.
    }
}

registerReceiver(restrictionsReceiver, restrictionsFilter)

자바

IntentFilter restrictionsFilter =
    new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);

BroadcastReceiver restrictionsReceiver = new BroadcastReceiver() {
  @Override public void onReceive(Context context, Intent intent) {

    // Get the current configuration bundle
    Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

    // Check current configuration settings, change your app's UI and
    // functionality as necessary.
  }
};

registerReceiver(restrictionsReceiver, restrictionsFilter);

참고: 일반적으로 앱에 알림을 보내지 않아도 됩니다. 구성 변경에 대한 정보를 알려줍니다 대신 broadcast receiver를 호출할 수 있습니다. 앱이 다시 시작되면 먼저 현재 관리 구성을 확인합니다 (자세한 내용은 관리 구성을 확인한 후 등록합니다. broadcast receiver를 변경하여 구성 변경에 대한 알림을 받도록 합니다. 발생하는 상황입니다.

EMM에 관리 구성 의견 보내기

앱에 관리 구성 변경사항을 적용한 후에는 EMM에 변경할 수 있습니다 Android는 키로 연결된 앱 상태라는 기능을 지원합니다. 이 기능은 앱이 관리 구성 변경사항을 적용하려고 할 때마다 의견을 보내는 데 사용합니다. 이 피드백이 앱이 관리 구성을 성공적으로 설정했는지 확인하는 역할을 하거나 앱이 지정된 변경사항을 적용하지 못하면 오류 메시지가 포함됩니다.

EMM 제공업체는 이 의견을 검색하여 IT 부서의 콘솔에 표시할 수 있습니다. 관리자에게 표시됩니다. 자세한 내용은 EMM에 앱에 관한 의견 보내기를 참고하세요. 이 주제에 관한 정보(앱에 의견 지원을 추가하는 방법에 관한 자세한 가이드 포함)

추가 코드 샘플

ManagedConfigurations 샘플은 이 페이지에 설명된 API를 사용하는 방법을 자세히 보여줍니다.