NFC スマート カード アプリの作成Create an NFC Smart Card app

重要な  このトピックでは Windows 10 Mobile にのみ適用されます。Important  This topic applies to Windows 10 Mobile only.

Windows Phone 8.1 では、SIM ベースのセキュア エレメントを使用する NFC カード エミュレーション アプリがサポートされていましたが、このモデルでは、安全な支払いアプリと移動体通信事業者 (MNO) 様との密接な連携が必要でした。Windows Phone 8.1 supported NFC card emulation apps using a SIM-based secure element, but that model required secure payment apps to be tightly coupled with mobile-network operators (MNO). このことにより、MNO 様と連携していないために、他の事業者様や開発者様によるさまざまな支払いソリューションの可能性が制限されていました。This limited the variety of possible payment solutions by other merchants or developers that are not coupled with MNOs. Windows 10 Mobile では、ホスト カード エミュレーション (HCE) と呼ばれる新しいカード エミュレーション テクノロジが導入されています。In Windows 10 Mobile, we have introduced a new card emulation technology called, Host Card Emulation (HCE). HCE テクノロジを使用すると、アプリが NFC カード リーダーと直接通信することができます。HCE technology allows your app to directly communicate with an NFC card reader. このトピックでは、Windows 10 Mobile デバイスでのホスト カード エミュレーション (HCE) のしくみと、物理的なカードではなく電話からお客様がサービスにアクセスできるような HCE アプリを MNO と連携せずに開発する方法について説明します。This topic illustrates how Host Card Emulation (HCE) works on Windows 10 Mobile devices and how you can develop an HCE app so that your customers can access your services through their phone instead of a physical card without collaborating with an MNO.

HCE アプリの開発に必要な要素What you need to develop an HCE app

Windows 10 Mobile の HCE ベースのカードのエミュレーション アプリを開発するには、開発環境のセットアップを取得する必要があります。To develop an HCE-based card emulation app for Windows 10 Mobile, you will need to get your development environment setup. Microsoft Visual Studio 2015 を含む、Windows 開発者ツールと NFC エミュレーションのサポートを Windows 10 Mobile エミュレーターをインストールすることで設定を取得できます。You can get set up by installing Microsoft Visual Studio 2015, which includes the Windows developer tools and the Windows 10 Mobile emulator with NFC emulation support. セットアップの詳細については、「準備」を参照してください。For more information about getting setup, see, Get set up

必要に応じて、含まれる、Windows 10 Mobile エミュレーターではなく実際の Windows 10 Mobile デバイスでテストする場合は、次のものも必要があります。Optionally, if you want to test with a real Windows 10 Mobile device instead of the included Windows 10 Mobile emulator, you will also need the following items.

  • NFC HCE サポートで Windows 10 Mobile デバイスです。A Windows 10 Mobile device with NFC HCE support. 現時点で、NFC HCE アプリをサポートするハードウェアは Lumia 730、830、640、640 XL に搭載されています。Currently, the Lumia 730, 830, 640, and the 640 XL have the hardware to support NFC HCE apps.
  • プロトコルとして ISO/IEC 14443-4 および ISO/IEC 7816-4 をサポートするリーダー端末。A reader terminal that supports protocols ISO/IEC 14443-4 and ISO/IEC 7816-4

Windows 10 Mobile では、次の機能を提供する HCE サービスを実装します。Windows 10 Mobile implements an HCE service that provides the following functionalities.

  • エミュレートするカード用のアプレット識別子 (AID) をアプリで登録できる。Apps can register the applet identifiers (AIDs) for the cards they would like to emulate.
  • 外部リーダー カードの選択とユーザー設定に基づいて、アプリケーション プロトコル データ ユニット (APDU) のコマンドと応答のペアをいずれかの登録済みアプリにルーティングし、競合を解決する。Conflict resolution and routing of the Application Protocol Data Unit (APDU) command and response pairs to one of the registered apps based on the external reader card selection and user preference.
  • ユーザー操作の結果としてイベントとアプリへの通知を処理する。Handling of events and notifications to the apps as a result of user actions.

Windows 10 は、ISO DEP に基づくスマート カードのエミュレーションをサポートしています (ISO/IEC 14443-4) Apdu で定義されている ISO IEC 7816 4 仕様を使用して通信とします。Windows 10 supports emulation of smart cards that are based on ISO-DEP (ISO-IEC 14443-4) and communicates using APDUs as defined in the ISO-IEC 7816-4 specification. Windows 10 では、HCE アプリの ISO/IEC 14443 4 種類 A のテクノロジをサポートします。Windows 10 supports ISO/IEC 14443-4 Type A technology for HCE apps. Type B、Type F、非 ISO-DEP (MIFARE など) のテクノロジは、既定では SIM にルーティングされます。Type B, type F, and non-ISO-DEP (eg MIFARE) technologies are routed to the SIM by default.

