Поделиться через


Создание приложения для смарт-карты NFC

Внимание

Этот раздел относится только к Windows 10 Mobile.

В этом разделе описывается, как использовать эмуляцию карточки узла (HCE) для непосредственного взаимодействия с картой nfc и разрешить клиентам получать доступ к своим службам по телефону (вместо физической карты) без оператора мобильной сети (MNO).

Что необходимо для разработки приложения HCE

Чтобы разработать приложение эмуляции карт на основе HCE, необходимо установить Microsoft Visual Studio 2015 (см . страницу скачивания Visual Studio) (включая средства разработчика Windows) и эмулятор Windows 10 Mobile.

Дополнительные сведения о получении настройки см. в разделе "Тестирование с помощью эмулятор устройства с Windows 10 Mobile (Майкрософт)".

При необходимости, если вы хотите протестировать с помощью реального устройства Windows 10 Mobile вместо включенного эмулятора Windows 10 Mobile, вам также потребуется следующее.

  • Устройство Windows 10 Mobile с поддержкой NFC HCE.
  • Терминал чтения, поддерживающий протоколы ISO/IEC 14443-4 и ISO/IEC 7816-4

Windows 10 Mobile реализует службу HCE, которая предоставляет следующие функции.

  • Приложения могут зарегистрировать идентификаторы applet (AID) для карточек, которые они хотели бы эмулировать.
  • Разрешение конфликтов и маршрутизация пары команд и ответов для единицы данных протокола приложений (APDU) в одно из зарегистрированных приложений на основе выбора внешней карточки чтения и предпочтения пользователя.
  • Обработка событий и уведомлений для приложений в результате действий пользователей.

Windows 10 поддерживает эмуляцию смарт-карт, основанных на СТАНДАРТЕ ISO-DEP (ISO-IEC 14443-4) и взаимодействует с использованием API,как определено в спецификации ISO-IEC 7816-4. Windows 10 поддерживает технологию ISO/IEC 14443-4 Type A для приложений HCE. Технологии типа B, type F и non-ISO-DEP (например, MIFARE) направляются на SIM-карту по умолчанию.

Только устройства Windows 10 Mobile включены с помощью функции эмуляции карт. Эмуляция карт на основе SIM и HCE недоступна в других версиях Windows 10.

На схеме ниже показана архитектура эмуляции карты на основе HCE и SIM-карты.

Архитектура эмуляции HCE и SIM-карты

Выбор приложений и маршрутизация AID

Чтобы разработать приложение HCE, необходимо понять, как устройства Windows 10 Mobile направляют ИИД в определенное приложение, так как пользователи могут устанавливать несколько разных приложений HCE. Каждое приложение может зарегистрировать несколько карт на основе HCE и SIM-карт.

Когда пользователь нажимает устройство Windows 10 Mobile на терминал, данные автоматически направляются в соответствующее приложение, установленное на устройстве. Эта маршрутизация основана на идентификаторе applet (AID), который является идентификатором 5-16 байтов. Во время касания внешний терминал передает команду SELECT APDU, чтобы указать помощь, в которой будут перенаправлены все последующие команды APDU. Последующие команды SELECT снова изменят маршрутизацию. На основе идентификаторов ИИД, зарегистрированных приложениями и параметрами пользователей, трафик APDU направляется в определенное приложение, которое отправляет APDU ответа. Помните, что терминал может потребовать взаимодействия с несколькими различными приложениями во время одного касания. Таким образом, вы должны убедиться, что фоновая задача приложения завершается как можно быстрее, когда деактивирована, чтобы освободить место для фоновой задачи другого приложения, чтобы реагировать на APDU. Далее в этом разделе мы обсудим фоновые задачи.

Приложения HCE должны регистрировать себя с определенными идентификаторами ИИИ, которые они могут обрабатывать, чтобы они получали API для ПОМОЩИ. Приложения объявляют ИИД с помощью групп AID. Группа AID концептуально эквивалентна отдельной физической карте. Например, одна кредитная карта объявлена с группой ПОМОЩИ, а вторая кредитная карта из другого банка объявлена с другой, второй группой ПОМОЩИ, даже если оба из них могут иметь одну и ту же ПОМОЩЬ.

Разрешение конфликтов для групп помощи для оплаты

Когда приложение регистрирует физические карточки (группы AID), оно может объявить категорию группы AID как "Платеж" или "Другие". Хотя в любой момент времени может быть зарегистрировано несколько групп помощи для оплаты, в любое время может быть включена только одна из этих групп помощи оплаты, которая выбрана пользователем. Это поведение существует, так как пользователь ожидает, что он будет контролировать сознательное выбор одного платежа, кредита или дебетовой карты, чтобы они не оплачивали другую непреднамеренные карты при нажатии устройства на терминал.

