Membuat aplikasi Kartu Pintar NFC

Penting

Topik ini hanya berlaku untuk Windows 10 Mobile.

Topik ini menjelaskan cara menggunakan Emulasi Kartu Host (HCE) untuk berkomunikasi langsung dengan pembaca kartu komunikasi dekat bidang (NFC) dan memungkinkan pelanggan Anda mengakses layanan Anda melalui ponsel mereka (bukan kartu fisik) tanpa operator jaringan seluler (MNO).

Apa yang Anda butuhkan untuk mengembangkan aplikasi HCE

Untuk mengembangkan aplikasi emulasi kartu berbasis HCE, Anda perlu menginstal Microsoft Visual Studio 2015 (lihat halaman unduhan Visual Studio) (termasuk alat pengembang Windows) dan emulator Windows 10 Mobile.

Untuk informasi selengkapnya tentang mendapatkan penyiapan, lihat Menguji dengan Microsoft Emulator untuk Windows 10 Mobile.

Secara opsional, jika Anda ingin menguji dengan perangkat Windows 10 Mobile nyata alih-alih emulator Windows 10 Mobile yang disertakan, Anda juga memerlukan item berikut.

  • Perangkat Windows 10 Mobile dengan dukungan NFC HCE.
  • Terminal pembaca yang mendukung protokol ISO/IEC 14443-4 dan ISO/IEC 7816-4

Windows 10 Mobile menerapkan layanan HCE yang menyediakan fungsionalitas berikut.

  • Aplikasi dapat mendaftarkan pengidentifikasi applet (AID) untuk kartu yang ingin mereka emulasi.
  • Resolusi konflik dan perutean perintah Application Protocol Data Unit (APDU) dan pasangan respons ke salah satu aplikasi terdaftar berdasarkan pilihan kartu pembaca eksternal dan preferensi pengguna.
  • Penanganan peristiwa dan pemberitahuan ke aplikasi sebagai akibat dari tindakan pengguna.

Windows 10 mendukung emulasi kartu pintar yang didasarkan pada ISO-DEP (ISO-IEC 14443-4) dan berkomunikasi menggunakan APDUs seperti yang didefinisikan dalam spesifikasi ISO-IEC 7816-4. Windows 10 mendukung teknologi ISO/IEC 14443-4 Type A untuk aplikasi HCE. Jenis B, jenis F, dan teknologi non-ISO-DEP (misalnya MIFARE) dirutekan ke SIM secara default.

Hanya perangkat Windows 10 Mobile yang diaktifkan dengan fitur emulasi kartu. Emulasi kartu berbasis SIM dan berbasis HCE tidak tersedia pada versi Windows 10 lainnya.

Arsitektur untuk dukungan emulasi kartu berbasis HCE dan SIM ditunjukkan pada diagram di bawah ini.

Arsitektur untuk emulasi kartu HCE dan SIM

Pemilihan aplikasi dan perutean AID

Untuk mengembangkan aplikasi HCE, Anda harus memahami bagaimana perangkat Windows 10 Mobile merutekan AID ke aplikasi tertentu karena pengguna dapat menginstal beberapa aplikasi HCE yang berbeda. Setiap aplikasi dapat mendaftarkan beberapa kartu berbasis HCE dan SIM.

Ketika pengguna mengetuk perangkat Windows 10 Mobile mereka ke terminal, data secara otomatis dirutekan ke aplikasi yang tepat yang diinstal pada perangkat. Perutean ini didasarkan pada ID applet (AID) yang merupakan pengidentifikasi byte 5-16. Selama ketukan, terminal eksternal akan mengirimkan perintah SELECT APDU untuk menentukan AID yang diinginkan agar semua perintah APDU berikutnya dirutekan. Perintah SELECT berikutnya, akan mengubah perutean lagi. Berdasarkan AID yang didaftarkan oleh aplikasi dan pengaturan pengguna, lalu lintas APDU dirutekan ke aplikasi tertentu, yang akan mengirim APDU respons. Ketahuilah bahwa terminal mungkin ingin berkomunikasi dengan beberapa aplikasi yang berbeda selama ketukan yang sama. Jadi, Anda harus memastikan tugas latar belakang aplikasi Anda keluar secepat mungkin saat dinonaktifkan untuk memberi ruang bagi tugas latar belakang aplikasi lain untuk merespons APDU. Kita akan membahas tugas latar belakang nanti dalam topik ini.