カードのエミュレーション機能では、Windows 10 Mobile デバイスのみが有効になります。Only Windows 10 Mobile devices are enabled with the card emulation feature. SIM および HCE ベースのカードのエミュレーションでは、その他のバージョンの Windows 10 で使用できません。SIM-based and HCE-based card emulation is not available on other versions of Windows 10.

HCE および SIM ベースのカード エミュレーションのサポートのアーキテクチャを、次の図に示します。The architecture for HCE and SIM based card emulation support is shown in the diagram below.

HCE および SIM カード エミュレーションのアーキテクチャ

アプリの選択と AID ルーティングApp selection and AID routing

HCE アプリを開発するには、ユーザーは、複数の異なる HCE アプリをインストールできるため、Windows 10 Mobile デバイスで補助、特定のアプリにルーティングする方法を理解する必要があります。To develop an HCE app, you must understand how Windows 10 Mobile devices route AIDs to a specific app because users can install multiple different HCE apps. 各アプリは、HCE ベースおよび SIM ベースのカードを複数登録できます。Each app can register multiple HCE and SIM-based cards. ユーザーは、NFC の設定 メニューがペイメント カードの既定値として「SIM カード」オプションを選択している限り、Windows 10 Mobile で動作する SIM ベースである従来の Windows Phone 8.1 アプリを続けます。Legacy Windows Phone 8.1 apps that are SIM-based will continue to work on Windows 10 Mobile as long as the user chooses the "SIM Card" option as their default payment card in the NFC Setting menu. これは、初めてデバイスに電源を入れると既定で設定される構成です。This is set by default when turning the device on for the first time.

ユーザーがターミナルに、Windows 10 Mobile デバイスをタップしたときに、データはデバイスにインストールされている適切なアプリに自動的にルーティングされます。When the user taps their Windows 10 Mobile device to a terminal, the data is automatically routed to the proper app installed on the device. このルーティングは、5 ~ 16 バイトの識別子であるアプレット ID (AID) に基づいています。This routing is based on the applet IDs (AIDs) which are 5-16 byte identifiers. タップが発生すると、外部端末は SELECT コマンドの APDU を送出し、後続のすべての APDU コマンドのルーティング先とする AID を指定します。During a tap, the external terminal will transmit a SELECT command APDU to specify the AID it would like all subsequent APDU commands to be routed to. 後続の SELECT コマンドでは、ルーティング先を再度変更できます。Subsequent SELECT commands, will change the routing again. アプリとユーザー設定によって登録されている AID に基づいて、APDU トラフィックが特定のアプリにルーティングされます。ルーティング先のアプリは、応答の APDU を送信します。Based on the AIDs registered by apps and user settings, the APDU traffic is routed to a specific app, which will send a response APDU. 端末側では同じタップで異なる複数のアプリとの通信を必要としている場合もあるので注意してください。Be aware that a terminal may want to communicate with several different apps during the same tap. このため、別のアプリのバックグラウンド タスクが APDU に応答する余地ができるように、アプリのバックグラウンド タスクは、非アクティブ化されたらできる限り早く終了する必要があります。So you must ensure your app's background task exits as quickly as possible when deactivated to make room for another app's background task to respond to the APDU. バックグラウンド タスクについては、後で説明します。We will discuss background tasks later in this topic.

HCE アプリは、AID の APDU を受信できるように、対応が可能な特定の AID に自身を登録する必要があります。HCE apps must register themselves with particular AIDs they can handle so they will receive APDUs for an AID. アプリは、AID グループを使用して AID を宣言します。Apps decalre AIDs by using AID groups. AID グループは、概念的には個々の物理カードに相当します。An AID group is conceptually equivalent to an individual physical card. たとえば、2 枚のカードの AID が同じであっても、1 枚目のクレジット カードは 1 つ目の AID グループ、別の銀行から発行された 2 枚目のクレジット カードは 2 つ目の AID グループで登録されます。For example, one credit card is declared with an AID group and a second credit card from a different bank is declared with a different, second AID group, even though both of them may have the same AID.

支払い AID グループの競合の解決Conflict resolution for payment AID groups

