Créer une application de carte à puce NFCCreate an NFC Smart Card app

Important

Cette rubrique s’applique uniquement à Windows 10 mobile.This topic applies to Windows 10 Mobile only.

Auparavant, Windows Phone 8.1 prenait en charge les applications d’émulation de carte NFC à l’aide d’un élément sécurisé sur carte SIM, mais ce modèle nécessitait le couplage fort d’applications de paiement sécurisé avec les opérateurs de réseau mobile.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). Cette configuration éliminait de facto le recours aux solutions de paiement proposées par d’autres négociants ou développeurs ne présentant aucun couplage avec les opérateurs de réseau mobile.This limited the variety of possible payment solutions by other merchants or developers that are not coupled with MNOs. Dans Windows 10 Mobile, nous avons introduit une nouvelle technologie d’émulation de carte, appelée HCE (Host Card Emulation, émulation de carte hôte).In Windows 10 Mobile, we have introduced a new card emulation technology called, Host Card Emulation (HCE). Grâce à la technologie HCE, votre application peut directement interagir avec un lecteur de cartes NFC.HCE technology allows your app to directly communicate with an NFC card reader. Cette rubrique illustre le fonctionnement de la technologie HCE sur les appareils Windows 10 Mobile et vous explique comment développer une application HCE permettant à vos clients d’accéder à vos services sur leur téléphone, plutôt que via une carte physique, sans aucune collaboration avec un opérateur de réseau mobile.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.

Éléments nécessaires au développement d’une application HCEWhat you need to develop an HCE app

Pour développer une application d’émulation de carte HCE pour Windows 10 Mobile, vous devez obtenir votre configuration d’environnement de développement.To develop an HCE-based card emulation app for Windows 10 Mobile, you will need to get your development environment setup. Pour ce faire, vous pouvez installer Microsoft Visual Studio 2015, qui comprend les outils des développeurs Windows et l’émulateur Windows 10 Mobile prenant en charge l’émulation NFC.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. Pour plus d’informations sur la configuration, voir Se préparer.For more information about getting setup, see, Get set up

Si vous le souhaitez, il est possible de tester un véritable appareil Windows 10 Mobile sans recourir à l’émulateur Windows 10 Mobile. Pour ce faire, vous avez besoin des éléments suivants :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.

  • un appareil Windows 10 Mobile avec prise en charge NFC HCE.A Windows 10 Mobile device with NFC HCE support. Actuellement, les appareils Lumia 730, 830, 640 et le modèle 640 XL disposent du matériel prenant en charge les applications NFC HCE ;Currently, the Lumia 730, 830, 640, and the 640 XL have the hardware to support NFC HCE apps.
  • un terminal de lecteur prenant en charge les protocoles ISO/IEC 14443-4 et ISO/IEC 7816-4.A reader terminal that supports protocols ISO/IEC 14443-4 and ISO/IEC 7816-4

Windows 10 Mobile implémente un service HCE qui offre les fonctionnalités suivantes.Windows 10 Mobile implements an HCE service that provides the following functionalities.

  • Les applications peuvent inscrire les identificateurs d’applet (AID) associés aux cartes devant faire l’objet d’une émulation.Apps can register the applet identifiers (AIDs) for the cards they would like to emulate.
  • La résolution des conflits et le routage de la commande et de la réponse APDU (Application Protocol Data Unit) sont couplés à l’une des applications inscrites, en fonction de la carte de lecteur externe choisie et de la préférence utilisateur.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.
  • Gestion des événements et des notifications sur les applications, suite aux actions de l’utilisateur.Handling of events and notifications to the apps as a result of user actions.

Windows 10 prend en charge l’émulation de cartes à puce utilisant le protocole ISO-DEP (ISO-IEC 14443-4) et communique via les commandes APDU définies dans la spécification 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 prend en charge la technologie ISO/IEC 14443-4 de type A pour les applications HCE.Windows 10 supports ISO/IEC 14443-4 Type A technology for HCE apps. Les technologies de type B, de type F et non ISO-DEP (comme MIFARE) sont routées vers la carte SIM par défaut.Type B, type F, and non-ISO-DEP (eg MIFARE) technologies are routed to the SIM by default.

