중요합니다
이 항목은 Windows 10 Mobile에만 적용됩니다.
이 항목에서는 HCE(호스트 카드 에뮬레이션)를 사용하여 NFC(근거리 통신) 카드 판독기와 직접 통신하고 고객이 MNO(모바일 네트워크 운영자) 없이 실제 카드 대신 휴대폰을 통해 서비스에 액세스할 수 있도록 하는 방법을 설명합니다.
HCE 앱을 개발하는 데 필요한 사항
HCE 기반 카드 에뮬레이션 앱을 개발하려면 Microsoft Visual Studio 2015( Visual Studio 다운로드 페이지 참조)(Windows 개발자 도구 포함) 및 Windows 10 Mobile 에뮬레이터를 설치해야 합니다.
설치 과정에 대한 자세한 내용을 보려면 Microsoft Emulator for Windows 10 Mobile 테스트를 참조하세요.
필요에 따라 포함된 Windows 10 Mobile 에뮬레이터 대신 실제 Windows 10 Mobile 디바이스로 테스트하려면 다음 항목도 필요합니다.
- NFC HCE가 지원되는 Windows 10 Mobile 디바이스.
- 프로토콜 ISO/IEC 14443-4 및 ISO/IEC 7816-4를 지원하는 판독기 터미널
Windows 10 Mobile은 다음 기능을 제공하는 HCE 서비스를 구현합니다.
- 앱은 에뮬레이트하려는 카드에 대한 애플릿 식별자(AID)를 등록할 수 있습니다.
- APDU(애플리케이션 프로토콜 데이터 단위) 명령 및 응답 쌍의 충돌을 해결하고 라우팅하여 외부 판독기 카드 선택 및 사용자 선호도에 따라 등록된 앱 중 하나로 전달합니다.
- 사용자 작업의 결과로 앱에 대한 이벤트 및 알림 처리
Windows 10은 ISO-DEP(ISO-IEC 14443-4)를 기반으로 하는 스마트 카드의 에뮬레이션을 지원하고 ISO-IEC 7816-4 사양에 정의된 대로 APTU를 사용하여 통신합니다. Windows 10은 HCE 앱용 ISO/IEC 14443-4 Type A 기술을 지원합니다. B형, F형 및 비ISO-DEP(예: MIFARE) 기술은 기본적으로 SIM으로 라우팅됩니다.
카드 에뮬레이션 기능을 사용하여 Windows 10 Mobile 디바이스만 사용하도록 설정됩니다. SIM 기반 및 HCE 기반 카드 에뮬레이션은 다른 버전의 Windows 10에서 사용할 수 없습니다.
HCE 및 SIM 기반 카드 에뮬레이션 지원에 대한 아키텍처는 아래 다이어그램에 나와 있습니다.
앱 선택 및 AID 라우팅
HCE 앱을 개발하려면 사용자가 여러 다른 HCE 앱을 설치할 수 있으므로 Windows 10 Mobile 디바이스가 AID를 특정 앱으로 라우팅하는 방법을 이해해야 합니다. 각 앱은 여러 HCE 및 SIM 기반 카드를 등록할 수 있습니다.
사용자가 Windows 10 Mobile 디바이스를 터미널에 탭하면 데이터가 디바이스에 설치된 적절한 앱으로 자동으로 라우팅됩니다. 이 라우팅은 5-16 바이트 식별자인 AID(애플릿 ID)를 기반으로 합니다. 탭하는 동안 외부 단말기는 선택 명령 APDU를 전송하여 모든 후속 APDU 명령이 라우팅될 AID를 지정합니다. 후속 SELECT 명령은 라우팅을 다시 변경합니다. 앱 및 사용자 설정에 의해 등록된 AID에 따라 APDU 트래픽은 응답 APDU를 보내는 특정 앱으로 라우팅됩니다. 터미널은 동일한 탭 중에 여러 다른 앱과 통신하려고 할 수 있습니다. 따라서 다른 앱의 백그라운드 작업이 APDU에 응답할 수 있는 공간을 확보하기 위해 비활성화될 때 앱의 백그라운드 작업이 가능한 한 빨리 종료되도록 해야 합니다. 이 항목의 뒷부분에서 백그라운드 작업에 대해 설명합니다.
HCE 앱은 특정 AID를 처리할 수 있도록 자신을 등록해야 하며, 이를 통해 해당 AID에 대한 APDU를 수신할 수 있습니다. 앱은 AID 그룹을 사용하여 AID를 선언합니다. AID 그룹은 개념적으로 개별 물리적 카드와 동일합니다. 예를 들어, 한 신용 카드는 AID 그룹으로 선언되고 다른 은행의 두 번째 신용 카드는 둘 다 동일한 AID를 가질 수 있더라도 다른 두 번째 AID 그룹으로 선언됩니다.
결제 AID 그룹의 분쟁 해결
앱이 실제 카드(AID 그룹)를 등록하는 경우 AID 그룹 범주를 "결제" 또는 "기타"로 선언할 수 있습니다. 지정된 시간에 여러 결제 AID 그룹이 등록될 수 있지만 사용자가 선택한 한 번에 탭 및 지불에 대해 이러한 결제 AID 그룹 중 하나만 사용하도록 설정할 수 있습니다. 이 동작은 사용자가 터미널에 디바이스를 탭할 때 의도하지 않은 다른 카드로 결제하지 않도록 사용할 단일 결제, 신용 또는 직불 카드를 의식적으로 선택할 수 있어야 하기 때문입니다.
그러나 "기타"로 등록된 여러 AID 그룹은 사용자 상호 작용 없이 동시에 사용하도록 설정할 수 있습니다. 이 동작은 충성도, 쿠폰 또는 대중교통과 같은 다른 유형의 카드가 휴대폰을 탭할 때마다 아무런 노력이나 프롬프트 없이 작동할 것으로 예상되기 때문에 존재합니다.
"결제"로 등록된 모든 AID 그룹은 사용자가 기본 결제 카드를 선택할 수 있는 NFC 설정 페이지의 카드 목록에 표시됩니다. 기본 결제 카드를 선택하면 이 결제 AID 그룹을 등록한 앱이 기본 결제 앱이 됩니다. 기본 결제 앱은 사용자 상호 작용 없이 AID 그룹을 사용하거나 사용하지 않도록 설정할 수 있습니다. 사용자가 기본 결제 앱 프롬프트를 거부하는 경우 현재 기본 결제 앱(있는 경우)은 계속 기본값으로 유지됩니다. 다음 스크린샷은 NFC 설정 페이지를 보여줍니다.
위의 예제 스크린샷을 사용하여 사용자가 기본 결제 카드를 "HCE 애플리케이션 1"에 등록되지 않은 다른 카드로 변경하는 경우 시스템에서 사용자의 동의에 대한 확인 프롬프트를 만듭니다. 그러나 사용자가 기본 결제 카드를 "HCE 애플리케이션 1"에 등록된 다른 카드로 변경하는 경우 시스템은 "HCE Application1"이 이미 기본 결제 앱이므로 사용자에게 확인 프롬프트를 만들지 않습니다.
미결제 AID 그룹에 대한 충돌 해결
"기타"로 분류된 미결제 카드는 NFC 설정 페이지에 표시되지 않습니다.
앱은 결제 AID 그룹과 동일한 방식으로 미결제 AID 그룹을 만들고 등록하고 사용하도록 설정할 수 있습니다. 주요 차이점은 미결제 AID 그룹의 경우 에뮬레이션 범주가 "결제"가 아닌 "기타"로 설정된다는 것입니다. AID 그룹을 시스템에 등록한 후에는 AID 그룹이 NFC 트래픽을 수신하도록 설정해야 합니다. 미결제 AID 그룹이 트래픽을 수신하도록 설정하려고 하면 다른 앱에서 시스템에 이미 등록된 ID 중 하나와 충돌하지 않는 한 사용자에게 확인 메시지가 표시되지 않습니다. 사용자가 새로 등록된 AID 그룹을 활성화하도록 선택할 경우, 충돌이 발생하면 어떤 카드와 그에 연결된 앱이 비활성화될 것인지에 대한 정보가 제공됩니다.
SIM 기반 NFC 애플리케이션과 공존
Windows 10 Mobile에서 시스템은 컨트롤러 계층에서 라우팅 결정을 내리는 데 사용되는 NFC 컨트롤러 라우팅 테이블을 설정합니다. 테이블에는 다음 항목에 대한 라우팅 정보가 포함되어 있습니다.
- 개별 AID 경로.
- 프로토콜 기반 경로(ISO-DEP).
- 기술 기반 라우팅(NFC-A/B/F).
외부 판독기에서 "SELECT AID" 명령을 보내면 NFC 컨트롤러는 먼저 라우팅 테이블의 AID 경로에서 일치하는 항목을 확인합니다. 일치하는 항목이 없으면 프로토콜 기반 경로를 ISO-DEP(14443-4-A) 트래픽의 기본 경로로 사용합니다. 다른 비ISO-DEP 트래픽의 경우 기술 기반 라우팅을 사용합니다.
Windows 10 Mobile은 NFC 설정 페이지에서 "SIM 카드" 메뉴 옵션을 제공하여 시스템에 AID를 등록하지 않는 레거시 Windows Phone 8.1 SIM 기반 앱을 계속 사용합니다. 사용자가 기본 결제 카드로 "SIM 카드"를 선택하면 ISO-DEP 경로가 UICC로 설정되고, 드롭다운 메뉴의 다른 모든 선택 항목에 대해 ISO-DEP 경로가 호스트에 있습니다.
디바이스가 Windows 10 Mobile에서 처음으로 부팅될 때 SE 사용 SIM 카드가 있는 디바이스의 경우 ISO-DEP 경로가 "SIM 카드"로 설정됩니다. 사용자가 HCE 사용 앱을 설치하고 해당 앱이 HCE AID 그룹 등록을 활성화하면, ISO-DEP 경로가 호스트를 가리키게 됩니다. 컨트롤러 라우팅 테이블에 특정 AID 경로가 채워지려면 새 SIM 기반 애플리케이션이 SIM에 AID를 등록해야 합니다.
HCE 기반 앱 만들기
HCE 앱에는 두 부분으로 구성되어 있습니다.
- 사용자 상호 작용을 위한 기본 포그라운드 앱입니다.
- 시스템에서 특정 AID에 대한 APDUs를 처리하도록 트리거되는 백그라운드 작업입니다.
NFC 탭에 대한 응답으로 백그라운드 작업을 로드하기 위한 성능 요구 사항이 매우 엄격하기 때문에 C# 또는 관리 코드 대신 전체 백그라운드 작업을 C++/CX 네이티브 코드(종속성, 참조 또는 라이브러리 포함)로 구현하는 것이 좋습니다. C# 및 관리 코드는 일반적으로 잘 수행되지만 .NET CLR 로드와 같은 오버헤드는 C++/CX로 작성하여 방지할 수 있습니다.
백그라운드 작업 만들기 및 등록
시스템에서 라우트된 APDU를 처리하고 응답하기 위해 HCE 앱에서 백그라운드 작업을 만들어야 합니다. 앱이 처음 시작되는 동안 포그라운드는 다음 코드와 같이 IBackgroundTaskRegistration 인터페이스를 구현하는 HCE 백그라운드 작업을 등록합니다.
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorHostApplicationActivated));
bgTask = taskBuilder.Register();
작업 트리거가 SmartCardTriggerType로 설정되어 있습니다. EmulatorHostApplicationActivated. 즉, SELECT AID 명령 APDU가 OS에 의해 앱으로 판별될 때마다, 백그라운드 작업이 실행됩니다.
APTU 수신 및 응답
앱이 대상으로 지정된 APDU가 있는 경우 시스템은 백그라운드 작업을 시작합니다. 백그라운드 작업은 SmartCardEmulatorApduReceivedEventArgs 개체의 CommandApdu 속성을 통해 전달된 APDU를 수신하고 동일한 개체의 TryRespondAsync 메서드를 사용하여 APDU에 응답합니다. 성능상의 이유로 가벼운 작업을 위해 백그라운드 작업을 유지하는 것이 좋습니다. 예를 들어 APTU에 즉시 응답하고 모든 처리가 완료되면 백그라운드 작업을 종료합니다. NFC 트랜잭션의 특성으로 인해 사용자는 매우 짧은 시간 동안만 판독기를 상대로 디바이스를 보유하는 경향이 있습니다. 백그라운드 작업은 연결이 비활성화될 때까지 리더기로부터 트래픽을 계속 수신하게 됩니다. 이 경우, SmartCardEmulatorConnectionDeactivatedEventArgs 개체를 수신하게 됩니다. SmartCardEmulatorConnectionDeactivatedEventArgs.Reason 속성에 표시된 다음과 같은 이유로 인해 연결을 비활성화할 수 있습니다.
- ConnectionLost 값으로 연결이 비활성화되면 사용자가 판독기에서 디바이스를 끌어왔다는 의미입니다. 앱에서 사용자가 터미널을 더 오래 탭해야 하는 경우 피드백을 요청하는 것이 좋습니다. 백그라운드 작업의 연기를 완료하여 신속하게 종료하십시오. 이렇게 하면 사용자가 다시 탭했을 때 이전 백그라운드 작업이 종료될 때까지 기다리지 않도록 할 수 있습니다.
- ConnectionRedirected로 연결이 비활성화된 경우, 이는 터미널이 다른 AID로 새로운 SELECT AID 명령 APDU를 보냈다는 것을 의미합니다. 이 경우 앱은 다른 백그라운드 작업을 실행할 수 있도록 지연을 완료하여 백그라운드 작업을 즉시 종료해야 합니다.
또한 백그라운드 작업은 IBackgroundTaskInstance 인터페이스에서 Canceled 이벤트 를 등록해야 하며, 시스템이 백그라운드 작업을 완료하면 이 이벤트가 발생하므로 지연을 완료하여 백그라운드 작업을 신속히 종료해야 합니다. 다음은 HCE 앱 백그라운드 작업을 보여 주는 코드입니다.
void BgTask::Run(
IBackgroundTaskInstance^ taskInstance)
{
m_triggerDetails = static_cast<SmartCardTriggerDetails^>(taskInstance->TriggerDetails);
if (m_triggerDetails == nullptr)
{
// May be not a smart card event that triggered us
return;
}
m_emulator = m_triggerDetails->Emulator;
m_taskInstance = taskInstance;
switch (m_triggerDetails->TriggerType)
{
case SmartCardTriggerType::EmulatorHostApplicationActivated:
HandleHceActivation();
break;
case SmartCardTriggerType::EmulatorAppletIdGroupRegistrationChanged:
HandleRegistrationChange();
break;
default:
break;
}
}
void BgTask::HandleHceActivation()
{
try
{
auto lock = m_srwLock.LockShared();
// Take a deferral to keep this background task alive even after this "Run" method returns
// You must complete this deferral immediately after you have done processing the current transaction
m_deferral = m_taskInstance->GetDeferral();
DebugLog(L"*** HCE Activation Background Task Started ***");
// Set up a handler for if the background task is cancelled, we must immediately complete our deferral
m_taskInstance->Canceled += ref new Windows::ApplicationModel::Background::BackgroundTaskCanceledEventHandler(
[this](
IBackgroundTaskInstance^ sender,
BackgroundTaskCancellationReason reason)
{
DebugLog(L"Cancelled");
DebugLog(reason.ToString()->Data());
EndTask();
});
if (Windows::Phone::System::SystemProtection::ScreenLocked)
{
auto denyIfLocked = Windows::Storage::ApplicationData::Current->RoamingSettings->Values->Lookup("DenyIfPhoneLocked");
if (denyIfLocked != nullptr && (bool)denyIfLocked == true)
{
// The phone is locked, and our current user setting is to deny transactions while locked so let the user know
// Denied
DoLaunch(Denied, L"Phone was locked at the time of tap");
// We still need to respond to APDUs in a timely manner, even though we will just return failure
m_fDenyTransactions = true;
}
}
else
{
m_fDenyTransactions = false;
}
m_emulator->ApduReceived += ref new TypedEventHandler<SmartCardEmulator^, SmartCardEmulatorApduReceivedEventArgs^>(
this, &BgTask::ApduReceived);
m_emulator->ConnectionDeactivated += ref new TypedEventHandler<SmartCardEmulator^, SmartCardEmulatorConnectionDeactivatedEventArgs^>(
[this](
SmartCardEmulator^ emulator,
SmartCardEmulatorConnectionDeactivatedEventArgs^ eventArgs)
{
DebugLog(L"Connection deactivated");
EndTask();
});
m_emulator->Start();
DebugLog(L"Emulator started");
}
catch (Exception^ e)
{
DebugLog(("Exception in Run: " + e->ToString())->Data());
EndTask();
}
}
AID 그룹 만들기 및 등록
카드를 프로비전할 때 애플리케이션을 처음 시작하는 동안 AID 그룹을 만들고 시스템에 등록합니다. 시스템은 등록된 AID와 사용자 설정에 따라 외부 판독기가 통신하고자 하는 앱을 결정하고, 그에 따라 APDU를 라우팅합니다.
대부분의 결제 카드는 동일한 AID, 근접 결제 시스템 환경(PPSE)에 등록되며, 추가 결제 네트워크 카드 관련 AID도 함께 등록됩니다. 각 AID 그룹은 카드를 나타내며 사용자가 카드를 사용하도록 설정하면 그룹의 모든 AID가 활성화됩니다. 마찬가지로 사용자가 카드를 비활성화하면 그룹의 모든 AID가 비활성화됩니다.
AID 그룹을 등록하려면 SmartCardAppletIdGroup 개체를 만들고 HCE 기반 결제 카드임을 반영하도록 속성을 설정해야 합니다. 표시 이름은 NFC 설정 메뉴와 사용자 프롬프트에 표시되므로 사용자에게 설명이 있어야 합니다. HCE 결제 카드의 경우 SmartCardEmulationCategory 속성을 Payment으로 설정해야 하며, SmartCardEmulationType 속성을 Host로 설정해야 합니다.
public static byte[] AID_PPSE =
{
// File name "2PAY.SYS.DDF01" (14 bytes)
(byte)'2', (byte)'P', (byte)'A', (byte)'Y',
(byte)'.', (byte)'S', (byte)'Y', (byte)'S',
(byte)'.', (byte)'D', (byte)'D', (byte)'F', (byte)'0', (byte)'1'
};
var appletIdGroup = new SmartCardAppletIdGroup(
"Example DisplayName",
new List<IBuffer> {AID_PPSE.AsBuffer()},
SmartCardEmulationCategory.Payment,
SmartCardEmulationType.Host);
미결제 HCE 카드의 경우 SmartCardEmulationCategory 속성을 다른로 설정해야 하며, SmartCardEmulationType 속성을 호스트로 설정해야 합니다.
public static byte[] AID_OTHER =
{
(byte)'1', (byte)'2', (byte)'3', (byte)'4',
(byte)'5', (byte)'6', (byte)'7', (byte)'8',
(byte)'O', (byte)'T', (byte)'H', (byte)'E', (byte)'R'
};
var appletIdGroup = new SmartCardAppletIdGroup(
"Example DisplayName",
new List<IBuffer> {AID_OTHER.AsBuffer()},
SmartCardEmulationCategory.Other,
SmartCardEmulationType.Host);
AID 그룹당 최대 9개의 AID(각각 길이 5-16바이트)를 포함할 수 있습니다.
RegisterAppletIdGroupAsync 메서드를 사용하여 SMARTCardAppletIdGroupRegistration 개체를 반환하는 AID 그룹을 시스템에 등록합니다. 기본적으로 등록 개체의 ActivationPolicy 속성은 사용 안 함 설정됩니다. 즉, AID가 시스템에 등록되어 있더라도 아직 사용하도록 설정되지 않았으며 트래픽을 수신하지 않습니다.
reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);
아래와 같이SmartCardAppletIdGroupRegistration 클래스의 RequestActivationPolicyChangeAsync 메서드를 사용하여, 등록한 카드(AID 그룹)를 활성화할 수 있습니다. 시스템에서 한 번에 하나의 결제 카드만 활성화할 수 있으므로, 결제 AID 그룹의 ActivationPolicy을 Enabled로 설정하는 것은 기본 결제 카드를 설정하는 것과 같습니다. 기본 결제 카드가 이미 선택되어 있는지 여부에 관계없이 이 카드를 기본 결제 카드로 허용하라는 메시지가 사용자에게 표시됩니다. 앱이 이미 기본 결제 애플리케이션이고 단순히 자체 AID 그룹 간에 변경되는 경우에는 이 설명이 사실이 아닙니다. 앱당 최대 10개의 AID 그룹을 등록할 수 있습니다.
reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);
GetAppletIdGroupRegistrationsAsync 메서드를 사용하여 OS를 사용하여 앱의 등록된 AID 그룹을 쿼리하고 해당 활성화 정책을 확인할 수 있습니다.
기본 결제 앱으로 설정되어 있지 않은 경우에만 사용자가 결제 카드의 활성화 정책을 사용 안 함에서 사용으로 변경하라는 알림을 받게 됩니다. 비결제 카드의 활성화 정책을 사용 안 함에서 사용으로 변경할 때 AID 충돌이 있는 경우에만 사용자에게 메시지가 표시됩니다.
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();
전경 재정의 동작
앱이 포그라운드에 있는 동안 사용자에게 메시지를 표시하지 않고 AID 그룹 등록의 ActivationPolicy를 ForegroundOverride로 변경할 수 있습니다. 앱이 포그라운드에 있는 동안 사용자가 디바이스를 터미널로 탭하면 사용자가 기본 결제 카드로 선택한 결제 카드가 없는 경우에도 트래픽이 앱으로 라우팅됩니다. 카드의 활성화 정책을 ForegroundOverride로 변경하면, 이 변경은 앱이 포그라운드를 벗어날 때까지 임시로 적용되며, 사용자가 설정한 현재 기본 결제 카드를 변경하지 않습니다. 전경 앱에서 다음과 같이 결제 또는 미결제 카드의 ActivationPolicy을 변경할 수 있습니다. RequestActivationPolicyChangeAsync 메서드는 포그라운드 앱에서만 호출할 수 있으며 백그라운드 작업에서 호출할 수 없습니다.
reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);
또한 단일 0 길이 AID로 구성된 AID 그룹을 등록하면 시스템이 AID에 관계없이 모든 APU를 라우팅하고 SELECT AID 명령이 수신되기 전에 전송된 명령 APU를 포함할 수 있습니다. 그러나 이러한 AID 그룹은 앱이 포그라운드에 있는 동안에만 작동합니다. 이는 ForegroundOverride로만 설정할 수 있고 영구적으로 사용하도록 설정할 수 없기 때문입니다. 또한 이 메커니즘은 호스트 및 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에서만 사용하도록 설정되므로 다른 버전의 Windows 10에서 스마트 카드 에뮬레이터 API를 사용하려고 하면 오류가 발생합니다. 다음 코드 조각에서 스마트 카드 API 지원을 확인할 수 있습니다.
Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Devices.SmartCards.SmartCardEmulator");
또한 SmartCardEmulator.GetDefaultAsync 메서드가 null을 반환하는지 확인하여 디바이스에 어떤 형태의 카드 에뮬레이션이 가능한 NFC 하드웨어가 있는지 확인할 수 있습니다. 이 경우 디바이스에서 NFC 카드 에뮬레이션이 지원되지 않습니다.
var smartcardemulator = await SmartCardEmulator.GetDefaultAsync();<
HCE 및 AID 기반 UICC 라우팅에 대한 지원은 Lumia 730, 830, 640 및 640 XL과 같은 최근에 출시된 디바이스에서만 사용할 수 있습니다. Windows 10 Mobile 이상을 실행하는 모든 새로운 NFC 지원 디바이스는 HCE를 지원해야 합니다. 앱은 다음과 같이 HCE 지원을 확인할 수 있습니다.
Smartcardemulator.IsHostCardEmulationSupported();
잠금 화면 및 화면 끄기 동작
Windows 10 Mobile에는 통신사 또는 디바이스 제조업체가 설정할 수 있는 디바이스 수준 카드 에뮬레이션 설정이 있습니다. MO 또는 OEM이 이러한 값을 덮어쓰지 않는 한, 기본적으로 '탭하여 결제' 토글은 비활성화되어 있으며 '디바이스 수준의 사용 정책'은 '항상'으로 설정되어 있습니다.
애플리케이션은 디바이스 수준에서 EnablementPolicy 의 값을 쿼리하고 각 상태에서 앱의 원하는 동작에 따라 각 사례에 대한 작업을 수행할 수 있습니다.
SmartCardEmulator emulator = await SmartCardEmulator.GetDefaultAsync();
switch (emulator.EnablementPolicy)
{
case Never:
// you can take the user to the NFC settings to turn "tap and pay" on
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-nfctransactions:"));
break;
case Always:
return "Card emulation always on";
case ScreenOn:
return "Card emulation on only when screen is on";
case ScreenUnlocked:
return "Card emulation on only when screen unlocked";
}
외부 판독기가 앱과 연결되는 AID를 선택하는 경우에만, 휴대폰이 잠겨 있거나 화면이 꺼져 있더라도 앱의 백그라운드 작업이 시작됩니다. 백그라운드 작업에서 판독기에서 명령에 응답할 수 있지만 사용자의 입력이 필요하거나 사용자에게 메시지를 표시하려는 경우 일부 인수를 사용하여 포그라운드 앱을 시작할 수 있습니다. 백그라운드 태스크는 다음과 같은 동작으로 포어그라운드 앱을 시작할 수 있습니다.
- 디바이스 잠금 화면(사용자가 디바이스 잠금을 해제한 후에만 포그라운드 앱이 표시됨)
- 디바이스 잠금 화면 위(사용자가 앱을 해제한 후에도 디바이스는 여전히 잠긴 상태입니다.)
if (Windows::Phone::System::SystemProtection::ScreenLocked)
{
// Launch above the lock with some arguments
var result = await eventDetails.TryLaunchSelfAsync("app-specific arguments", SmartCardLaunchBehavior.AboveLock);
}
SIM 기반 앱에 대한 AID 등록 및 기타 업데이트
SIM을 보안 요소로 사용하는 카드 에뮬레이션 앱은 Windows 서비스에 등록하여 SIM에서 지원되는 AID를 선언할 수 있습니다. 이 등록은 HCE 기반 앱 등록과 매우 유사합니다. 유일한 차이점은 SIM 기반 앱의 경우 Uicc로 설정해야 하는 SmartCardEmulationType입니다. 결제 카드 등록의 결과로 카드의 표시 이름도 NFC 설정 메뉴에 채워집니다.
var appletIdGroup = new SmartCardAppletIdGroup(
"Example DisplayName",
new List<IBuffer> {AID_PPSE.AsBuffer()},
SmartCardEmulationCategory.Payment,
SmartCardEmulationType.Uicc);