NFC 스마트 카드 앱 만들기
중요
이 항목은 Windows 10 Mobile에만 적용됩니다.
이 항목은 HCE(호스트 카드 에뮬레이션)를 사용하여 NFC(근거리 통신) 카드 판독기와 직접 통신하고 고객이 MNO(모바일 네트워크 운영자) 없이 실제 카드 대신 휴대폰을 통해 서비스에 액세스할 수 있도록 하는 방법에 대해 설명합니다.
HCE 앱을 개발하는 데 필요한 사항
HCE 기반 카드 에뮬레이션 앱을 개발하려면 Microsoft Visual Studio 2015(Visual Studio 다운로드 페이지 참조)(Windows 개발자 도구 포함) 및 Windows 10 Mobile emulator를 설치해야 합니다.
설정에 대한 자세한 정보는 Windows 10 Mobile용 Microsoft Emulator를 사용하여 테스트하기를 참조하세요.
필요에 따라 포함된 Windows 10 Mobile Emulator 대신 실제 Windows 10 Mobile 디바이스로 테스트하려면 다음의 항목도 필요합니다.
- NFC HCE가 지원되는 Windows 10 Mobile 디바이스.
- 프로토콜 ISO/IEC 14443-4 및 ISO/IEC 7816-4를 지원하는 reader 터미널
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)를 기반으로 합니다. 탭하는 동안 외부 터미널은 SELECT 명령 APDU를 전송하여 모든 후속 APDU 명령을 라우팅할 AID를 지정합니다. 후속 SELECT 명령은 라우팅을 다시 변경합니다. APDU 트래픽은 앱 및 사용자 설정에 의해 등록된 AID에 따라 응답 APDU를 보내는 특정 앱으로 라우팅됩니다. 터미널은 동일한 탭 중에 여러 다른 앱과 통신하려고 할 수 있습니다. 따라서 다른 앱의 백그라운드 작업이 APDU에 응답할 수 있는 공간을 확보하기 위해 비활성화될 때 앱의 백그라운드 작업이 가능한 한 빨리 종료되도록 해야 합니다. 이 항목의 뒷부분에서 백그라운드 작업을 설명합니다.
HCE 앱은 AID에 대한 APU를 받을 수 있도록 처리할 수 있는 특정 AID에 등록해야 합니다. 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에 대한 APU를 처리하도록 트리거되는 백그라운드 작업입니다.
NFC 탭에 대한 응답으로 백그라운드 작업을 로드하기 위한 성능 요구 사항이 매우 엄격하기 때문에 C# 또는 관리 코드 대신 전체 백그라운드 작업을 C++/CX 네이티브 코드(종속성, 참조 또는 라이브러리 포함)로 구현하는 것이 좋습니다. C# 및 관리 코드는 일반적으로 잘 수행되지만 .NET CLR 로드와 같은 오버헤드는 C++/CX로 작성하여 방지할 수 있습니다.
백그라운드 작업 생성 및 등록하기
시스템에서 라우트된 APTU를 처리하고 응답하기 위해 HCE 앱에서 백그라운드 작업을 만들어야 합니다. 앱이 처음 시작되는 동안 포그라운드는 다음 코드와 같이 IBackgroundTaskRegistration 인터페이스를 구현하는 HCE 백그라운드 작업을 등록합니다.
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorHostApplicationActivated));
bgTask = taskBuilder.Register();
작업 트리거가 SmartCardTriggerType으로 설정됩니다. EmulatorHostApplicationActivated. 이는 앱으로 확인되는 OS에서 SELECT AID 명령 APDU를 받을 때마다 백그라운드 작업이 시작됨을 의미합니다.
APTU 수신 및 응답하기
앱을 대상으로 하는 APDU가 있는 경우 시스템에서 백그라운드 작업을 시작합니다. 백그라운드 작업은 SmartCardEmulatorApduReceivedEventArgs 개체의 CommandApdu 속성을 통해 전달된 APDU를 수신하고 동일한 개체의 TryRespondAsync 메서드를 사용하여 APDU에 응답합니다. 성능상의 이유로 밝은 작업을 위해 백그라운드 작업을 유지하는 것이 좋습니다. 예를 들어 APTU에 즉시 응답하고 모든 처리가 완료되면 백그라운드 작업을 종료합니다. NFC 트랜잭션의 특성으로 인해 사용자는 매우 짧은 시간 동안만 reader를 상대로 디바이스를 보유하는 경향이 있습니다. 백그라운드 작업은 연결이 비활성화될 때까지 reader에서 트래픽을 계속 수신하며, 이 경우 SmartCardEmulatorConnectionDeactivatedEventArgs 개체를 받게 됩니다. SmartCardEmulatorConnectionDeactivatedEventArgs.Reason 속성에 표시된 다음과 같은 이유로 인해 연결을 비활성화할 수 있습니다.
- 연결이 ConnectionLost 값으로 비활성화되면 사용자가 디바이스를 reader에서 끌어왔다는 의미입니다. 앱에서 사용자가 터미널을 더 오래 탭해야 하는 경우 피드백을 요청하는 것이 좋습니다. 지연을 완료하여 백그라운드 작업을 신속하게 종료하여 다시 탭하면 이전 백그라운드 작업이 종료될 때까지 지연되지 않도록 해야 합니다.
- 연결이 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 및 사용자 설정에 따라 외부 판독기에서 APU와 통신하고 그에 따라 라우팅하려는 앱을 결정합니다.
대부분의 결제 카드 특정 AI를 카드 추가 결제 네트워크와 함께 동일한 AID, PPSE(근접 결제 시스템 환경)에 등록됩니다. 각 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 속성을 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);
AID 그룹당 최대 9개의 AID(각각 길이 5-16바이트)를 포함할 수 있습니다.
RegisterAppletIdGroupAsync 메서드를 사용하여 SmartCardAppletIdGroupRegistration 개체를 반환하는 AID 그룹을 시스템에 등록합니다. 기본적으로 등록 개체의 ActivationPolicy 속성은 Disabled로 설정됩니다. 즉, AID가 시스템에 등록되어 있더라도 아직 사용하도록 설정되지 않았으며 트래픽을 수신하지 않습니다.
reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);
아래와 같이 SmartCardAppletIdGroupRegistration 클래스의 RequestActivationPolicyChangeAsync 메서드를 사용하여 등록된 카드(AID 그룹)를 사용하도록 설정할 수 있습니다. 시스템에서 한 번에 하나의 결제 카드만 사용하도록 설정할 수 있으므로 결제 AID 그룹의 ActivationPolicy를 Enabled로 설정하는 것은 기본 결제 카드를 설정하는 것과 같습니다. 기본 결제 카드가 이미 선택되었는지 여부에 관계없이 이 카드 기본 결제 카드를 허용하라는 메시지가 사용자에게 표시됩니다. 앱이 이미 기본 결제 애플리케이션이고 단순히 자체 AID 그룹 간에 변경되는 경우에는 이 설명이 사실이 아닙니다. 앱당 최대 10개의 AID 그룹을 등록할 수 있습니다.
reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);
앱의 등록된 AID 그룹을 쿼리하고 해당 활성화 정책을 검사하기 위해 GetAppletIdGroupRegistrationsAsync 메서드를 사용하여 OS를 사용할 수 있습니다.
앱이 아직 기본 결제 앱이 아닌 경우에만 결제 카드 활성화 정책을 Disabled에서 Enabled로 변경하는 경우 사용자에게 메시지가 표시됩니다. AID 충돌이 있는 경우 미결제 카드 활성화 정책을 Disabled에서 Enabled로 변경하는 경우에만 사용자에게 메시지가 표시됩니다.
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로만 설정할 수 있고 영구적으로 사용하도록 설정할 수 없기 때문입니다. 또한 이 메커니즘은 모든 트래픽을 HCE 백그라운드 작업으로 라우팅하거나 SIM 카드 라우팅하는 SmartCardEmulationType 열거형의 Host 및 UICC 값 모두에서 작동합니다.
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";
}
휴대폰이 잠겨 있거나 외부 reader에서 앱으로 확인되는 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);