アプリで物理カード (AID グループ) を登録する際には、AID グループのカテゴリを "Payment" または "Other" として宣言します。When an app registers physical cards (AID groups), it can declare the AID group category as either "Payment" or "Other." 同時に複数の支払い AID グループが登録されることはあり得ますが、"タップして支払い" 用に同時に有効にできる支払い AID グループは、ユーザーによって選択された 1 つのグループのみです。While there can be multiple payment AID groups registered at any given time, only one of these payment AID groups may be enabled for Tap and Pay at a time, which is selected by the user. これは、デバイスを端末にタップしたときに意図しないカードで支払われることのないよう、単一の支払い用カード、クレジット カード、またはデビット カードをユーザーが自分の意志で選択できるようにするためです。This behavior exists because the user expects be in control of consciously choosing a single payment, credit, or debit card to use so they don't pay with a different unintended card when tapping their device to a terminal.

ただし、"Other" として登録されている複数の AID グループは、ユーザー操作なしに同時に有効にすることができます。However, multiple AID groups registered as "Other" can be enabled at the same time without user interaction. これは、他の種類のカード (ロイヤルティ、クーポン、交通機関用など) については、電話をタップするだけで特に操作やユーザー入力を必要とせず役割が果たされるようにするためです。This behavior exists because other types of cards like loyalty, coupons, or transit are expected to just work without any effort or prompting whenever they tap their phone.

"Payment" として登録された AID グループはすべて、NFC 設定ページのカード一覧に表示されます。この一覧で、ユーザーは既定の支払い用カードを選択できます。All the AID groups that are registered as "Payment" appear in the list of cards in the NFC Settings page, where the user can select their default payment card. 既定の支払い用カードが選択されると、この支払い AID グループを登録したアプリが既定の支払いアプリになります。When a default payment card is selected, the app that registered this payment AID group becomes the default payment app. 既定の支払いアプリは、登録されている任意の AID グループをユーザー操作なしで有効または無効に切り替えることができます。Default payment apps can enable or disable any of their AID groups without user interaction. ユーザーが既定の支払いアプリを確認するメッセージで確認を拒否した場合は、現在の既定の支払いアプリ (ある場合) が引き続き既定として使用されます。If the user declines the default payment app prompt, then the current default payment app (if any) continues to remain as default. 次のスクリーン ショットは、NFC 設定ページを示しています。The following screenshot shows the NFC Settings page.

NFC 設定ページのスクリーン ショット

上のスクリーンショットで説明すると、ユーザーが既定の支払い用カードを変更して、"HCE Application 1" によって登録されていない別のカードに切り替えた場合、システムはユーザーによる同意を求めて確認プロンプトを表示します。Using the example screenshot above, if the user changes his default payment card to another card that is not registered by "HCE Application 1," the system creates a confirmation prompt for the user’s consent. ユーザーが既定の支払い用カードを変更して、"HCE Application 1" によって登録されている別のカードに切り替えた場合、"HCE Application 1" は既に既定の支払いアプリであるため、システムはユーザーに対する確認プロンプトを表示しません。However, if the user changes his default payment card to another card that is registered by "HCE Application 1," the system does not create a confirmation prompt for the user, because "HCE Application1" is already the default payment app.

支払い以外の AID グループの競合の解決Conflict resolution for non-payment AID groups

支払い用以外として "Other" というカテゴリに設定されているカードは、NFC 設定ページには表示されません。Non-payment cards categorized as "Other" do not appear in the NFC settings page.

アプリでは、支払い AID グループと同じ方法で、支払い用以外の AID グループを作成、登録、有効化することができます。Your app can create, register and enable non-payment AID groups in the same manner as payment AID groups. 主な違いは、支払い用以外の AID グループについてはエミュレーション カテゴリを "Payment" ではなく "Other" に設定する点です。The main difference is that for non-payment AID groups the emulation category is set to "Other" as opposed to "Payment". AID グループをシステムに登録した後は、AID グループが NFC トラフィックを受信できるようにする必要があります。After registering the AID group with the system, you need to enable the AID group to receive NFC traffic. 支払い用以外の AID グループについてトラフィックの受信を有効化する場合、別のアプリによって既にシステムに登録されている AID との競合がない限り、ユーザーに対する確認プロンプトは表示されません。When you try to enable a non-payment AID group to receive traffic, the user is not prompted for a confirmation unless there is a conflict with one of the AIDs already registered in the system by a different app. 競合が存在すると、新しく登録された AID グループの有効化をユーザーが選択した場合に、どのカードと関連するアプリが無効になるかを示す情報と共にユーザーへの確認メッセージが表示されます。If there is a conflict, the user will be prompted with information about which card and it's associated app will be disabled if the user chooses to enable the newly registered AID group.

SIM との共存ベースの NFC アプリケーションCoexistence with SIM based NFC applications