Seuls les appareils Windows 10 Mobile sont activés avec la fonction d’émulation de carte.Only Windows 10 Mobile devices are enabled with the card emulation feature. L’émulation de carte HCE et SIM n’est pas disponible sur les autres versions de Windows 10.SIM-based and HCE-based card emulation is not available on other versions of Windows 10.

L’architecture de la prise en charge de l’émulation de cartes HCE et SIM est indiquée dans le diagramme ci-dessous.The architecture for HCE and SIM based card emulation support is shown in the diagram below.

Architecture pour l’émulation de cartes HCE et SIM

Sélection des applications et routage des identificateurs d’appletApp selection and AID routing

Pour développer une application HCE, vous devez comprendre comment les appareils Windows 10 Mobile dirigent les identificateurs d’applet vers une application spécifique, dans la mesure où les utilisateurs peuvent installer différentes applications HCE.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. Chaque application peut inscrire plusieurs cartes HCE et SIM.Each app can register multiple HCE and SIM-based cards. Les applications Windows Phone 8.1 héritées qui sont basées sur la carte SIM continueront à fonctionner sur Windows 10 Mobile, tant que l’utilisateur sélectionne l’option Carte SIM en tant que carte de paiement par défaut dans le menu des paramètres NFC.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. Il s’agit de la configuration établie par défaut lors du premier allumage de l’appareil.This is set by default when turning the device on for the first time.

Lorsque l’utilisateur appuie vers un terminal sur son appareil Windows 10 Mobile, les données sont automatiquement routées vers l’application appropriée installée sur l’appareil.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. Ce routage est basé sur les identificateurs d’applet (AID), qui sont des identificateurs de 5-16 octets.This routing is based on the applet IDs (AIDs) which are 5-16 byte identifiers. Lors d’un appui, le terminal externe transmet une commande SELECT APDU afin de spécifier l’identificateur d’applet vers lequel diriger l’ensemble des commandes APDU suivantes.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. Les commandes SELECT suivantes modifieront de nouveau le routage.Subsequent SELECT commands, will change the routing again. En fonction des identificateurs d’applet inscrits par les applications et des paramètres utilisateurs, le trafic APDU est dirigé vers une application spécifique, qui renvoie une réponse 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. N’oubliez pas qu’un terminal peut tenter de communiquer avec plusieurs applications durant le même appui.Be aware that a terminal may want to communicate with several different apps during the same tap. Ainsi, vous devez vous assurer que la tâche en arrière-plan de votre application se ferme le plus rapidement possible lorsqu’elle est désactivée, afin de libérer de l’espace pour une autre tâche en arrière-plan d’application, utilisée pour répondre à la commande 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. Les tâches en arrière-plan seront évoquées ultérieurement dans cette rubrique.We will discuss background tasks later in this topic.

Les applications HCE doivent s’inscrire avec les identificateurs d’applet spécifiques pris en charge, afin de configurer la réception des commandes APDU associées.HCE apps must register themselves with particular AIDs they can handle so they will receive APDUs for an AID. Les applications utilisent des groupes d’identificateurs d’applet pour communiquer les identificateurs d’applet traités.Apps decalre AIDs by using AID groups. D’un point de vue conceptuel, un groupe d’identificateurs d’applet équivaut à une carte physique individuelle.An AID group is conceptually equivalent to an individual physical card. Par exemple, une carte de crédit est communiquée avec un groupe donné d’identificateurs d’application et une seconde carte de crédit d’une banque différente est communiquée avec un groupe différent d’identificateurs d’applet, même si les deux peuvent prendre en charge des identificateurs d’applet identiques.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.

Résolution de conflits pour les groupes d’identificateurs d’applet de paiementConflict resolution for payment AID groups