Aplikasi HCE harus mendaftarkan diri mereka dengan AID tertentu yang dapat mereka tangani sehingga mereka akan menerima APDUs untuk AID. Aplikasi mendeklarasikan AID dengan menggunakan grup AID. Grup AID secara konseptual setara dengan kartu fisik individu. Misalnya, satu kartu kredit dinyatakan dengan grup AID dan kartu kredit kedua dari bank yang berbeda dinyatakan dengan grup AID kedua yang berbeda, meskipun keduanya mungkin memiliki AID yang sama.

Resolusi konflik untuk grup AID pembayaran

Saat aplikasi mendaftarkan kartu fisik (grup AID), aplikasi dapat mendeklarasikan kategori grup AID sebagai "Pembayaran" atau "Lainnya." Meskipun dapat ada beberapa grup AID pembayaran yang terdaftar pada waktu tertentu, hanya salah satu grup AID pembayaran ini yang dapat diaktifkan untuk Tap dan Pay pada satu waktu, yang dipilih oleh pengguna. Perilaku ini ada karena pengguna mengharapkan untuk secara sadar memilih satu pembayaran, kredit, atau kartu debit untuk digunakan sehingga mereka tidak membayar dengan kartu yang tidak diinginkan yang berbeda saat mengetuk perangkat mereka ke terminal.

Namun, beberapa grup AID yang terdaftar sebagai "Lainnya" dapat diaktifkan secara bersamaan tanpa interaksi pengguna. Perilaku ini ada karena jenis kartu lain seperti loyalitas, kupon, atau transit diharapkan untuk hanya bekerja tanpa upaya atau meminta setiap kali mereka mengetuk ponsel mereka.

Semua grup AID yang terdaftar sebagai "Pembayaran" muncul dalam daftar kartu di halaman Pengaturan NFC, di mana pengguna dapat memilih kartu pembayaran default mereka. Saat kartu pembayaran default dipilih, aplikasi yang mendaftarkan grup AID pembayaran ini menjadi aplikasi pembayaran default. Aplikasi pembayaran default dapat mengaktifkan atau menonaktifkan salah satu grup AID mereka tanpa interaksi pengguna. Jika pengguna menolak permintaan aplikasi pembayaran default, maka aplikasi pembayaran default saat ini (jika ada) terus tetap sebagai default. Cuplikan layar berikut menunjukkan halaman Pengaturan NFC.

Cuplikan layar halaman pengaturan NFC

Menggunakan contoh cuplikan layar di atas, jika pengguna mengubah kartu pembayaran defaultnya ke kartu lain yang tidak terdaftar oleh "Aplikasi HCE 1," sistem membuat permintaan konfirmasi untuk persetujuan pengguna. Namun, jika pengguna mengubah kartu pembayaran defaultnya ke kartu lain yang terdaftar oleh "Aplikasi HCE 1", sistem tidak membuat permintaan konfirmasi untuk pengguna karena "Aplikasi HCE1" sudah menjadi aplikasi pembayaran default.

Resolusi konflik untuk grup AID non-pembayaran

Kartu non-pembayaran yang dikategorikan sebagai "Lainnya" tidak muncul di halaman pengaturan NFC.

Aplikasi Anda dapat membuat, mendaftarkan, dan mengaktifkan grup AID non-pembayaran dengan cara yang sama seperti grup AID pembayaran. Perbedaan utamanya adalah bahwa untuk grup AID non-pembayaran, kategori emulasi diatur ke "Lainnya" dibandingkan dengan "Pembayaran". Setelah mendaftarkan grup AID dengan sistem, Anda perlu mengaktifkan grup AID untuk menerima lalu lintas NFC. Ketika Anda mencoba mengaktifkan grup AID non-pembayaran untuk menerima lalu lintas, pengguna tidak dimintai konfirmasi kecuali ada konflik dengan salah satu AID yang sudah terdaftar dalam sistem oleh aplikasi yang berbeda. Jika ada konflik, pengguna akan dimintai informasi tentang kartu mana dan aplikasi terkait akan dinonaktifkan jika pengguna memilih untuk mengaktifkan grup AID yang baru terdaftar.