Windows 10 Mobile のでは、システムは、コント ローラーの層のルーティングを決定するために使用する NFC コント ローラー ルーティング テーブルを設定します。In Windows 10 Mobile, the system sets up the NFC controller routing table that is used to make routing decisions at the controller layer. このテーブルには、ルーティング情報として次のアイテムが含まれています。The table contains routing information for the following items.

  • 個別の AID ルート。Individual AID routes.
  • プロトコルに基づくルート (ISO DEP)。Protocol based route (ISO-DEP).
  • テクノロジに基づくルーティング (NFC-A/B/F)。Technology based routing (NFC-A/B/F).

外部リーダーにより "SELECT AID" コマンドが送信されると、NFC コントローラーはまずルーティング テーブルに一致する AID ルートがないか確認します。When an external reader sends a "SELECT AID" command, the NFC controller first checks AID routes in the routing table for a match. 一致がない場合、ISO-DEP (14443-4-A) トラフィックに対する既定のルートとしては、プロトコル ベースのルートが使用されます。If there is no match, it will use the protocol-based route as the default route for ISO-DEP (14443-4-A) traffic. その他、非 ISO-DEP のトラフィックについては、テクノロジ ベースのルーティングが使用されます。For any other non-ISO-DEP traffic it will use the technology based routing.

Windows 10 Mobile では、引き続きレガシ Windows Phone 8.1 SIM に基づくアプリケーション、システムでの補助を登録しないでを使用する、NFC の設定 ページでメニュー オプション「SIM カード」を提供します。Windows 10 Mobile provides a menu option "SIM Card" in the NFC Settings page to continue to use legacy Windows Phone 8.1 SIM-based apps, which do not register their AIDs with the system. ユーザーが既定の支払い用カードとして "SIM カード" を選択すると、ISO-DEP ルートが UICC に設定されます (ドロップダウン メニュー内の他の選択肢ではすべて、ISO-DEP ルート先はホスト)。If the user selects "SIM card" as their default payment card, then the ISO-DEP route is set to UICC, for all other selections in the drop-down menu the ISO-DEP route is to the host.

ISO DEP ルートが SE 有効になっている SIM カードで、デバイスが Windows 10 Mobile を初めて起動したとき、デバイスの「SIM カード」に設定されます。The ISO-DEP route is set to "SIM Card" for devices that have an SE enabled SIM card when the device is booted for the first time with Windows 10 Mobile. ユーザーが HCE 対応のアプリをインストールし、そのアプリでなんらかの HCE AID グループ登録が有効になった場合は、ISO-DEP ルート先がホストになります。When the user installs an HCE enabled app and that app enables any HCE AID group registrations, the ISO-DEP route will be pointed to the host. 新しい SIM ベースのアプリケーションでは、特定の AID ルートがコントローラーのルーティング テーブルに設定されるように、AID を SIM に登録する必要があります。New SIM-based applications need to register the AIDs in the SIM in order for the specific AID routes to be populated in the controller routing table.

HCE ベース アプリの作成Creating an HCE based app

HCE アプリには、2 つの部分があります。Your HCE app has two parts.

  • メインのフォアグラウンド アプリ (ユーザー操作用)。The main foreground app for the user interaction.
  • 指定された AID について APDU を処理するためにシステムによってトリガーされるバックグラウンド タスク。A background task that is triggered by the system to process APDUs for a given AID.

NFC タップへの応答としてバックグラウンド タスクを読み込む際にはきわめて高いパフォーマンスが求められるため、バックグラウンド タスク全体 (必要な依存関係、参照、ライブラリなどをすべて含めて) を C# やマネージ コードではなく、C++/CX のネイティブ コードで実装することをお勧めします。Because of the extremely tight performance requirements for loading your background task in response to an NFC tap, we recommend that your entire background task be implementing in C++/CX native code (including any dependencies, references, or libraries you depend on) rather than C# or managed code. C# およびマネージ コードは、通常はパフォーマンスに優れていますが、.NET CLR の読み込みなどによるオーバーヘッドが発生します。C++/CX では、これを回避することができます。While C# and managed code normally performs well, there is overhead, like loading the .NET CLR, that can be avoided by writing it in C++/CX.

バックグラウンド タスクの作成と登録Create and register your background task

システムによってルーティングされた APDU を処理し、これに応答するために、バックグラウンド タスクを HCE アプリに作成する必要があります。You need to create a background task in your HCE app for processing and responding to APDUs routed to it by the system. アプリが初めて起動される際には、次のコードに示すように IBackgroundTaskRegistration インターフェイスを実装する HCE バックグラウンド タスクがフォアグラウンドによって登録されます。During the first time your app is launched, the foreground registers an HCE background task that implements the IBackgroundTaskRegistration interface as shown in the following code.

var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorHostApplicationActivated));
bgTask = taskBuilder.Register();