Lorsqu’une application inscrit des cartes physiques (groupes d’identificateurs d’applet), elle peut communiquer les catégories « Paiement » ou « Autre » de groupe d’identificateurs d’applet.When an app registers physical cards (AID groups), it can declare the AID group category as either "Payment" or "Other." Si plusieurs groupes d’identificateurs d’applet de paiement peuvent être inscrits simultanément, seul l’un d’entre eux peut être pris en charge à la fois pour le paiement au toucher. Cette sélection est effectuée par l’utilisateur.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. Ce comportement permet à l’utilisateur de disposer d’un contrôle total sur son choix. Qu’il s’agisse d’une carte de paiement unique ou d’une carte de crédit, il est assuré de ne pas payer à l’aide d’une autre carte choisie aléatoirement lorsqu’il sélectionne un terminal au toucher sur son appareil.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.

Cependant, plusieurs groupes d’identificateurs d’applet inscrits dans la catégorie « Autre » peuvent être activés simultanément sans aucune interaction de l’utilisateur.However, multiple AID groups registered as "Other" can be enabled at the same time without user interaction. Ce comportement existe, car d’autres types de cartes comme des cartes de fidélité, des bons de réduction ou des cartes de transport public sont censés fonctionner d’office, sans autre action ou invite après la pression sur le téléphone.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.

L’ensemble des groupes d’identificateurs d’applet qui sont inscrits dans la catégorie « Paiement » apparaissent dans la liste des cartes de la page des paramètres NFC, sur laquelle l’utilisateur peut sélectionner sa carte de paiement par défaut.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. Lorsqu’une carte de paiement par défaut est sélectionnée, l’application ayant inscrit ce groupe d’identificateurs d’applet de paiement devient l’application de paiement par défaut.When a default payment card is selected, the app that registered this payment AID group becomes the default payment app. Les applications de paiement par défaut peuvent activer ou désactiver les groupes d’identificateurs d’applet de paiement pris en charge sans aucune interaction utilisateur.Default payment apps can enable or disable any of their AID groups without user interaction. Si l’utilisateur décline l’invite de l’application de paiement par défaut, l’application de paiement par défaut actuellement définie (le cas échéant) demeure la valeur utilisée par défaut.If the user declines the default payment app prompt, then the current default payment app (if any) continues to remain as default. La capture suivante représente la page des paramètres NFC.The following screenshot shows the NFC Settings page.

Capture d’écran de la page des paramètres NFC

À l’aide de l’exemple de capture ci-dessus, si l’utilisateur remplace sa carte de paiement par défaut par une autre carte qui n’est pas inscrite par « HCE Application 1 », le système crée une invite de confirmation destinée à l’utilisateur.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. Toutefois, si l’utilisateur remplace sa carte de paiement par défaut par une autre carte inscrite par « HCE Application 1 », le système ne crée aucune invite de confirmation, car « HCE Application 1 » est déjà l’application de paiement par défaut.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.

Résolution de conflits pour les groupes d’identificateurs d’applet sans paiementConflict resolution for non-payment AID groups

Les cartes sans paiement de la catégorie « Autre » n’apparaissent pas dans la page des paramètres NFC.Non-payment cards categorized as "Other" do not appear in the NFC settings page.

Votre application peut créer, inscrire et activer des groupes d’identificateurs d’applet sans paiement sans rien changer de la procédure utilisée pour les groupes d’identificateurs d’applet de paiement.Your app can create, register and enable non-payment AID groups in the same manner as payment AID groups. Toutefois, et il s’agit ici de la principale différence, la catégorie d’émulation des groupes d’identificateurs d’applet sans paiement est configurée sur « Autre », non sur « Paiement ».The main difference is that for non-payment AID groups the emulation category is set to "Other" as opposed to "Payment". Après avoir inscrit le groupe d’identificateurs d’applet auprès du système, vous devez activer la réception du trafic NFC sur le groupe.After registering the AID group with the system, you need to enable the AID group to receive NFC traffic. Lorsque vous essayez d’activer la réception du trafic sur un groupe d’identificateurs d’applet sans paiement, aucune invite de confirmation n’est transmise à l’utilisateur, sauf s’il existe un conflit avec l’un des identificateurs d’applet déjà inscrit dans le système par une application différente.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. Si un conflit est identifié, un message est transmis à l’utilisateur, afin de lui communiquer des informations sur la carte et l’application associée qui seront désactivées si l’utilisateur décide d’activer le groupe d’identificateurs d’applet nouvellement inscrit.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.