Koeksistensi dengan aplikasi NFC berbasis SIM

Di Windows 10 Mobile, sistem menyiapkan tabel perutean pengontrol NFC yang digunakan untuk membuat keputusan perutean di lapisan pengontrol. Tabel berisi informasi perutean untuk item berikut ini.

  • Rute AID individual.
  • Rute berbasis protokol (ISO-DEP).
  • Perutean berbasis teknologi (NFC-A/B/F).

Saat pembaca eksternal mengirim perintah "SELECT AID", pengontrol NFC terlebih dahulu memeriksa rute AID dalam tabel perutean untuk kecocokan. Jika tidak ada kecocokan, rute berbasis protokol akan digunakan sebagai rute default untuk lalu lintas ISO-DEP (14443-4-A). Untuk lalu lintas non-ISO-DEP lainnya, ia akan menggunakan perutean berbasis teknologi.

Windows 10 Mobile menyediakan opsi menu "KARTU SIM" di halaman NFC Pengaturan untuk terus menggunakan aplikasi berbasis SIM Windows Telepon 8.1 warisan, yang tidak mendaftarkan AID mereka dengan sistem. Jika pengguna memilih "kartu SIM" sebagai kartu pembayaran default mereka, maka rute ISO-DEP diatur ke UICC, untuk semua pilihan lain di menu drop-down rute ISO-DEP adalah ke host.

Rute ISO-DEP diatur ke "Kartu SIM" untuk perangkat yang memiliki kartu SIM berkemampuan SE saat perangkat di-boot untuk pertama kalinya dengan Windows 10 Mobile. Saat pengguna menginstal aplikasi yang diaktifkan HCE dan aplikasi tersebut mengaktifkan pendaftaran grup HCE AID, rute ISO-DEP akan diarahkan ke host. Aplikasi berbasis SIM baru perlu mendaftarkan AID dalam SIM agar rute AID tertentu diisi dalam tabel perutean pengontrol.

Membuat aplikasi berbasis HCE

Aplikasi HCE Anda memiliki dua bagian.

  • Aplikasi latar depan utama untuk interaksi pengguna.
  • Tugas latar belakang yang dipicu oleh sistem untuk memproses APDUs untuk AID tertentu.

Karena persyaratan performa yang sangat ketat untuk memuat tugas latar belakang Anda sebagai respons terhadap ketukan NFC, kami sarankan seluruh tugas latar belakang Anda diterapkan dalam kode asli C++/CX (termasuk dependensi, referensi, atau pustaka apa pun yang Anda andalkan) daripada C# atau kode terkelola. Meskipun C# dan kode terkelola biasanya berkinerja baik, ada overhead, seperti memuat .NET CLR, yang dapat dihindari dengan menulisnya di C++/CX.

Membuat dan mendaftarkan tugas latar belakang Anda

Anda perlu membuat tugas latar belakang di aplikasi HCE Anda untuk memproses dan merespons APDUs yang dirutekan oleh sistem. Selama pertama kali aplikasi Anda diluncurkan, latar depan mendaftarkan tugas latar belakang HCE yang mengimplementasikan antarmuka IBackgroundTaskRegistration seperti yang ditunjukkan dalam kode berikut.

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

Perhatikan bahwa pemicu tugas diatur ke SmartCardTriggerType. EmulatorHostApplicationActivated. Ini berarti bahwa setiap kali perintah SELECT AID APDU diterima oleh PENYElesaian OS ke aplikasi Anda, tugas latar belakang Anda akan diluncurkan.

Menerima dan menanggapi APDUs