タスクのトリガーが SmartCardTriggerType.Notice that the task trigger is set to SmartCardTriggerType. EmulatorHostApplicationActivated に設定されていることに注意してください。EmulatorHostApplicationActivated. これは、OS で受信した SELECT AID コマンドの APDU がアプリに解決されるたびに、バックグラウンド タスクが起動されることを意味します。This means that whenever a SELECT AID command APDU is received by the OS resolving to your app, your background task will be launched.

APDU の受信と応答Receive and respond to APDUs

アプリをターゲットとする APDU があると、システムは、このアプリのバックグラウンド タスクを起動します。When there is an APDU targeted for your app, the system will launch your background task. バックグラウンド タスクは、SmartCardEmulatorApduReceivedEventArgs オブジェクトの CommandApdu プロパティを通じて渡された APDU を受信し、同じオブジェクトの TryRespondAsync メソッドを使用して APDU に応答します。Your background task receives the APDU passed through the SmartCardEmulatorApduReceivedEventArgs object’s CommandApdu property and responds to the APDU using the TryRespondAsync method of the same object. パフォーマンスを考慮して、バックグラウンド タスクは軽量な操作に留めるよう検討してください。Consider keeping your background task for light operations for performance reasons. たとえば、すべての処理が完了したら、直ちに APDU に応答し、バックグラウンド タスクを終了してください。For example, respond to the APDUs immediately and exit your background task when all processing is complete. NFC トランザクションの性質から、ユーザーがリーダーに対してデバイスをかざす時間はきわめて短時間に限られています。Due to the nature of NFC transactions, users tend to hold their device against the reader for only a very short amount of time. バックグラウンド タスクは、接続が無効になるまで継続的にリーダーからトラフィックを受信し、接続が無効になると SmartCardEmulatorConnectionDeactivatedEventArgs オブジェクトを受信します。Your background task will continue to receive traffic from the reader until your connection is deactivated, in which case you will receive a SmartCardEmulatorConnectionDeactivatedEventArgs object. 接続は、SmartCardEmulatorConnectionDeactivatedEventArgs.Reason プロパティで示されるように次の理由で無効になります。Your connection can be deactivated because of the following reasons as indicated in the SmartCardEmulatorConnectionDeactivatedEventArgs.Reason property.

  • ConnectionLost 値で接続が無効になった場合は、ユーザーがリーダーからデバイスを離したことを意味します。If the connection is deactivated with the ConnectionLost value, it means that the user pulled their device away from the reader. アプリでユーザーが端末にタップする時間を長くする必要がある場合は、フィードバックと共にプロンプトを表示することを検討してください。If your app needs the user to tap to the terminal longer, you might want to consider prompting them with feedback. ユーザーが再度タップしたときに、直前のバックグラウンド タスクが終了するまで待機したために遅延が生じることのないよう、バックグラウンド タスクは (保留を終了することで) 直ちに終了する必要があります。You should terminate your background task quickly (by completing your deferral) to ensure if they tap again it won’t be delayed waiting for the previous background task to exit.
  • ConnectionRedirected で接続が無効になった場合は、端末によって新しい SELECT AID コマンドの APDU が送信され、別の AID に転送されたことを意味します。If the connection is deactivated with the ConnectionRedirected, it means that the terminal sent a new SELECT AID command APDU directed to a different AID. この場合、別のバックグラウンド タスクが実行できるように、アプリは直ちに (保留を終了することで) バックグラウンド タスクを終了する必要があります。In this case, your app should exit the background task immediately (by completing your deferral) to allow another background task to run.

バックグラウンド タスクは、IBackgroundTaskInstance インターフェイスCanceled イベントにも登録し、同様に (保留を終了することで) バックグラウンド タスクを直ちに終了する必要があります。このイベントは、バックグラウンド タスクの終了時にシステムによって発生するためです。The background task should also register for the Canceled event on IBackgroundTaskInstance interface, and likewise quickly exit the background task (by completing your deferral) because this event is fired by the system when it is finished with your background task. 次のコードでは、HCE アプリのバックグラウンド タスクのデモを示しています。Below is code that demonstrates an HCE app background task.

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 deferal 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 グループの作成と登録Create and register AID groups

カードのプロビジョニング時にアプリケーションを初めて起動すると、AID グループが作成され、システムに登録されます。During the first launch of your application when the card is being provisioned, you will create and register AID groups with the system. システムは、外部リーダーが対話する必要のあるアプリを判断し、登録されている AID とユーザー設定に基づいて APDU をルーティングします。The system determines the app that an external reader would like to talk to and route APDUs accordingly based on the registered AIDs and user settings.

