사용자에게 네트워크 슬라이싱 업셀링 제안

이동통신사는 5G 네트워크 슬라이싱을 통해 특정 사용 사례의 네트워크 성능을 개선할 수 있습니다. 이 가이드에서는 사용자가 구매를 결정한 경우 앱이 네트워크 슬라이싱 업셀링 UX 흐름을 트리거하고 프리미엄 연결을 요청하는 방법을 설명합니다.

UX 흐름에서 사용자에게 구매를 완료할 수 있는 이동통신사 웹시트가 열리는 알림을 표시합니다.
그림 1. 업셀링 UX 흐름의 예

프리미엄 기능 인텐트 선언

앱의 네트워크 기능 요청이 준수되려면 앱이 앱 매니페스트에서 이 기능을 요청하는 인텐트를 선언해야 합니다. 그러지 않으면 네트워크 요청이 SecurityException을 발생시키는 데 실패합니다.

이렇게 하려면 앱은 AndroidManifest.xml 파일에서 PackageManager.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES 속성을 선언하고 상응하는 XML 리소스 파일을 포함해야 합니다.

매니페스트 파일의 기능 선언은 다음과 같습니다.

<property android:name="android.net.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES"
          android:resource="@xml/network_capabilities" />

상응하는 network_capabilities.xml 리소스 파일은 다음과 같습니다.

<network-capabilities-declaration> xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-network-capability android:name="NET_CAPABILITY_PRIORITIZE_LATENCY"/>
</network-capabilities-declaration>

네트워크 슬라이싱 업셀링 흐름 트리거

이 코드 예는 업셀링 흐름을 트리거하고 구매한 프리미엄 기능을 요청하는 방법을 보여줍니다.

Context mContext;
Network mNetwork;

public void purchasePremiumCapability() {
    TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
    int capability = TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY;
    if (tm.isPremiumCapabilityAvailableForPurchase(capability)) {
        tm.purchasePremiumCapability(capability, Runnable::run, new Consumer<Integer>() {
            @Override
            public void accept(Integer result) {
                Log.d("Purchase premium capability result: "
                        + TelephonyManager.convertPurchaseResultToString(result));
                switch (result) {
                    case /* success or already purchased */:
                        requestPremiumCapabilityNetwork();
                        break;
                    case /* temporary failure */:
                        // TODO: wait and retry
                        break;
                    case /* hard failure */:
                        // TODO: handle failure
                        break;
                    default:
                        Log.e("Unknown purchase result: " + result);
                }
            }
        });
    } else {
        Log.e("Premium capability is not available for purchase.");
    }
}

public void requestPremiumCapabilityNetwork() {
    ConnectvityManager cm = mContext.getSystemService(ConnectivityManager.class);
    NetworkRequest request = NetworkRequest.Builder()
            .addCapability(NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY)
            .build();
    cm.requestNetwork(request, new NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            Log.d("Application can now use the network with the premium capability.");
            mNetwork = network;
        }

        @Override
        public void onLost(Network network) {
            Log.d("Premium capability network is no longer available.");
            mNetwork = null;
            // TODO: clean up anything relying on the premium capability network
        }
    });
}

다음 섹션에서는 이 프로세스와 관련된 단계를 자세히 설명합니다.

1단계: 프리미엄 기능을 사용할 수 있는지 확인하기

isPremiumCapabilityAvailableForPurchase() API 메서드를 호출하여 선택한 프리미엄 기능을 사용할 수 있는지 확인합니다. 이 메서드는 업셀링 알림 워크플로를 사용하여 이동통신사에서 기능을 구매할 수 있는 경우 true를 반환합니다.

2단계: 업셀링 알림 흐름 시작

프리미엄 기능을 사용할 수 있는지 확인한 후에는 앱에서 purchasePremiumCapability()를 호출하여 업셀링 알림 흐름을 시작해야 합니다. 사용자가 아직 지정된 기능을 구매하지 않았고 모든 전제 조건이 충족되면 플랫폼은 사용자에게 이동통신사에서 성능 향상 옵션을 제공할 수도 있음을 알리는 알림을 표시합니다. 사용자가 알림을 탭하면 구매 프로세스를 계속할 수 있도록 플랫폼에서 이동통신사의 WebView를 엽니다.

purchasePremiumCapability()에 전달된 parameter 콜백은 구매 요청의 결과 코드를 반환합니다.

결과 코드 PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESSPURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED는 앱이 선택된 프리미엄 기능 요청을 진행할 수 있는 성공적인 결과를 나타냅니다.

다음 목록의 결과 코드는 실패한 구매 요청을 나타냅니다. 자세한 내용은 API 참조를 확인하세요.

3단계: 구매한 Premium 연결 요청하기

업셀링 알림 흐름에서 성공적인 코드(PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS 또는 PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED)를 반환하면 앱은 requestNetwork()를 사용하여 요청된 기능을 충족하는 네트워크를 요청해야 합니다. NetworkRequest 객체를 빌드할 때 추가하는 기능은 이전 단계에서 TelephonyManager API에 전달하는 기능과 동일한 기능이 아닙니다. 다음 표는 TelephonyManager 클래스의 상수를 NetworkCapabilities의 상응하는 상수에 매핑합니다.

TelephonyManager 상수 NetworkCapabilities 상수
PREMIUM_CAPABILITY_PRIORITIZE_LATENCY NET_CAPABILITY_PRIORITIZE_LATENCY

구매 요청이 실패하면 앱에서 기본 네트워크를 대신 요청하고 사용해야 합니다. 프리미엄 슬라이스 요청을 처리할 수 없는 경우 자동 대체 동작이 없습니다.