Ketika ada APDU yang ditargetkan untuk aplikasi Anda, sistem akan meluncurkan tugas latar belakang Anda. Tugas latar belakang Anda menerima APDU yang diteruskan melalui properti CommandApdu objek SmartCardEmulatorApduReceivedEventArgs dan merespons APDU menggunakan metode TryRespondAsync dari objek yang sama. Pertimbangkan untuk menyimpan tugas latar belakang Anda untuk operasi ringan karena alasan performa. Misalnya, segera tanggapi APDUs dan keluar dari tugas latar belakang Anda saat semua pemrosesan selesai. Karena sifat transaksi NFC, pengguna cenderung memegang perangkat mereka terhadap pembaca hanya untuk waktu yang sangat singkat. Tugas latar belakang Anda akan terus menerima lalu lintas dari pembaca sampai koneksi Anda dinonaktifkan, dalam hal ini Anda akan menerima objek SmartCardEmulator Koneksi ionDeactivatedEventArgs. Koneksi Anda dapat dinonaktifkan karena alasan berikut seperti yang ditunjukkan dalam properti SmartCardEmulator Koneksi ionDeactivatedEventArgs.Reason.

  • Jika koneksi dinonaktifkan dengan nilai Koneksi ionLost, itu berarti bahwa pengguna menarik perangkat mereka dari pembaca. Jika aplikasi Anda memerlukan pengguna untuk mengetuk terminal lebih lama, Anda mungkin ingin mempertimbangkan untuk meminta mereka dengan umpan balik. Anda harus mengakhiri tugas latar belakang anda dengan cepat (dengan menyelesaikan penundaan Anda) untuk memastikan apakah mereka mengetuk lagi tidak akan tertunda menunggu tugas latar belakang sebelumnya keluar.
  • Jika koneksi dinonaktifkan dengan Koneksi ionRedirected, itu berarti bahwa terminal mengirim perintah SELECT AID baru APDU diarahkan ke AID yang berbeda. Dalam hal ini, aplikasi Anda harus segera keluar dari tugas latar belakang (dengan menyelesaikan penahanan Anda) untuk memungkinkan tugas latar belakang lain berjalan.

Tugas latar belakang juga harus mendaftar untuk peristiwa Dibatalkan pada antarmuka IBackgroundTaskInstance, dan juga dengan cepat keluar dari tugas latar belakang (dengan menyelesaikan penundaan Anda) karena peristiwa ini ditembakkan oleh sistem ketika selesai dengan tugas latar belakang Anda. Di bawah ini adalah kode yang menunjukkan tugas latar belakang aplikasi 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();
 }
}

Membuat dan mendaftarkan grup AID

Selama peluncuran pertama aplikasi Anda ketika kartu sedang disediakan, Anda akan membuat dan mendaftarkan grup AID dengan sistem. Sistem menentukan aplikasi yang ingin diajak bicara pembaca eksternal dan merutekan APDUs berdasarkan AID terdaftar dan pengaturan pengguna.

Sebagian besar kartu pembayaran mendaftar untuk AID yang sama, Lingkungan Sistem Pembayaran Kedekatan (PPSE), bersama dengan AID khusus kartu jaringan pembayaran tambahan. Setiap grup AID mewakili kartu dan ketika pengguna mengaktifkan kartu, semua AID dalam grup diaktifkan. Demikian pula, ketika pengguna menonaktifkan kartu, semua AID dalam grup dinonaktifkan.

Untuk mendaftarkan grup AID, Anda perlu membuat objek SmartCardAppletIdGroup dan mengatur propertinya untuk mencerminkan bahwa ini adalah kartu pembayaran berbasis HCE. Nama tampilan Anda harus deskriptif kepada pengguna karena akan muncul di menu pengaturan NFC serta permintaan pengguna. Untuk kartu pembayaran HCE, properti SmartCardEmulationCategory harus diatur ke Pembayaran dan properti SmartCardEmulationType harus diatur ke 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);

Untuk kartu HCE non-pembayaran, properti SmartCardEmulationCategory harus diatur ke Lainnya dan properti SmartCardEmulationType harus diatur ke 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);

Anda dapat menyertakan hingga 9 AID (masing-masing panjang 5-16 byte) per grup AID.