ほとんどの支払い用カードは、追加の支払い用ネットワーク カード固有の AID と共に同じ AID (PPSE AID) に登録されます。Most of the payment cards register for the same AID (which is PPSE AID) along with additional payment network card specific AIDs. 各 AID グループはカードを表し、ユーザーがそのカードを有効にすると、グループ内のすべての AID が有効になります。Each AID group represents a card and when the user enables the card, all AIDs in the group are enabled. 同様に、ユーザーがカードを無効にすると、そのグループ内のすべての AID が無効になります。Similarly, when the user deactivates the card, all AIDs in the group are disabled.

AID グループを登録するには、SmartCardAppletIdGroup オブジェクトを作成し、HCE ベースの支払い用カードであることが反映されるようにプロパティを設定する必要があります。To register an AID group, you need to create a SmartCardAppletIdGroup object and set its properties to reflect that this is an HCE-based payment card. 表示名は、NFC 設定メニューにもユーザー プロンプトにも使用されるため、ユーザーにわかりやすい名前にする必要があります。Your display name should be descriptive to the user because it will show up in the NFC settings menu as well as user prompts. HCE 支払い用カードの場合、SmartCardEmulationCategory プロパティは Payment に、SmartCardEmulationType プロパティは Host に設定する必要があります。For HCE payment cards, the SmartCardEmulationCategory property should be set to Payment and the SmartCardEmulationType property should be set to 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 に設定する必要があります。For non-payment HCE cards, the SmartCardEmulationCategory property should be set to Other and the SmartCardEmulationType property should be set to 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 バイト) を含めることができます。You can include up to 9 AIDs (of length 5-16 bytes each) per AID group.

AID グループをシステムに登録するには、RegisterAppletIdGroupAsync メソッドを使用します。このメソッドからは SmartCardAppletIdGroupRegistration オブジェクトが返されます。Use the RegisterAppletIdGroupAsync method to register your AID group with the system, which will return a SmartCardAppletIdGroupRegistration object. 既定では、登録オブジェクトの ActivationPolicy プロパティは Disabled に設定されます。By default, the ActivationPolicy property of the registration object is set to Disabled. つまり、AID がシステムに登録されていても、この時点では有効になっておらず、トラフィックを受信しません。This means even though your AIDs are registered with the system, they are not enabled yet and won’t receive traffic.

reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);

登録済みのカード (AID グループ) は、次に示されているように SmartCardAppletIdGroupRegistration クラスの RequestActivationPolicyChangeAsync メソッドを使用して有効にすることができます。You can enable your registered cards (AID groups) by using the RequestActivationPolicyChangeAsync method of theSmartCardAppletIdGroupRegistration class as shown below. システムで一度に有効にできる支払い用カードは 1 枚だけであるため、支払い AID グループの ActivationPolicyEnabled に設定することは、既定の支払い用カードを設定することと同じ意味になります。Because only a single payment card can be enabled at a time on the system, setting the ActivationPolicy of a payment AID group to Enabled is the same as setting the default payment card. 既定の支払い用カードが既に選択されているかどうかに関係なく、このカードを既定の支払い用カードとして設定するかどうかをユーザーに確認するメッセージが表示されます。The user will be prompted to allow this card as a default payment card, regardless of whether there is a default payment card already selected or not. アプリが既に既定の支払いアプリケーションであり、単に AID グループ間で変更する場合、この記述は該当しません。This statement is not true if your app is already the default payment application, and is merely changing between it’s own AID groups. アプリごとに最大で 10 の AID グループを登録することができます。You can register up to 10 AID groups per app.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);

GetAppletIdGroupRegistrationsAsync メソッドを使用すると、OS に対してアプリの登録済み AID グループを照会し、アクティブ化ポリシーを確認できます。You can query your app’s registered AID groups with the OS and check their activation policy using the GetAppletIdGroupRegistrationsAsync method.

支払い用カードのアクティブ化ポリシーを Disabled から Enabled に変更する場合にユーザーに確認が求められるのは、アプリがまだ既定の支払いアプリになっていない場合のみです。Users will be prompted when you change the activation policy of a payment card from Disabled to Enabled, only if your app is not already the default payment app. 支払い用以外のカードのアクティブ化ポリシーを Disabled から Enabled に変更する場合にユーザーに確認が求められるのは、AID の競合が存在する場合のみです。Users will only be prompted when you change the activation policy of a non-payment card from Disabled to Enabled if there is an AID conflict.

var registrations = await SmartCardEmulator.GetAppletIdGroupRegistrationsAsync();
    foreach (var registration in registrations)
    {
registration.RequestActivationPolicyChangeAsync (AppletIdGroupActivationPolicy.Enabled);
    }