Однако несколько групп AID, зарегистрированных как "Другие", могут быть включены одновременно без взаимодействия с пользователем. Это поведение существует, потому что другие типы карт, таких как лояльность, купоны или транзит, как ожидается, просто работают без каких-либо усилий или запрашивают всякий раз, когда они касаются своего телефона.

Все группы AID, зарегистрированные в качестве оплаты, отображаются в списке карт на странице параметров NFC, где пользователь может выбрать свою платежную карту по умолчанию. Если выбрана карта оплаты по умолчанию, приложение, зарегистрированное этой группой помощи оплаты, становится приложением оплаты по умолчанию. Приложения для оплаты по умолчанию могут включать или отключать любые группы ПОМОЩИ без взаимодействия с пользователем. Если пользователь отклоняет запрос на оплату по умолчанию, текущее приложение оплаты по умолчанию (если таковое) продолжает оставаться как по умолчанию. На следующем снимках экрана показана страница параметров NFC.

Снимок экрана: страница параметров NFC

Используя приведенный выше пример снимка экрана, если пользователь изменяет карту оплаты по умолчанию на другую карту, которая не зарегистрирована приложением HCE 1, система создает запрос на подтверждение согласия пользователя. Однако если пользователь изменяет карту оплаты по умолчанию на другую карту, зарегистрированную приложением HCE Application 1, система не создает запрос подтверждения для пользователя, так как "HCE Application1" уже является приложением оплаты по умолчанию.

Разрешение конфликтов для групп ПОМОЩИ без оплаты

Неплатежные карты, классифицированные как "Другие", не отображаются на странице параметров NFC.

Приложение может создавать, регистрировать и включать группы ПОМОЩИ без оплаты таким же образом, как и группы ПОМОЩИ для оплаты. Основное различие заключается в том, что для групп, не являющихся платежами, категория эмуляции имеет значение "Другие" в отличие от "Платеж". После регистрации группы AID в системе необходимо включить группу AID для получения трафика NFC. При попытке включить неплатежную группу ПОМОЩИ для получения трафика пользователь не запрашивает подтверждение, если не существует конфликта с одним из ИИД, уже зарегистрированных в системе другим приложением. Если возникает конфликт, пользователю будет предложено получить сведения о какой карточке, а связанное приложение будет отключено, если пользователь решит включить только что зарегистрированную группу ПОМОЩИ.

Сосуществование с приложениями NFC на основе SIM

В 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 предоставляет пункт меню "SIM-карта" на странице параметров NFC для продолжения использования устаревших приложений на основе SIM-интерфейсов Windows Phone 8.1, которые не регистрируют свои идентификаторы и идентификаторы в системе. Если пользователь выбирает SIM-карту в качестве карты оплаты по умолчанию, маршрут ISO-DEP имеет значение UICC, для всех остальных выборов в раскрывающемся меню маршрут ISO-DEP находится на узле.

Маршрут ISO-DEP имеет значение SIM-карта для устройств с включенным SIM-картой SE при первом загрузке устройства с Windows 10 Mobile. Когда пользователь устанавливает приложение с поддержкой HCE и это приложение включает все регистрации групп HCE AID, маршрут ISO-DEP будет указан на узел. Для заполнения определенных маршрутов AID в таблице маршрутизации контроллера необходимо зарегистрировать идентификаторы ИИД в SIM-интерфейсе.

Создание приложения на основе HCE

Приложение HCE состоит из двух частей.

  • Основное приложение переднего плана для взаимодействия с пользователем.
  • Фоновая задача, активируемый системой для обработки API для заданного ПОМОЩНИКа.

Из-за очень жестких требований к производительности для загрузки фоновой задачи в ответ на касание NFC рекомендуется реализовать всю фоновую задачу в машинном коде C++/CX (включая все зависимости, ссылки или библиотеки, от которых вы зависите), а не на C# или управляемый код. Хотя C# и управляемый код обычно хорошо выполняются, есть издержки, такие как загрузка среды CLR .NET, которую можно избежать, написав его в C++/CX.

Создание и регистрация фоновой задачи

Необходимо создать фоновую задачу в приложении HCE для обработки и реагирования на API-интерфейсы, перенаправленные системой. При первом запуске приложения на переднем плане регистрируется фоновая задача HCE, реализующая интерфейс IBackgroundTaskRegistration , как показано в следующем коде.

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