Coexistence avec des applications NFC basées sur SIMCoexistence with SIM based NFC applications

Dans Windows 10 Mobile, le système configure la table de routage du contrôleur NFC qui est utilisée pour prendre les décisions de routage sur la couche du contrôleur.In Windows 10 Mobile, the system sets up the NFC controller routing table that is used to make routing decisions at the controller layer. La table contient les informations de routage pour les éléments suivants.The table contains routing information for the following items.

  • Itinéraires des identificateurs d’applet.Individual AID routes.
  • Itinéraire de protocole (ISO-DEP).Protocol based route (ISO-DEP).
  • Itinéraire technologique (NFC-A/B/F).Technology based routing (NFC-A/B/F).

Lorsqu’un lecteur externe envoie une commande « SELECT AID », le contrôleur NFC recherche une correspondance d’itinéraire d’identificateur d’applet dans la table de routage.When an external reader sends a "SELECT AID" command, the NFC controller first checks AID routes in the routing table for a match. Si aucune correspondance n’est identifiée, le contrôleur utilise l’itinéraire de protocole en tant qu’itinéraire par défaut pour le trafic 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. Pour tous les autres trafics non ISO-DEP, il utilise le routage technologique.For any other non-ISO-DEP traffic it will use the technology based routing.

Dans la page des paramètres NFC, Windows 10 Mobile offre une option de menu « Carte SIM » qui permet de continuer à utiliser les applications héritées sur carte SIM de Windows Phone 8.1, qui n’inscrivent pas leurs identificateurs d’applet auprès du système.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. Si l’utilisateur sélectionne « Carte SIM » en tant que carte de paiement par défaut, l’itinéraire ISO-DEP est défini sur UICC. Pour toutes les autres sélections du menu déroulant, l’itinéraire ISO-DEP est défini sur l’hôte.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.

L’itinéraire ISO-DEP est défini sur « Carte SIM » pour les appareils qui présentent une carte SIM compatible SE lorsque l’appareil est démarré pour la première fois avec Windows 10 Mobile.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. Lorsque l’utilisateur installe une application HCE et que cette application active des inscriptions de groupes d’identificateurs d’applet HCE, l’itinéraire ISO-DEP est dirigé vers l’hôte.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. Les nouvelles applications sur cartes SIM doivent inscrire les identificateurs d’applet sur la carte SIM afin de renseigner les itinéraires d’identificateur d’applet dans la table de routage du contrôleur.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.

Création d’une application HCECreating an HCE based app

Votre application HCE est composée de deux parties :Your HCE app has two parts.

  • la principale application au premier plan, dédiée à l’interaction utilisateur ;The main foreground app for the user interaction.
  • une tâche en arrière-plan déclenchée par le système pour traiter les commandes APDU associées à un identificateur d’applet donné.A background task that is triggered by the system to process APDUs for a given AID.

En raison des exigences extrêmement strictes de performances associées au chargement de votre tâche en arrière-plan en réponse à une pression NFC, nous vous recommandons d’implémenter l’intégralité de votre tâche en arrière-plan en code natif C++/CX (y compris les dépendances, les références ou les bibliothèques dont vous dépendez), plutôt qu’en C# ou en code géré.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. Si C# et le code géré fonctionnent habituellement correctement, ils sont associés à une surcharge de temps évitable. Par exemple, le chargement de .NET CLR est absent avec l’écriture en 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.

Créer et inscrire votre tâche en arrière-planCreate and register your background task