アクティブ化ポリシーを変更するときにイベント通知Event notification when activation policy change

バックグラウンド タスクでは、アプリの外でいずれかの AID グループ登録のアクティブ化ポリシーが変更された場合に備えてイベントを受信できるように登録できます。In your background task, you can register to receive events for when the activation policy of one of your AID group registrations changes outside of your app. たとえばユーザーは、NFC 設定メニューで既定の支払いアプリを元のカードから、別のアプリでホストされている別のカードに変更することができます。For example, the user may change the default payment app through the NFC settings menu from one of your cards to another card hosted by another app. ライブ タイルの更新など、内部セットアップ用にこの変更をアプリで認識する必要がある場合は、この変更のイベント通知を受信し、その通知に応じてアプリ内で対処することができます。If your app needs to know about this change for internal setup such as updating live tiles, you can receive event notifications for this change and take action in your app accordingly.

var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorAppletIdGroupRegistrationChanged));
bgTask = taskBuilder.Register();

フォアグラウンドのオーバーライド動作Foreground override behavior

アプリがフォアグラウンドになっている間は、ユーザーに確認することなく AID グループ登録の ActivationPolicyForegroundOverride に変更することができます。You can change the ActivationPolicy of any of your AID group registrations to ForegroundOverride while your app is in the foreground without prompting the user. アプリがフォアグラウンドになっている間にユーザーがデバイスで端末をタップすると、ユーザーがいずれの支払い用カードも既定の支払い用カードとして選択していなくても、トラフィックはアプリにルーティングされます。When the user taps their device to a terminal while your app is in the foreground, the traffic is routed to your app even if none of your payment cards were chosen by the user as their default payment card. カードのアクティブ化ポリシーを ForegroundOverride に変更した場合、この変更はアプリがフォアグラウンドから移行するまでの一時的なものであり、ユーザーによって設定された現在の既定支払い用カードは変更されません。When you change a card’s activation policy to ForegroundOverride, this change is only temporary until your app leaves the foreground and it will not change the current default payment card set by the user. 支払い用カードまたは支払い用以外のカードの ActivationPolicy は、フォアグラウンド アプリから次のように変更できます。You can change the ActivationPolicy of your payment or non-payment cards from your foreground app as follows. RequestActivationPolicyChangeAsync メソッドを呼び出すことができるのはフォアグラウンド アプリからのみであり、バックグラウンド タスクから呼び出すことはできない点に注意してください。Note that the RequestActivationPolicyChangeAsync method can only be called from a foreground app and cannot be called from a background task.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);

また、長さ 0 の単一 AID から成る AID グループを登録することもできます。その場合は、SELECT AID コマンドの受信前に送信されたコマンドの APDU もすべて含めて、AID に関係なくすべての APDU がルーティングされます。Also, you can register an AID group consisting of a single 0-length AID which will cause the system to route all APDUs regardless of the AID and including any command APDUs sent before a SELECT AID command is received. ただし、このような AID グループは ForegroundOverride にしか設定できず、常に有効にしておくことはできないため、機能するのはアプリがフォアグラウンドになっている間のみです。However, such an AID group only works while your app is in the foreground because it can only be set to ForegroundOverride and cannot be permanently enabled. また、すべてのトラフィックを HCE バックグラウンド タスクまたは SIM カードにルーティングするために、このメカニズムは SmartCardEmulationType 列挙の値が Host の場合と UICC の場合の両方に使用できます。Also, this mechanism works both for Host and UICC values of the SmartCardEmulationType enumeration to either route all traffic to your HCE background task, or to the SIM card.

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 サポートの確認Check for NFC and HCE support

アプリでは、デバイスに NFC ハードウェアがあるかどうか、カード エミュレーション機能がサポートされているかどうか、これらの機能をユーザーに提供する前にホスト カード エミュレーションがサポートされるかどうかを確認する必要があります。Your app should check whether a device has NFC hardware, supports the card emulation feature, and supports host card emulation prior to offering such features to the user.

NFC スマート カードのエミュレーション機能は、他のバージョンの Windows 10 のスマート カード エミュレーター Api を使用するようにしようとして、Windows 10 Mobile でのみ有効、エラーが発生します。The NFC smart card emulation feature is only enabled on Windows 10 Mobile, so trying to use the smart card emulator APIs in any other versions of Windows 10, will cause errors. 次のコード スニペットでは、スマート カード API のサポートを確認することができます。You can check for smart card API support in the following code snippet.

Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Devices.SmartCards.SmartCardEmulator");

