Создание приложения для смарт-карты 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 Параметры для продолжения использования устаревших приложений windows Телефон 8.1 SIM, которые не регистрируют свои идентификаторы ИИД в системе. Если пользователь выбирает 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 пользователи, как правило, удерживают свое устройство на средство чтения только в течение очень короткого времени. Фоновая задача будет продолжать получать трафик от средства чтения до отключения подключения, в этом случае вы получите объект SmartCardEmulator Подключение ionDeactivatedEventArgs. Подключение можно отключить из-за следующих причин, как указано в свойстве SmartCardEmulator Подключение ionDeactivatedEventArgs.Reason.

  • Если подключение деактивировано со значением Подключение ionLost, это означает, что пользователь вытащил устройство из средства чтения. Если вашему приложению требуется, чтобы пользователь нажимал на терминал дольше, вам может потребоваться предложить им обратную связь. Вы должны быстро завершить фоновую задачу (завершив отсрочку), чтобы убедиться, что они снова касаются, она не будет отложена, ожидая завершения предыдущей фоновой задачи.
  • Если подключение деактивировано с помощью Подключение ionRedirected, это означает, что терминал отправил новую команду 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 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

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

Большинство карта оплаты регистрируются для той же службы AID, среды системы оплаты близкого взаимодействия (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 группы помощи для оплаты совпадает с настройкой карта оплаты по умолчанию. Пользователю будет предложено разрешить этот карта в качестве оплаты по умолчанию карта независимо от того, выбран ли платеж по умолчанию карта уже выбран. Эта инструкция не соответствует действительности, если приложение уже является приложением оплаты по умолчанию и просто изменяется между группами ПОМОЩИ. Вы можете зарегистрировать до 10 групп AID на каждое приложение.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);

Вы можете запросить зарегистрированные группы ПОМОЩНИКа приложения с ОС и проверка их политику активации с помощью метода 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 эмулятора smart карта в других версиях 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);