Vous devez créer une tâche en arrière-plan dans votre application HCE, afin de traiter les commandes APDU émise par le système, et d’y répondre.You need to create a background task in your HCE app for processing and responding to APDUs routed to it by the system. Lors du premier lancement de votre application, le premier plan enregistre une tâche en arrière-plan HCE qui implémente l’interface IBackgroundTaskRegistration , comme indiqué dans le code suivant.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();

Notez que le déclencheur de tâche est défini sur SmartCardTriggerType.Notice that the task trigger is set to SmartCardTriggerType. EmulatorHostApplicationActivated.EmulatorHostApplicationActivated. Ainsi, chaque fois qu’une commande SELECT AID APDU est reçue par le système d’exploitation résolu sur votre application, votre tâche en arrière-plan est lancée.This means that whenever a SELECT AID command APDU is received by the OS resolving to your app, your background task will be launched.

Recevoir les commandes APDU et y répondreReceive and respond to APDUs

Quand une commande APDU est dirigée vers votre application, le système lance votre tâche en arrière-plan.When there is an APDU targeted for your app, the system will launch your background task. Votre tâche en arrière-plan reçoit la valeur APDU transmise via la propriété CommandApdu de l’objet SmartCardEmulatorApduReceivedEventArgs et répond au APDU à l’aide de la méthode TryRespondAsync du même objet.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. Pour des raisons de performance, songez à conserver votre tâche en arrière-plan pour les opérations légères.Consider keeping your background task for light operations for performance reasons. Par exemple, répondez immédiatement aux commandes APDU et fermez votre tâche en arrière-plan à l’issue du traitement.For example, respond to the APDUs immediately and exit your background task when all processing is complete. En raison de la nature des transactions NFC, les utilisateurs ont tendance à maintenir leur appareil contre le lecteur uniquement sur une courte période de temps.Due to the nature of NFC transactions, users tend to hold their device against the reader for only a very short amount of time. Votre tâche en arrière-plan continuera à recevoir le trafic à partir du lecteur jusqu’à ce que votre connexion soit désactivée. dans ce cas, vous recevrez un objet 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. Votre connexion peut être désactivée pour les raisons suivantes, comme indiqué dans la propriété SmartCardEmulatorConnectionDeactivatedEventArgs. Reason .Your connection can be deactivated because of the following reasons as indicated in the SmartCardEmulatorConnectionDeactivatedEventArgs.Reason property.

  • Si la connexion est désactivée avec la valeur ConnectionLost, cela signifie que l’utilisateur a retiré son appareil du lecteur.If the connection is deactivated with the ConnectionLost value, it means that the user pulled their device away from the reader. Si votre application nécessite que l’utilisateur appuie plus longuement sur le terminal, vous pouvez envisager de lui transmettre des commentaires.If your app needs the user to tap to the terminal longer, you might want to consider prompting them with feedback. Vous devez arrêter rapidement votre tâche en arrière-plan (en exécutant votre report), ceci pour garantir qu’aucun délai associé à la fermeture de la tâche en arrière-plan précédente ne sera respecté en cas de nouvel appui de l’utilisateur.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.
  • Si la connexion est désactivée avec l’élément ConnectionRedirected, cela signifie que le terminal a dirigé une nouvelle commande SELECT AID APDU vers un identificateur d’applet différent.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. Dans ce cas, votre application doit fermer immédiatement la tâche en arrière-plan (en exécutant votre report) afin de permettre l’exécution d’une autre tâche en arrière-plan.In this case, your app should exit the background task immediately (by completing your deferral) to allow another background task to run.

La tâche en arrière-plan doit également s’inscrire à l' événement Canceled sur l' interface IBackgroundTaskInstanceet quitter rapidement la tâche en arrière-plan (en terminant votre différé), car cet événement est déclenché par le système lorsqu’il est terminé avec votre tâche en arrière-plan.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. Voici le code associé à une tâche en arrière-plan d’une application 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();
 }
}

Créer et inscrire des groupes d’identificateurs d’appletCreate and register AID groups