さらに、SmartCardEmulator.GetDefaultAsync メソッドから null が返されるかどうかを確認することによって、なんらかの形でカード エミュレーションが可能な NFC ハードウェアがデバイスに存在するかどうかを確認することもできます。You can additionally check to see if the device has NFC hardware capable of some form of card emulation by checking if the SmartCardEmulator.GetDefaultAsync method returns null. null が返される場合、そのデバイスでは NFC カード エミュレーションがサポートされません。If it does, then no NFC card emulation is supported on the device.

var smartcardemulator = await SmartCardEmulator.GetDefaultAsync();<

HCE ベースおよび AID ベースの UICC ルーティングは、Lumia 730、830、640、640 XL など最近発売されたデバイスでのみサポートされます。Support for HCE and AID-based UICC routing is only available on recently launched devices such as the Lumia 730, 830, 640, and 640 XL. Windows 10 Mobile を実行している新しい NFC 対応デバイスおよび後 HCE をサポートする必要があります。Any new NFC capable devices running Windows 10 Mobile and after should support HCE. アプリでは、次のようにして HCE サポートを確認できます。Your app can check for HCE support as follows.

Smartcardemulator.IsHostCardEmulationSupported();

ロック画面と画面オフの動作Lock screen and screen off behavior

Windows 10 Mobile は、デバイス レベルのカード エミュレーション設定は、携帯電話会社またはデバイスの製造元によって設定できます。Windows 10 Mobile has device-level card emulation settings, which can be set by the mobile operator or the manufacturer of the device. 既定では、"タップして支払い" のトグルがオフになっており "デバイス レベルでの有効化ポリシー" が "常時" に設定されています (通信事業者または OEM パートナーによってこれらの値が上書きされていない場合)。By default, "tap to pay" toggle is disabled and the "enablement policy at device level" is set to "Always", unless the MO or OEM overwrites these values.

アプリケーションでは、デバイス レベルで EnablementPolicy の値を照会し、それぞれの状態で望ましいアプリの動作に基づいて、各ケースに対処することができます。Your application can query the value of the EnablementPolicy at device level and take action for each case depending on the desired behavior of your app in each state.

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 が外部リーダーによって選択された場合のみ)。Your app's background task will be launched even if the phone is locked and/or the screen is off only if the external reader selects an AID that resolves to your app. リーダーからのコマンドにはバックグラウンドで応答できますが、ユーザーによる操作が必要である場合や、ユーザーにメッセージを表示する必要がある場合は、いくつかの引数を指定してフォアグラウンド アプリを起動することができます。You can respond to the commands from the reader in your background task, but if you need any input from the user or if you want to show a message to the user, you can launch your foreground app with some arguments. バックグラウンド タスクでは、次の動作でフォアグラウンド アプリを起動できます。Your background task can launch your foreground app with the following behavior.

  • デバイスのロック画面下で起動 (ユーザーがフォアグラウンド アプリを目にするのはデバイスのロックを解除した後)Under the device lock screen (the user will see your foreground app only after she unlocks the device)
  • デバイスのロック画面上で起動 (ユーザーがアプリを終了した後も、デバイスはロックされた状態)Above the device lock screen (after the user dismisses your app, the device is still in locked state)
        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 登録およびその他の更新AID registration and other updates for SIM based apps

セキュア エレメントとして SIM を使用するカード エミュレーション アプリは Windows サービスに登録して、SIM でサポートされている AID を宣言できます。Card emulation apps that use the SIM as the secure element can register with the Windows service to declare the AIDs supported on the SIM. この登録は、HCE ベースのアプリ登録とよく似ています。This registration is very similar to an HCE-based app registration. 唯一の違いは SmartCardEmulationType です。SIM ベースのアプリの場合は、これを Uicc に設定する必要があります。The only difference is the SmartCardEmulationType, which should be set to Uicc for SIM-based apps. 支払い用カードを登録した結果、カードの表示名が NFC 設定メニューに表示されます。As the result of the payment card registration, the display name of the card will also be populated in the NFC setting menu.

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_PPSE.AsBuffer()},
                                SmartCardEmulationCategory.Payment,
                                SmartCardEmulationType.Uicc);

重要な   、新しい依存するすべてのレガシ Windows Phone 8.1 アプリを更新する必要がありますが、Windows Phone 8.1 でサポートされているバイナリ SMS のレガシ切片を削除しで Windows 10 Mobile より広範な SMS のサポートを新しいに置き換えられますWindows 10 Mobile の SMS Api。Important   The legacy binary SMS intercept support in Windows Phone 8.1 has been removed and replaced with new broader SMS support in Windows 10 Mobile, but any legacy Windows Phone 8.1 apps relying on that must update to use the new Windows 10 Mobile SMS APIs.