Von Bedeutung
このトピックは、Windows 10 Mobile にのみ適用されます。
このトピックでは、ホスト カード エミュレーション (HCE) を使用して近距離通信 (NFC) カード リーダーと直接通信し、モバイル ネットワーク オペレーター (MNO) なしで (物理カードではなく) 電話でサービスにアクセスできるようにする方法について説明します。
HCE アプリを開発するために必要なもの
HCE ベースのカードエミュレーションアプリを開発するには、Microsoft Visual Studio 2015 (Windows 開発者ツールを含む) をインストールする必要があります (Visual Studio のダウンロードページを参照)、および Windows 10 Mobile エミュレーター。
セットアップの詳細については、「Test with the Microsoft Emulator for Windows 10 Mobile」を参照してください。
必要に応じて、付属の Windows 10 Mobile エミュレーターではなく、実際の Windows 10 Mobile デバイスでテストする場合は、次のものが必要になります。
- NFC HCE がサポートされている Windows 10 Mobile デバイス。
- ISO/IEC 14443-4 および ISO/IEC 7816-4 のプロトコルをサポートするリーダー ターミナル
Windows 10 Mobile は、次の機能を提供する HCE サービスを実装します。
- アプリは、エミュレートするカードのアプレット識別子 (AID) を登録できます。
- 外部リーダー カードの選択とユーザー設定に基づいて、登録されているアプリのいずれかに対するアプリケーション プロトコル データ ユニット (APDU) コマンドと応答ペアの競合解決とルーティング。
- ユーザー アクションの結果としてのアプリへのイベントと通知の処理。
Windows 10 では、ISO-DEP (ISO-IEC 14443-4) に基づくスマート カードのエミュレーションがサポートされ、ISO-IEC 7816-4 仕様で定義されている APDU を使用して通信します。 Windows 10 では、HCE アプリの ISO/IEC 14443-4 Type A テクノロジがサポートされています。 タイプ B、タイプ F、および非ISO-DEP (MIFARE など) テクノロジは、既定で SIM にルーティングされます。
カード エミュレーション機能では、Windows 10 Mobile デバイスのみが有効になります。 SIM ベースおよび HCE ベースのカード エミュレーションは、他のバージョンの Windows 10 では使用できません。
HCE および SIM ベースのカード エミュレーションサポートのアーキテクチャを次の図に示します。
HCE および SIM カード エミュレーション の
アプリの選択と AID ルーティング
HCE アプリを開発するには、ユーザーが複数の異なる HCE アプリをインストールできるため、Windows 10 Mobile デバイスが特定のアプリに AID をルーティングする方法を理解する必要があります。 各アプリでは、複数の HCE および SIM ベースのカードを登録できます。
ユーザーが Windows 10 Mobile デバイスを端末にタップすると、デバイスにインストールされている適切なアプリにデータが自動的にルーティングされます。 このルーティングは、5 から 16 バイトの識別子であるアプレット ID (AID) に基づいています。 タップ中、外部端末は SELECT コマンド APDU を送信して、後続のすべての APDU コマンドをルーティングする AID を指定します。 その後の SELECT コマンドでは、ルーティングが再び変更されます。 アプリとユーザー設定によって登録された AID に基づいて、APDU トラフィックは特定のアプリにルーティングされ、応答 APDU が送信されます。 端末は、同じタップ中に複数の異なるアプリと通信する必要がある場合があることに注意してください。 そのため、別のアプリのバックグラウンド タスクが APDU に応答できるように、非アクティブ化時にアプリのバックグラウンド タスクができるだけ早く終了するようにする必要があります。 バックグラウンド タスクについては、このトピックの後半で説明します。
HCE アプリは、処理可能な特定の AID に自分自身を登録する必要があります。そうすることで、その AID の APDU を受け取ることができます。 アプリでは、AID グループを使用して AID を宣言します。 AID グループは、概念的には個々の物理カードと同等です。 たとえば、1 つのクレジット カードが AID グループで宣言され、別の銀行の 2 つ目のクレジット カードが別の 2 つ目の AID グループで宣言されます。ただし、両方が同じ AID を持っている場合でも同様です。
支払いAIDグループの紛争解決
アプリは、物理カード (AID グループ) を登録するときに、AID グループ カテゴリを "支払い" または "その他" として宣言できます。一度に複数の支払い AID グループを登録できますが、タップと支払いを一度に有効にできるのは、これらの支払い AID グループのうち 1 つだけで、ユーザーが選択します。 この動作は、ユーザーがデバイスを端末にタップするときに別の意図しないカードで支払わないように、使用する 1 つの支払い、クレジット、またはデビット カードを意識的に選択することが想定されるためです。
ただし、"Other" として登録されている複数の AID グループを、ユーザーの操作なしで同時に有効にできます。 この動作は、ロイヤルティ、クーポン、乗り継ぎなどの他の種類のカードは、電話をタップするたびに何の努力もプロンプトも表示されずに機能することが期待されるためです。
"支払い" として登録されているすべての AID グループは、[NFC 設定] ページのカードの一覧に表示され、ユーザーは既定の支払いカードを選択できます。 既定の支払いカードを選択すると、この支払い AID グループを登録したアプリが既定の支払いアプリになります。 既定の支払いアプリでは、ユーザーの操作なしで、いずれかの AID グループを有効または無効にすることができます。 ユーザーが既定の支払いアプリプロンプトを拒否した場合、現在の既定の支払いアプリ (存在する場合) は引き続き既定のままです。 次のスクリーンショットは、[NFC 設定] ページを示しています。
[NFC 設定] ページの の
上のスクリーンショットの例を使用して、ユーザーが既定の支払いカードを "HCE Application 1" で登録されていない別のカードに変更した場合、システムはユーザーの同意の確認プロンプトを作成します。 ただし、ユーザーが既定の支払いカードを "HCE Application 1" によって登録されている別のカードに変更した場合、システムはユーザーに対して確認プロンプトを作成しません。"HCE Application1" は既に既定の支払いアプリです。
支払い以外の AID グループの競合解決
[その他] に分類された未払いカードは、NFC 設定ページには表示されません。
アプリでは、支払い AID グループと同じ方法で、支払い以外の AID グループを作成、登録、および有効にすることができます。 主な違いは、支払い以外の AID グループでは、エミュレーション カテゴリが "支払い" ではなく "その他" に設定されていることです。 AID グループをシステムに登録したら、AID グループが NFC トラフィックを受信できるようにする必要があります。 支払い以外の AID グループがトラフィックを受信できるようにしようとすると、別のアプリによってシステムに既に登録されているいずれかの AID との競合がない限り、ユーザーは確認を求めません。 競合が発生した場合、ユーザーはどのカードに関する情報を求められます。ユーザーが新しく登録された AID グループを有効にすることを選択した場合、そのカードに関連付けられているアプリは無効になります。
SIM ベースの NFC アプリケーションとの共存
Windows 10 Mobile では、システムは、コントローラー レイヤーでルーティングの決定を行うために使用される NFC コントローラー ルーティング テーブルを設定します。 テーブルには、次の項目のルーティング情報が含まれています。
- 個々の AID ルート。
- プロトコル ベースのルート (ISO-DEP)。
- テクノロジ ベースのルーティング (NFC-A/B/F)。
外部リーダーが "SELECT AID" コマンドを送信すると、NFC コントローラーは最初にルーティング テーブル内の AID ルートの一致をチェックします。 一致するものがない場合は、ISO-DEP (14443-4-A) トラフィックの既定のルートとしてプロトコルベースのルートが使用されます。 その他のISO-DEP 以外のトラフィックでは、テクノロジ ベースのルーティングが使用されます。
Windows 10 Mobile では、NFC 設定ページにメニュー オプション "SIM カード" が用意されており、システムに AID を登録しない従来の Windows Phone 8.1 SIM ベースのアプリを引き続き使用できます。 ユーザーが既定の支払いカードとして "SIM カード" を選択した場合、ISO-DEP ルートは UICC に設定され、ドロップダウン メニューの他のすべての選択では、ISO-DEP ルートがホストに設定されます。
ISO-DEP ルートは、デバイスが Windows 10 Mobile で初めて起動されたときに SE 対応 SIM カードを持つデバイスの場合、"SIM カード" に設定されます。 ユーザーが HCE 対応アプリをインストールし、そのアプリが HCE AID グループの登録を有効にすると、ISO-DEP ルートがホストにポイントされます。 新しい SIM ベースのアプリケーションでは、コントローラー ルーティング テーブルに特定の AID ルートを設定するために、SIM に AID を登録する必要があります。
HCE ベースのアプリの作成
HCE アプリには 2 つの部分があります。
- ユーザー操作用のメイン フォアグラウンド アプリ。
- 特定の AID の APDU を処理するためにシステムによってトリガーされるバックグラウンド タスク。
NFC タップに応じてバックグラウンド タスクを読み込む場合のパフォーマンス要件が非常に厳しいため、バックグラウンド タスク全体を C# やマネージド コードではなく C++/CX ネイティブ コード (依存している依存関係、参照、ライブラリを含む) で実装することをお勧めします。 通常、C# とマネージド コードは正常に動作しますが、.NET CLR の読み込みなどのオーバーヘッドが発生します。これは、C++/CX で記述することで回避できます。
バックグラウンド タスクを作成して登録する
システムによってルーティングされた APDU を処理して応答するために、HCE アプリでバックグラウンド タスクを作成する必要があります。 アプリが初めて起動されるときに、フォアグラウンドは、次のコードに示すように、IBackgroundTaskRegistration インターフェイスを実装する HCE バックグラウンド タスクを登録します。
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorHostApplicationActivated));
bgTask = taskBuilder.Register();
タスク トリガーが SmartCardTriggerType
APDU の受信と応答
アプリを対象とする APDU がある場合、システムによってバックグラウンド タスクが起動されます。 バックグラウンド タスクは、SmartCardEmulatorApduReceivedEventArgs オブジェクトの CommandApdu プロパティを介して渡された APDU を受け取り、同じオブジェクトの TryRespondAsync メソッドを使用して APDU に応答します。 パフォーマンス上の理由から、軽い操作のためにバックグラウンド タスクを保持することを検討してください。 たとえば、APDU にすぐに応答し、すべての処理が完了したらバックグラウンド タスクを終了します。 NFC トランザクションの性質上、ユーザーは非常に短い時間だけデバイスをリーダーに対して保持する傾向があります。 バックグラウンド タスクは、接続が非アクティブ化されるまでリーダーからトラフィックを受信し続けます。その場合は、SmartCardEmulatorConnectionDeactivatedEventArgs オブジェクトを受け取ります。 SmartCardEmulatorConnectionDeactivatedEventArgs.Reason プロパティに示されている次の理由により、接続を非アクティブ化できます。
- 接続が ConnectionLost 値で非アクティブ化されている場合は、ユーザーがデバイスをリーダーから引き離したことを意味します。 アプリでユーザーがターミナルを長くタップする必要がある場合は、フィードバックを求めるメッセージを表示することを検討してください。 バックグラウンド タスクを迅速に終了(延期処理を完了)し、再度タップされた際に前のバックグラウンド タスクの終了待ちによる遅延を避ける必要があります。
- 接続が ConnectionRedirectedで非アクティブ化されている場合は、ターミナルが別の AID に向けられた新しい SELECT AID コマンド APDU を送信したことを意味します。 この場合、アプリはバックグラウンド タスクをすぐに終了して (遅延を完了することで)、別のバックグラウンド タスクを実行できるようにする必要があります。
また、バックグラウンド タスクは、IBackgroundTaskInstance インターフェイスの Canceled イベント に登録する必要があります。システムがバックグラウンド タスクを終了すると、このイベントが起動されるため、(遅延を完了して) すばやくバックグラウンド タスクを終了する必要があります。 HCE アプリのバックグラウンド タスクを示すコードを次に示します。
void BgTask::Run(
IBackgroundTaskInstance^ taskInstance)
{
m_triggerDetails = static_cast<SmartCardTriggerDetails^>(taskInstance->TriggerDetails);
if (m_triggerDetails == nullptr)
{
// May be not a smart card event that triggered us
return;
}
m_emulator = m_triggerDetails->Emulator;
m_taskInstance = taskInstance;
switch (m_triggerDetails->TriggerType)
{
case SmartCardTriggerType::EmulatorHostApplicationActivated:
HandleHceActivation();
break;
case SmartCardTriggerType::EmulatorAppletIdGroupRegistrationChanged:
HandleRegistrationChange();
break;
default:
break;
}
}
void BgTask::HandleHceActivation()
{
try
{
auto lock = m_srwLock.LockShared();
// Take a deferral to keep this background task alive even after this "Run" method returns
// You must complete this deferral immediately after you have done processing the current transaction
m_deferral = m_taskInstance->GetDeferral();
DebugLog(L"*** HCE Activation Background Task Started ***");
// Set up a handler for if the background task is cancelled, we must immediately complete our deferral
m_taskInstance->Canceled += ref new Windows::ApplicationModel::Background::BackgroundTaskCanceledEventHandler(
[this](
IBackgroundTaskInstance^ sender,
BackgroundTaskCancellationReason reason)
{
DebugLog(L"Cancelled");
DebugLog(reason.ToString()->Data());
EndTask();
});
if (Windows::Phone::System::SystemProtection::ScreenLocked)
{
auto denyIfLocked = Windows::Storage::ApplicationData::Current->RoamingSettings->Values->Lookup("DenyIfPhoneLocked");
if (denyIfLocked != nullptr && (bool)denyIfLocked == true)
{
// The phone is locked, and our current user setting is to deny transactions while locked so let the user know
// Denied
DoLaunch(Denied, L"Phone was locked at the time of tap");
// We still need to respond to APDUs in a timely manner, even though we will just return failure
m_fDenyTransactions = true;
}
}
else
{
m_fDenyTransactions = false;
}
m_emulator->ApduReceived += ref new TypedEventHandler<SmartCardEmulator^, SmartCardEmulatorApduReceivedEventArgs^>(
this, &BgTask::ApduReceived);
m_emulator->ConnectionDeactivated += ref new TypedEventHandler<SmartCardEmulator^, SmartCardEmulatorConnectionDeactivatedEventArgs^>(
[this](
SmartCardEmulator^ emulator,
SmartCardEmulatorConnectionDeactivatedEventArgs^ eventArgs)
{
DebugLog(L"Connection deactivated");
EndTask();
});
m_emulator->Start();
DebugLog(L"Emulator started");
}
catch (Exception^ e)
{
DebugLog(("Exception in Run: " + e->ToString())->Data());
EndTask();
}
}
AID グループの作成と登録
カードのプロビジョニング時にアプリケーションを初めて起動するときに、AID グループを作成してシステムに登録します。 システムは、登録されている AID とユーザー設定に基づいて、外部リーダーが APDU と通信してルーティングするアプリを決定します。
ほとんどの支払いカードは、同じ AID、近接通信支払システム環境 (PPSE) と、追加の支払いネットワーク カード固有の AID に登録されます。 各 AID グループはカードを表し、ユーザーがカードを有効にすると、グループ内のすべての AID が有効になります。 同様に、ユーザーがカードを非アクティブ化すると、グループ内のすべての AID が無効になります。
AID グループを登録するには、SmartCardAppletIdGroup オブジェクトを作成し、これが HCE ベースの支払いカードであることを反映するようにプロパティを設定する必要があります。 表示名は、NFC 設定メニューとユーザー プロンプトに表示されるため、ユーザーにわかりやすいものにする必要があります。 HCE 支払いカードの場合、SmartCardEmulationCategory プロパティを Payment に設定し、SmartCardEmulationType プロパティを Hostに設定する必要があります。
public static byte[] AID_PPSE =
{
// File name "2PAY.SYS.DDF01" (14 bytes)
(byte)'2', (byte)'P', (byte)'A', (byte)'Y',
(byte)'.', (byte)'S', (byte)'Y', (byte)'S',
(byte)'.', (byte)'D', (byte)'D', (byte)'F', (byte)'0', (byte)'1'
};
var appletIdGroup = new SmartCardAppletIdGroup(
"Example DisplayName",
new List<IBuffer> {AID_PPSE.AsBuffer()},
SmartCardEmulationCategory.Payment,
SmartCardEmulationType.Host);
非支払い HCE カードの場合、SmartCardEmulationCategory プロパティは Other に設定し、SmartCardEmulationType プロパティを Hostに設定する必要があります。
public static byte[] AID_OTHER =
{
(byte)'1', (byte)'2', (byte)'3', (byte)'4',
(byte)'5', (byte)'6', (byte)'7', (byte)'8',
(byte)'O', (byte)'T', (byte)'H', (byte)'E', (byte)'R'
};
var appletIdGroup = new SmartCardAppletIdGroup(
"Example DisplayName",
new List<IBuffer> {AID_OTHER.AsBuffer()},
SmartCardEmulationCategory.Other,
SmartCardEmulationType.Host);
AID グループごとに最大 9 個の AID (長さ 5 ~ 16 バイト) を含めることができます。
RegisterAppletIdGroupAsync メソッドを使用して AID グループをシステムに登録すると、SmartCardAppletIdGroupRegistration オブジェクトが返されます。 既定では、登録オブジェクトの ActivationPolicy プロパティは Disabledに設定されます。 つまり、システムに登録されている AID は、まだ有効になっていないため、トラフィックを受信しません。
reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);
次に示すように、SmartCardAppletIdGroupRegistration クラスの RequestActivationPolicyChangeAsync メソッドを使用して、登録済みカード (AID グループ) を有効にすることができます。 システムでは一度に 1 つの支払いカードしか有効にできないため、支払い AID グループの ActivationPolicy を Enabled に設定することは、既定の支払いカードの設定と同じです。 ユーザーは、既定の支払いカードが既に選択されているかどうかに関係なく、このカードを既定の支払いカードとして許可するように求められます。 このステートメントは、アプリが既に既定の支払いアプリケーションであり、単に独自の AID グループ間で変更されている場合には当てはまりません。 アプリごとに最大 10 個の AID グループを登録できます。
reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);
アプリの登録済み AID グループを OS で照会し、GetAppletIdGroupRegistrationsAsync メソッドを使用してアクティブ化ポリシーを確認できます。
アプリがまだ既定の支払いアプリでない場合にのみ、支払いカードのアクティブ化ポリシーを Disabled から Enabledに変更すると、ユーザーにメッセージが表示されます。 AID の競合が発生した場合に、支払い以外のカードのアクティブ化ポリシーを Disabled から Enabled に変更した場合にのみ、ユーザーにメッセージが表示されます。
var registrations = await SmartCardEmulator.GetAppletIdGroupRegistrationsAsync();
foreach (var registration in registrations)
{
registration.RequestActivationPolicyChangeAsync (AppletIdGroupActivationPolicy.Enabled);
}
アクティブ化ポリシーの変更時のイベント通知
バックグラウンド タスクでは、いずれかの AID グループ登録のアクティブ化ポリシーがアプリの外部で変更されたときのイベントを受信するように登録できます。 たとえば、ユーザーは、NFC 設定メニューを使用して、カードの 1 つから別のアプリでホストされている別のカードに既定の支払いアプリを変更できます。 ライブ タイルの更新など、内部セットアップでこの変更をアプリで把握する必要がある場合は、この変更に関するイベント通知を受け取り、それに応じてアプリでアクションを実行できます。
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorAppletIdGroupRegistrationChanged));
bgTask = taskBuilder.Register();
フォアグラウンド オーバーライドの挙動
アプリがフォアグラウンドにある間、ユーザーにメッセージを表示せずに、AID グループ登録の ActivationPolicy を ForegroundOverride に変更できます。 アプリがフォアグラウンドの間にユーザーが端末にデバイスをタップすると、既定の支払いカードとしてユーザーによってどの支払いカードも選択されなかった場合でも、トラフィックはアプリにルーティングされます。 カードのアクティブ化ポリシーを ForegroundOverride
reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);
また、単一の 0 長 AID で構成される AID グループを登録できます。これにより、システムは、AID に関係なくすべての APDU をルーティングし、SELECT AID コマンドを受信する前に送信されたコマンド APDU を含めることができます。 ただし、このような AID グループは、アプリがフォアグラウンドにある間にのみ機能します。これは、ForegroundOverride
public static byte[] AID_Foreground =
{};
var appletIdGroup = new SmartCardAppletIdGroup(
"Example DisplayName",
new List<IBuffer> {AID_Foreground.AsBuffer()},
SmartCardEmulationCategory.Other,
SmartCardEmulationType.Host);
reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);
reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);
NFC と HCE のサポートを確認する
アプリでは、デバイスに NFC ハードウェアがあるかどうかを確認し、カード エミュレーション機能をサポートし、ユーザーにこのような機能を提供する前にホスト カード エミュレーションをサポートする必要があります。
NFC スマート カード エミュレーション機能は Windows 10 Mobile でのみ有効になっているため、他のバージョンの Windows 10 でスマート カード エミュレーター API を使用しようとすると、エラーが発生します。 スマート カード API のサポートについては、次のコード スニペットで確認できます。
Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Devices.SmartCards.SmartCardEmulator");
さらに、SmartCardEmulator.GetDefaultAsync メソッドが null を返すかどうかを確認することで、デバイスに何らかの形式のカード エミュレーションが可能な NFC ハードウェアがあるかどうかを確認することもできます。 その場合、デバイスでは NFC カード エミュレーションはサポートされません。
var smartcardemulator = await SmartCardEmulator.GetDefaultAsync();<
HCE および AID ベースの UICC ルーティングのサポートは、Lumia 730、830、640、640 XL などの最近起動されたデバイスでのみ使用できます。 Windows 10 Mobile 以降を実行する新しい NFC 対応デバイスでは、HCE がサポートされている必要があります。 アプリでは、次のように HCE のサポートを確認できます。
Smartcardemulator.IsHostCardEmulationSupported();
画面のロックと画面のオフ動作
Windows 10 Mobile にはデバイス レベルのカード エミュレーション設定があり、携帯電話会社またはデバイスの製造元によって設定できます。 既定では、MO または OEM がこれらの値を上書きしない限り、"tap to pay" トグルは無効になり、"デバイス レベルでの有効化ポリシー" は "Always" に設定されます。
アプリケーションは、デバイス レベルで EnablementPolicy の値を照会し、各状態でのアプリの目的の動作に応じて、各ケースに対してアクションを実行できます。
SmartCardEmulator emulator = await SmartCardEmulator.GetDefaultAsync();
switch (emulator.EnablementPolicy)
{
case Never:
// you can take the user to the NFC settings to turn "tap and pay" on
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-nfctransactions:"));
break;
case Always:
return "Card emulation always on";
case ScreenOn:
return "Card emulation on only when screen is on";
case ScreenUnlocked:
return "Card emulation on only when screen unlocked";
}
外部リーダーがアプリに解決する AID を選択した場合にのみ、電話がロックされている場合や画面がオフになっている場合でも、アプリのバックグラウンド タスクが起動されます。 バックグラウンド タスクでリーダーからのコマンドに応答できますが、ユーザーからの入力が必要な場合、またはユーザーにメッセージを表示する場合は、いくつかの引数を指定してフォアグラウンド アプリを起動できます。 バックグラウンド タスクでは、次の動作でフォアグラウンド アプリを起動できます。
- デバイスのロック画面の下 (ユーザーは、デバイスのロックを解除した後にのみフォアグラウンド アプリが表示されます)
- デバイスのロック画面の上 (ユーザーがアプリを閉じると、デバイスはロックされた状態のままです)
if (Windows::Phone::System::SystemProtection::ScreenLocked)
{
// Launch above the lock with some arguments
var result = await eventDetails.TryLaunchSelfAsync("app-specific arguments", SmartCardLaunchBehavior.AboveLock);
}
SIM ベースのアプリの AID 登録とその他の更新プログラム
SIM をセキュリティで保護された要素として使用するカード エミュレーション アプリは、Windows サービスに登録して、SIM でサポートされている AID を宣言できます。 この登録は、HCE ベースのアプリの登録によく似ています。 唯一の違いは、SmartCardEmulationTypeであり、SIM ベースのアプリの場合は Uicc に設定する必要があります。 支払いカードの登録の結果、カードの表示名も NFC 設定メニューに入力されます。
var appletIdGroup = new SmartCardAppletIdGroup(
"Example DisplayName",
new List<IBuffer> {AID_PPSE.AsBuffer()},
SmartCardEmulationCategory.Payment,
SmartCardEmulationType.Uicc);