Durant la mise en service de la carte, intervenant lors du premier lancement de votre application, vous créez des groupes d’identificateurs d’applet, que vous inscrivez auprès du système.During the first launch of your application when the card is being provisioned, you will create and register AID groups with the system. Le système identifie l’application possédant un lecteur système avec laquelle interagir et dirige en conséquence les commandes ADPU en fonction des identificateurs d’applet inscrits et des paramètres utilisateur.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.

La plupart des cartes de paiement sont inscrites auprès des mêmes identificateurs d’applet (PPSE) et identificateurs d’applet supplémentaires de carte réseau de paiement.Most of the payment cards register for the same AID (which is PPSE AID) along with additional payment network card specific AIDs. Chaque groupe d’identificateurs d’applet représente une carte. Lorsque l’utilisateur active la carte, l’ensemble des identificateurs d’applet du groupe sont activés.Each AID group represents a card and when the user enables the card, all AIDs in the group are enabled. De la même manière, lorsque l’utilisateur désactive la carte, l’ensemble des identificateurs d’applet du groupe sont désactivés.Similarly, when the user deactivates the card, all AIDs in the group are disabled.

Pour inscrire un groupe d’aides, vous devez créer un objet SmartCardAppletIdGroup et définir ses propriétés de façon à ce qu’il s’agit d’une carte de paiement basée sur 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. Votre nom complet doit être descriptif pour l’utilisateur, car il apparaît dans le menu des paramètres NFC, ainsi que dans les invites utilisateur.Your display name should be descriptive to the user because it will show up in the NFC settings menu as well as user prompts. Pour les cartes de paiement HCE, la propriété SmartCardEmulationCategory doit être définie sur Payment et la propriété SmartCardEmulationType doit être définie sur 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);

Pour les cartes HCE sans paiement, la propriété SmartCardEmulationCategory doit être définie sur Other et la propriété SmartCardEmulationType doit être définie sur 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);

Vous pouvez inclure jusqu’à 9 identificateurs d’applet (d’une longueur comprise entre 5 et 16 octets) par groupe d’identificateurs d’applet.You can include up to 9 AIDs (of length 5-16 bytes each) per AID group.

Utilisez la méthode RegisterAppletIdGroupAsync pour inscrire votre groupe d’aide auprès du système, qui retourne un objet SmartCardAppletIdGroupRegistration .Use the RegisterAppletIdGroupAsync method to register your AID group with the system, which will return a SmartCardAppletIdGroupRegistration object. Par défaut, la propriété ActivationPolicy de l’objet d’inscription est définie sur Disabled.By default, the ActivationPolicy property of the registration object is set to Disabled. Cela signifie que même si vos identificateurs d’applet sont inscrits auprès du système, ils ne sont pas encore activés et ne reçoivent aucun trafic.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);

Vous pouvez activer vos cartes inscrites (groupes d’aides) à l’aide de la méthode RequestActivationPolicyChangeAsync de la classeSmartCardAppletIdGroupRegistration , comme indiqué ci-dessous.You can enable your registered cards (AID groups) by using the RequestActivationPolicyChangeAsync method of theSmartCardAppletIdGroupRegistration class as shown below. Dans la mesure où une seule carte de paiement peut être activée à la fois sur le système, la définition de l’élément ActivationPolicy d’un groupe d’identificateurs d’applet de carte de paiement sur Enabled équivaut à la définition de la carte de paiement par défaut.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. L’utilisateur est invité à autoriser cette carte en tant que carte de paiement par défaut, indépendamment du fait qu’une carte de paiement par défaut soit déjà sélectionnée ou non.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. Cette allégation n’est pas vraie si votre application est déjà l’application de paiement par défaut, et qu’elle est modifiée simplement entre ses propres groupes d’identificateurs d’applet.This statement is not true if your app is already the default payment application, and is merely changing between it’s own AID groups. Vous pouvez enregistrer jusqu’à 10 groupes d’identificateurs d’applet par application.You can register up to 10 AID groups per app.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);