Обратите внимание, что для триггера задачи задано значение SmartCardTriggerType. EmulatorHostApplicationActivated. Это означает, что всякий раз, когда apDU команды SELECT AID получает ОС, разрешающей вашему приложению, будет запущена фоновая задача.

Получение и реагирование на API

Если для приложения используется APDU, система запустит фоновую задачу. Фоновая задача получает APDU, передаваемую через свойство CommandApdu Объекта CommandApdu Объекта SmartCardEmulatorApgs, и отвечает на него с помощью метода TryRespondAsync одного объекта. По соображениям производительности рекомендуется сохранить фоновую задачу для операций освещения. Например, немедленно отвечайте на api-интерфейсы и выйдите из фоновой задачи после завершения всей обработки. Из-за характера транзакций NFC пользователи, как правило, удерживают свое устройство на средство чтения только в течение очень короткого времени. Фоновая задача будет продолжать получать трафик от средства чтения до отключения подключения, в этом случае вы получите объект SmartCardEmulatorConnectionDeactivatedEventArgs. Подключение можно отключить из-за следующих причин, как указано в свойстве SmartCardEmulatorConnectionDeactivatedEventArgs.Reason .

  • Если подключение деактивировано со значением ConnectionLost , это означает, что пользователь вытащил устройство из средства чтения. Если вашему приложению требуется, чтобы пользователь нажимал на терминал дольше, вам может потребоваться предложить им обратную связь. Вы должны быстро завершить фоновую задачу (завершив отсрочку), чтобы убедиться, что они снова касаются, она не будет отложена, ожидая завершения предыдущей фоновой задачи.
  • Если подключение деактивировано с помощью ConnectionRedirected, это означает, что терминал отправил новую команду SELECT AID APDU, направленную на другую помощь. В этом случае приложение должно немедленно выйти из фоновой задачи (завершив отсрочку), чтобы разрешить выполнение другой фоновой задачи.

Фоновая задача также должна зарегистрировать событие Canceled в интерфейсе IBackgroundTaskInstance, а также быстро выйти из фоновой задачи (завершив отсрочку), так как это событие запускается системой после завершения фоновой задачи. Ниже приведен код, демонстрирующий фоновую задачу приложения 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 в системе. Система определяет приложение, с которым внешний читатель хотел бы взаимодействовать с API и направлять их соответствующим образом на основе зарегистрированных идентификаторов ИИ ИИ ИИ и параметров пользователя.

Большинство карт оплаты регистрируются для одной и той же ПОМОЩИ, среды системы оплаты близкого взаимодействия (PPSE), а также дополнительных сетевых карт оплаты определенных ИИД. Каждая группа 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);

Вы можете включить до 9 ИИД (длиной 5–16 байт каждый) для каждой группы ПОМОЩИ.

Используйте метод RegisterAppletIdGroupAsync, чтобы зарегистрировать группу AID в системе, которая вернет объект SmartCardAppletIdGroupRegistration. По умолчанию свойство ActivationPolicy объекта регистрации имеет значение Disabled. Это означает, что даже если ваши идентификаторы ИИ зарегистрированы в системе, они еще не включены и не будут получать трафик.

reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);

Вы можете включить зарегистрированные карточки (группы AID) с помощью методаRequestActivationPolicyChangeAsync класса SmartCardAppletIdGroupRegistration, как показано ниже. Так как только одна платежная карта может быть включена одновременно в системе, параметр ActivationPolicy группы помощи оплаты имеет значение Enabled , совпадает с настройкой карты оплаты по умолчанию. Пользователю будет предложено разрешить эту карту как платежную карту по умолчанию, независимо от того, выбрана ли платежная карта по умолчанию. Эта инструкция не соответствует действительности, если приложение уже является приложением оплаты по умолчанию и просто изменяется между группами ПОМОЩИ. Вы можете зарегистрировать до 10 групп AID на каждое приложение.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);

Вы можете запросить зарегистрированные группы AID приложения с ОС и проверить их политику активации с помощью метода GetAppletIdGroupRegistrationsAsync.

Пользователям будет предложено изменить политику активации карты оплаты с "Отключено " на "Включено", только если ваше приложение еще не является приложением оплаты по умолчанию. Пользователи будут запрашиваться только при изменении политики активации неплатежной карты с "Отключено " на "Включено ", если возникает конфликт С ПОМОЩЬЮ.

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

Уведомление о событии при изменении политики активации