Gunakan metode RegisterAppletIdGroupAsync untuk mendaftarkan grup AID Anda dengan sistem, yang akan mengembalikan objek SmartCardAppletIdGroupRegistration. Secara default, properti ActivationPolicy dari objek pendaftaran diatur ke Dinonaktifkan. Ini berarti meskipun AID Anda terdaftar dengan sistem, AID belum diaktifkan dan tidak akan menerima lalu lintas.

reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);

Anda dapat mengaktifkan kartu terdaftar (grup AID) dengan menggunakan metode RequestActivationPolicyChangeAsync darikelas SmartCardAppletIdGroupRegistration seperti yang ditunjukkan di bawah ini. Karena hanya satu kartu pembayaran yang dapat diaktifkan pada satu waktu pada sistem, mengatur ActivationPolicy dari grup AID pembayaran ke Diaktifkan sama dengan mengatur kartu pembayaran default. Pengguna akan diminta untuk mengizinkan kartu ini sebagai kartu pembayaran default, terlepas dari apakah ada kartu pembayaran default yang sudah dipilih atau tidak. Pernyataan ini tidak benar jika aplikasi Anda sudah menjadi aplikasi pembayaran default, dan hanya berubah di antara grup AID-nya sendiri. Anda dapat mendaftarkan hingga 10 grup AID per aplikasi.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);

Anda dapat mengkueri grup AID terdaftar aplikasi Anda dengan OS dan memeriksa kebijakan aktivasi mereka menggunakan metode GetAppletIdGroupRegistrationsAsync.

Pengguna akan diminta saat Anda mengubah kebijakan aktivasi kartu pembayaran dari Dinonaktifkan menjadi Diaktifkan, hanya jika aplikasi Anda belum menjadi aplikasi pembayaran default. Pengguna hanya akan diminta ketika Anda mengubah kebijakan aktivasi kartu non-pembayaran dari Dinonaktifkan menjadi Diaktifkan jika ada konflik AID.

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

Pemberitahuan peristiwa saat kebijakan aktivasi berubah

Di tugas latar belakang, Anda dapat mendaftar untuk menerima peristiwa saat kebijakan aktivasi salah satu pendaftaran grup AID Anda berubah di luar aplikasi Anda. Misalnya, pengguna dapat mengubah aplikasi pembayaran default melalui menu pengaturan NFC dari salah satu kartu Anda ke kartu lain yang dihosting oleh aplikasi lain. Jika aplikasi Anda perlu mengetahui tentang perubahan ini untuk penyiapan internal seperti memperbarui petak peta langsung, Anda dapat menerima pemberitahuan peristiwa untuk perubahan ini dan mengambil tindakan di aplikasi Anda.

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

Perilaku penimpaan latar depan

Anda dapat mengubah ActivationPolicy dari salah satu pendaftaran grup AID Anda ke ForegroundOverride saat aplikasi Anda berada di latar depan tanpa meminta pengguna. Saat pengguna mengetuk perangkat mereka ke terminal saat aplikasi Anda berada di latar depan, lalu lintas dirutekan ke aplikasi Anda meskipun tidak ada kartu pembayaran yang dipilih oleh pengguna sebagai kartu pembayaran default mereka. Saat Anda mengubah kebijakan aktivasi kartu menjadi ForegroundOverride, perubahan ini hanya bersifat sementara sampai aplikasi Anda meninggalkan latar depan dan tidak akan mengubah kartu pembayaran default saat ini yang ditetapkan oleh pengguna. Anda dapat mengubah ActivationPolicy pembayaran atau kartu non-pembayaran dari aplikasi latar depan Anda sebagai berikut. Perhatikan bahwa metode RequestActivationPolicyChangeAsync hanya dapat dipanggil dari aplikasi latar depan dan tidak dapat dipanggil dari tugas latar belakang.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);

Selain itu, Anda dapat mendaftarkan grup AID yang terdiri dari AID 0 panjang tunggal yang akan menyebabkan sistem merutekan semua APDUs terlepas dari AID dan termasuk APDUs perintah apa pun yang dikirim sebelum perintah SELECT AID diterima. Namun, grup AID seperti itu hanya berfungsi saat aplikasi Anda berada di latar depan karena hanya dapat diatur ke ForegroundOverride dan tidak dapat diaktifkan secara permanen. Selain itu, mekanisme ini berfungsi baik untuk nilai Host dan UICC dari enumerasi SmartCardEmulationType untuk merutekan semua lalu lintas ke tugas latar belakang HCE Anda, atau ke kartu 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);