Vous pouvez interroger les groupes d’identificateurs d’applet inscrits de votre application avec le système d’exploitation et contrôler leur stratégie d’activation à l’aide de la méthode GetAppletIdGroupRegistrationsAsync.You can query your app’s registered AID groups with the OS and check their activation policy using the GetAppletIdGroupRegistrationsAsync method.

Une invite est transmise aux utilisateurs lorsque vous modifiez la stratégie d’activation d’une carte de paiement de Disabled en Enabled, seulement si votre application n’est pas déjà l’application de paiement par défaut.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. Une invite est transmise aux utilisateurs uniquement lorsque vous modifiez la stratégie d’activation d’une carte sans paiement de Disabled en Enabled, en cas de conflit d’identificateur d’applet.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);
    }

Notification d’événement en cas de modification de la stratégie d’activationEvent notification when activation policy change

Dans votre tâche en arrière-plan, vous pouvez configurer la réception des événements intervenant lorsque la stratégie d’activation de l’une de vos inscriptions de groupes d’identificateurs d’applet est modifiée en dehors de votre application.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. Par exemple, l’utilisateur peut modifier l’application de paiement par défaut via le menu des paramètres NFC, en remplaçant l’une de vos cartes par une autre carte hébergée par une autre application.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. S’il est nécessaire de signaler cette modification à votre application pour des raisons de configuration interne, comme pour la modification de vignettes dynamiques, vous pouvez recevoir des notifications d’événements associés et agir en conséquence dans votre application.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();

Comportement de remplacement au premier planForeground override behavior

Vous pouvez remplacer l’élément ActivationPolicy de l’une de vos inscriptions de groupes d’identificateurs d’applet par ForegroundOverride lorsque votre application est au premier plan, sans inviter l’utilisateur.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. Lorsque l’utilisateur appuie vers un terminal sur son appareil lorsque l’application est au premier plan, le trafic est dirigé vers votre application, même si aucune de vos cartes de paiement n’a été choisie par l’utilisateur en tant que carte de paiement par défaut.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. Lorsque vous modifiez une stratégie d’activation de carte en ForegroundOverride, cette modification temporaire est conservée jusqu’à ce que votre application quitte le premier plan. Elle ne modifie en rien la carte de paiement par défaut actuellement définie par l’utilisateur.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. Pour modifier l’élément ActivationPolicy de vos cartes (avec ou sans paiement) à partir de votre application de premier plan, procédez comme suit :You can change the ActivationPolicy of your payment or non-payment cards from your foreground app as follows. Notez que la méthode RequestActivationPolicyChangeAsync peut être appelée uniquement à partir d’une application de premier plan, et pas d’une tâche en arrière-plan.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);

En outre, vous pouvez inscrire un groupe d’identificateurs d’applet composé d’un seul identificateur de longueur nulle. Dans cette configuration, le système dirige l’ensemble des commandes APDU indépendamment de l’identificateur, y compris les commandes transmises avant la réception d’une commande SELECT AID.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. Toutefois, un groupe d’identificateurs de ce type fonctionne uniquement lorsque votre application est au premier plan, car il peut être uniquement défini sur ForegroundOverride, et ne peut pas être activé en permanence.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. Par ailleurs, ce mécanisme fonctionne à la fois pour les valeurs Host et UICC de l’énumération SmartCardEmulationType, afin de diriger l’ensemble du trafic vers votre tâche en arrière-plan HCE ou vers la carte SIM.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);

Vérifier les prises en charge NFC et HCECheck for NFC and HCE support

Votre application doit vérifier si un appareil présente le matériel NFC, prend en charge la fonction d’émulation de carte et l’émulation de carte hôte afin de proposer de telles fonctionnalités à l’utilisateur.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.

La fonction d’émulation de carte à puce NFC est activée uniquement sur Windows 10 Mobile. En conséquence, vous provoquerez des erreurs si vous tentez d’utiliser les API d’émulateur de carte à puce dans d’autres versions de Windows 10.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. Pour vérifier la prise en charge de l’API de carte à puce, consultez l’extrait de code suivant.You can check for smart card API support in the following code snippet.

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