В фоновой задаче вы можете зарегистрировать события для получения событий при изменении политики активации одной из регистраций группы AID за пределами вашего приложения. Например, пользователь может изменить приложение оплаты по умолчанию с помощью меню параметров NFC из одной из карт на другую карту, размещенную другим приложением. Если ваше приложение должно знать об этом изменении для внутренней настройки, например об обновлении динамических плиток, вы можете получать уведомления о событиях для этого изменения и принимать меры в приложении соответствующим образом.

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

Поведение переопределения переднего плана

Вы можете изменить ActivationPolicy любой из регистраций группы AID на ForegroundOverride, пока ваше приложение находится на переднем плане, не запрашивая пользователя. Когда пользователь нажимает свое устройство на терминал, пока ваше приложение находится на переднем плане, трафик направляется в приложение, даже если ни одна из ваших карт оплаты не была выбрана пользователем в качестве карты оплаты по умолчанию. При изменении политики активации карты на ForegroundOverride это изменение является временным, пока приложение не покидает передний план и не изменит текущую платежную карту по умолчанию, установленную пользователем. Вы можете изменить ActivationPolicy для оплаты или неплатежных карт из приложения переднего плана, как показано ниже. Обратите внимание, что метод RequestActivationPolicyChangeAsync можно вызывать только из приложения переднего плана и не может вызываться из фоновой задачи.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);

Кроме того, можно зарегистрировать группу AID, состоящую из одной 0-длины AID, которая приведет к тому, что система будет направлять все API независимо от ПОМОЩНИКа и включая все api-интерфейсы команд, отправленные перед получением команды SELECT AID. Однако такая группа AID работает только в то время как приложение находится на переднем плане, так как оно может быть установлено только foregroundOverride и не может быть постоянно включено. Кроме того, этот механизм работает как для значений Host, так и UICC перечисления SmartCardEmulationType для маршрутизации всего трафика в фоновую задачу HCE или SIM-карты.

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, поэтому при попытке использовать API эмулятора смарт-карт в других версиях Windows 10 возникают ошибки. Вы можете проверить поддержку API смарт-карт в следующем фрагменте кода.

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

Кроме того, можно проверить, имеет ли устройство оборудование NFC, которое может иметь некоторую форму эмуляции карты, проверив, возвращает ли метод SmartCardEmulator.GetDefaultAsync значение NULL. Если это так, на устройстве не поддерживается эмуляция карты NFC.

var smartcardemulator = await SmartCardEmulator.GetDefaultAsync();<

Поддержка маршрутизации UICC на основе HCE и AID доступна только на недавно запущенных устройствах, таких как Lumia 730, 830, 640 и 640 XL. Все новые устройства с поддержкой NFC под управлением Windows 10 Mobile и после этого должны поддерживать HCE. Приложение может проверить поддержку HCE следующим образом.

Smartcardemulator.IsHostCardEmulationSupported();

Блокировка экрана и выключение экрана

Windows 10 Mobile имеет параметры эмуляции на уровне устройства, которые могут быть установлены мобильным оператором или производителем устройства. По умолчанию переключатель "Коснитесь для оплаты" отключен, а для параметра "Политика включения на уровне устройства" задано значение Always, если только MO или OEM не перезаписывает эти значения.

Приложение может запрашивать значение 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";
}

Фоновая задача вашего приложения будет запущена, даже если телефон заблокирован и (или) экран отключен, только если внешний читатель выбирает помощь, которая разрешает ваше приложение. Вы можете ответить на команды из средства чтения в фоновой задаче, но если вам нужны какие-либо входные данные от пользователя или если вы хотите отобразить сообщение пользователю, вы можете запустить приложение переднего плана с некоторыми аргументами. Фоновая задача может запустить приложение переднего плана с помощью следующего поведения.

  • На экране блокировки устройства (пользователь увидит приложение переднего плана только после разблокировки устройства)
  • Над экраном блокировки устройства (после закрытия приложения устройство по-прежнему находится в заблокированном состоянии)
        if (Windows::Phone::System::SystemProtection::ScreenLocked)
        {
            // Launch above the lock with some arguments
            var result = await eventDetails.TryLaunchSelfAsync("app-specific arguments", SmartCardLaunchBehavior.AboveLock);
        }

Регистрация и другие обновления для приложений на основе SIM-карт

Приложения эмуляции карт, использующие SIM-карту в качестве безопасного элемента, могут зарегистрировать в службе Windows, чтобы объявить идентификаторы ИИ, поддерживаемые в SIM-коде. Эта регистрация очень похожа на регистрацию приложения на основе HCE. Единственное различие заключается в smartCardEmulationType, которое должно быть задано в Uicc для приложений на основе SIM. В результате регистрации карты оплаты отображаемое имя карты также будет заполнено в меню параметров NFC.

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