Periksa dukungan NFC dan HCE

Aplikasi Anda harus memeriksa apakah perangkat memiliki perangkat keras NFC, mendukung fitur emulasi kartu, dan mendukung emulasi kartu host sebelum menawarkan fitur tersebut kepada pengguna.

Fitur emulasi kartu pintar NFC hanya diaktifkan pada Windows 10 Mobile, jadi mencoba menggunakan API emulator kartu pintar di versi Windows 10 lainnya, akan menyebabkan kesalahan. Anda dapat memeriksa dukungan API kartu pintar dalam cuplikan kode berikut.

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

Anda juga dapat memeriksa untuk melihat apakah perangkat memiliki perangkat keras NFC yang mampu melakukan beberapa bentuk emulasi kartu dengan memeriksa apakah metode SmartCardEmulator.GetDefaultAsync mengembalikan null. Jika ya, maka tidak ada emulasi kartu NFC yang didukung pada perangkat.

var smartcardemulator = await SmartCardEmulator.GetDefaultAsync();<

Dukungan untuk perutean UICC berbasis HCE dan AID hanya tersedia pada perangkat yang baru diluncurkan seperti Lumia 730, 830, 640, dan 640 XL. Perangkat berkemampu NFC baru yang menjalankan Windows 10 Mobile dan setelahnya harus mendukung HCE. Aplikasi Anda dapat memeriksa dukungan HCE sebagai berikut.

Smartcardemulator.IsHostCardEmulationSupported();

Layar kunci dan perilaku matikan layar

Windows 10 Mobile memiliki pengaturan emulasi kartu tingkat perangkat, yang dapat diatur oleh operator seluler atau produsen perangkat. Secara default, tombol "ketuk untuk membayar" dinonaktifkan dan "kebijakan pengaktifan di tingkat perangkat" diatur ke "Always", kecuali MO atau OEM menimpa nilai-nilai ini.

Aplikasi Anda dapat mengkueri nilai EnablementPolicy di tingkat perangkat dan mengambil tindakan untuk setiap kasus tergantung pada perilaku aplikasi yang diinginkan di setiap status.

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";
}

Tugas latar belakang aplikasi Anda akan diluncurkan meskipun ponsel terkunci dan/atau layar mati hanya jika pembaca eksternal memilih AID yang diselesaikan ke aplikasi Anda. Anda dapat menanggapi perintah dari pembaca di tugas latar belakang Anda, tetapi jika Anda memerlukan input dari pengguna atau jika Anda ingin menampilkan pesan kepada pengguna, Anda dapat meluncurkan aplikasi latar depan Anda dengan beberapa argumen. Tugas latar belakang Anda dapat meluncurkan aplikasi latar depan Anda dengan perilaku berikut.

  • Di bawah layar kunci perangkat (pengguna akan melihat aplikasi latar depan Anda hanya setelah dia membuka kunci perangkat)
  • Di atas layar kunci perangkat (setelah pengguna menutup aplikasi Anda, perangkat masih dalam keadaan terkunci)
        if (Windows::Phone::System::SystemProtection::ScreenLocked)
        {
            // Launch above the lock with some arguments
            var result = await eventDetails.TryLaunchSelfAsync("app-specific arguments", SmartCardLaunchBehavior.AboveLock);
        }

Pendaftaran AID dan pembaruan lainnya untuk aplikasi berbasis SIM

Aplikasi emulasi kartu yang menggunakan SIM sebagai elemen aman dapat mendaftar dengan layanan Windows untuk mendeklarasikan AID yang didukung pada SIM. Pendaftaran ini sangat mirip dengan pendaftaran aplikasi berbasis HCE. Satu-satunya perbedaan adalah SmartCardEmulationType, yang harus diatur ke Uicc untuk aplikasi berbasis SIM. Sebagai hasil dari pendaftaran kartu pembayaran, nama tampilan kartu juga akan diisi di menu pengaturan NFC.

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