Vous pouvez également vérifier si l’appareil possède un matériel NFC capable d’effectuer une certaine forme d’émulation de carte en vérifiant si la méthode SmartCardEmulator. GetDefaultAsync retourne la valeur null.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. Si tel est le cas, l’appareil ne prend en charge aucune émulation de carte NFC.If it does, then no NFC card emulation is supported on the device.

var smartcardemulator = await SmartCardEmulator.GetDefaultAsync();<

La prise en charge du routage UICC AID et HCE est disponible uniquement sur les appareils lancés récemment, comme les modèles Lumia 730, 830, 640, et 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. Tous les nouveaux appareils compatibles NFC exécutant Windows 10 Mobile et les versions ultérieures doivent prendre en charge HCE.Any new NFC capable devices running Windows 10 Mobile and after should support HCE. Pour vérifier la prise en charge HCE, votre application peut procéder de la façon suivante.Your app can check for HCE support as follows.

Smartcardemulator.IsHostCardEmulationSupported();

Comportement de l’écran de verrouillage et de l’écran éteintLock screen and screen off behavior

Windows 10 Mobile dispose de paramètres d’émulation de carte de niveau appareil, qui peuvent être définis par l’opérateur mobile ou le fabricant de l’appareil.Windows 10 Mobile has device-level card emulation settings, which can be set by the mobile operator or the manufacturer of the device. Par défaut, le commutateur Toucher pour payer est désactivé et la stratégie d’activation au niveau appareil est définie sur Toujours, sauf si l’opérateur mobile ou le fabricant remplacent ces valeurs.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.

Votre application peut interroger la valeur du EnablementPolicy au niveau de l’appareil et prendre des mesures pour chaque cas, en fonction du comportement souhaité de votre application dans chaque État.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";
}

Votre tâche en arrière-plan d’application est lancée, même si le téléphone est verrouillé et/ou si l’écran est éteint, uniquement si le lecteur externe sélectionne un identificateur d’applet qui se résout sur votre application.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. Vous pouvez répondre aux commandes du lecteur dans votre tâche en arrière-plan. Cependant, si vous sollicitez une saisie de l’utilisateur ou si vous souhaitez afficher un message à l’utilisateur, vous pouvez lancer votre application de premier plan avec quelques arguments.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. Votre tâche en arrière-plan peut lancer votre application de premier plan des manières suivantes :Your background task can launch your foreground app with the following behavior.

  • sous l’écran de verrouillage de l’appareil (l’utilisateur aura accès à votre application de premier plan uniquement après le déverrouillage de l’appareil) ;Under the device lock screen (the user will see your foreground app only after she unlocks the device)
  • au-dessus de l’écran de verrouillage de l’appareil (après la fermeture de votre application par l’utilisateur, l’appareil est toujours verrouillé).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);
        }

Inscription d’identificateur d’applet et autres mises à jour pour les applications sur carte SIMAID registration and other updates for SIM based apps

Les applications d’émulation de cartes qui utilisent la carte SIM en tant qu’élément sécurisé peut s’inscrire auprès du service Windows afin de communiquer les identificateurs d’applet pris en charge sur la carte SIM.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. Cette inscription est très similaire à l’inscription d’application HCE.This registration is very similar to an HCE-based app registration. La seule différence est SmartCardEmulationType, qui doit être défini sur UICC pour les applications SIM.The only difference is the SmartCardEmulationType, which should be set to Uicc for SIM-based apps. Suite à l’inscription de la carte de paiement, le nom d’affichage de celle-ci apparaît également dans le menu des paramètres 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);

Important

La prise en charge héritée de l’interception des SMS binaires de Windows Phone 8.1 a été supprimée et remplacée par une nouvelle prise en charge élargie des SMS dans Windows 10 Mobile, mais l’ensemble des applications Windows Phone 8.1 héritées utilisant cette fonctionnalité doivent être mises à jour pour prendre en charge les nouvelles API SMS Windows 10 Mobile.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.