ユーザーにネットワーク スライスのアップセルを提案

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: 購入したプレミアム接続をリクエストする

アップセル通知フローから成功コード(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

購入リクエストが失敗した場合、アプリはデフォルトのネットワークをリクエストして使用する必要があります。プレミアム スライスのリクエストを実行できない場合、自動フォールバック動作はありません。