Belajar CoreNFC di iOS Swift
Oke karena saya baru dipinjami device dari kantor dan ada request untuk baca NFC pada KTP akhirnya saya mencoba feature CoreNFC di iOS yang dulu hanya support ApplePay wk wk …
Pertama kali searching mengenai CoreNFC kita akan dihadapkan beberapa penjelasan atau tutorial deteksi atau discover NFC dengan NFCNDEFReaderSession. Oke saat itu saya coba ikuti tutorial mengenai implementasi NFCNDEFReaderSession.
- Step pertama kita harus punya akun Developer berbayar (ini yang bikin programmer iOS di indonesia nggak banyak apa-apa harus bayar)
- Selanjutnya bikin New Project dan aktifkan Near Field Communinaction Tag Reading di Tab Signing & Capabilities
- Import CoreNFC pada halaman yang akan kita gunakan untuk deteksi NFC
- Implementasi method dan delegate protocol yang sudah disediakan, ikuti saja tutorial yang sudah ada :D
- Akhirnya kita coba untuk detect NFC pada KTP dan Taraaaaa …kok nggak detect wk wk ternyata impementasinya nggak semudah itu kawan
Setelah research lagi, baca-baca lagi ternyata NFCNDEFReaderSession itu digunakan untuk NFC tag umum setau saya atau ApplePay ya.
Disclaimer saya masih bingun pada part ini NDEF itu termasuk Tag Type Interface atau cuma format data
Next bagaimana kalau kita mau detect NFC dengan Tag Type Interface yang berbeda ? Oke di tahun 2017 bertepatan dengan release iOS 13 Apple menambahkan …eit menambahkan atau membuka API ya ? Oke kita anggap membuka API pada NFC (masa sekelas Apple belum pernah buat API NFC kayak yang ada di Android kalo di tutup biar ApplePay nya nggak ada yang ganggu mungkin :))
Pada iOS 13 CoreNFC membuka feature NFCTagReaderSession untuk membaca spesifik Tag Type Interface antara lain ISO 7816, ISO 15693, FeliCa™, and MIFARE® tags.
Oke kita sudah dapat info baru bagaimana kita bisa detect NFC pada KTP ternyata kita menggunakan API yang salah, lanjut kita implementasi sesuai tutorial yang ada. Step by step nya hampir sama hanya beda delegate protokol yang harus kita implementasi.
Yeay …setelah implementasi selesai mari kita coba.
Loh kok tetep Nggak detect …wk wk mari kita baca lagi dan pahami sedikit demi sedikit, Eh …ternyata kalau kita mau implementasi Tag Type Interface ISO 7816 dan ISO 18092 untuk FeliCa kita harus register AIDs di Info.plist
Oke kita tambahkan ke Info.plist
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>D2760000850101</string>
</array>
<key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
<array>
<string>12FC</string>
</array>
The moment of truth, kita coba lagi …Tet teret teretetet, semprul tetep nggak bisa apa HP nya atau NFC nya rusak ya, Fukkk.
Coba kita detect pake kartu lain, kita coba pake Mandiri e-money karena adanya itu dan dapet dari dikasih.
Eh bisa detect dong …tapi kok error. Pas di scan dapet kalo tipe NFC MiFare tapi nggak tau ini MiFate tipe apa (Tipe MiFare Classic, Plus, Ultralight, DESFire) pernah sekilas baca kalo CoreNFC nggak support tipe Classic kapan-kapan coba kita ulik lagi.
Oke karena Karena penasaran kenapa nggak bisa connect coba kita cari-cari lagi dan nemu cara baca UID stackoverflow
walaupun sebenernya sudah Failed — Stack Error waktu connect, tapi pas di implementasi keluar loh UID nya.
Oke research lagi ternyata kita bisa baca mifareFamily juga, coba kita implementasi dan di dapat kalo mifareFamily kita unknown Hmmm …
Dari dokumentasi Apple ada 4 tipe pada enum nya (.desfire, .plus, .ultralight, .unknown) sedangkan dari Wikipedia ada tipe classic juga karena saya cepat menyimpulkan :D saya anggap unknown itu classic, kalau dari dokumentasi Apple
An identifier that indicates a compatible ISO14443 Type A tag
Hmmm … saya masih bingung dengan maksudnya, Oke kita coba detect pake aplikasi Android NFC Tools
dan terbaca NXP MIFARE Classic 1k oke problem pertama selesai, jadi kartu Mandri e-money menggunakan MiFare tipe Classic. Pertanyaan selanjutnya dan kenapa nggak bisa connect dengan iPhone device ?Apakah karena menggunakan AIDs yang salah ?
Sebelum lanjut sebenernya apa itu AIDs, AIDs atau AID adalah Application ID dari kesimpulan yang saya baca AID itu ID yang digunakan oleh NFC yang diregistrasikan secara internasional atau lokal dan AID ada yang public dan ada yang non public. Beberapa AID public bisa kita baca pada halaman ini :
Nah nah pas saya search di list tersebut saya nggak menemukan AID buat Mandiri e-money atau e-KTP mungkin AID nya lokal nggak teregister secara internasional atau bersifat rahasia. Oke karena kita sudah install NFC Tools kita coba baca Tag Type Interface pada e-KTP dan hasilnya e-KTP menggunakan tipe NXP MIFARE DESFire, Hmmm oke kalau Mandiri e-money yang pakai MiFare Classic saja kedeteksi kenapa MiFare DESFire kok tidak ya ?
Oh iya pernah baca kalau kita mau detect MiFare DESFire kita nggak bisa kasih AIDs D2760000850101 di list, oke kita hapus dan coba lagi
To interact with ISO 7816 tags, add the list of the application identifiers supported in your app to the com.apple.developer.nfc.readersession.iso7816.select-identifiers information property list key. If you include the application identifier D2760000850101 — the identifier for the NDEF application on MIFARE DESFire tags (NFC Forum T4T tag platform) — and the reader session finds a tag matching this identifier, it sends the delegate an NFCISO7816Tag tag object. To get the MIFARE DESFire tag as an NFCMiFareTag object, don’t include D2760000850101 in the application identifier list.
dan tetep nggak bisa.
Kesimpulan awal saya
CoreNFC dengan spesifik Tag Type Interface (NFCTagReaderSession) harus meregisterkan spesifik AIDs pada Info.plist, jika kita nggak punya AIDs kita nggak bakalan bisa detect bahkan baca data pada NFC.
NFCNDEFReaderSession kemungkinan API yang sudah otomatis diregisterkan beberapa AIDs yang yang diijinkan oleh Apple untuk dibaca sehingga ketika kita menggunakan class tersebut kita tidak bisa membaca semua jenis kartu NFC.
NDEF adalah format data pada NFC
Kenapa Android bisa otomatis baca tapa AIDs, kemungkinan pada OS android AIDs selection sudah di handle oleh OS tapi juga bisa di setup secara manual untuk beberapa AIDs yang belum teregister pada OS nya
Kalau ada kesalahan dari penjelasan saya mohon dikoreksi gan biar kita bisa sama-sama belajar karena implementasi NFC di iOS dokumentasi nya masih agak kurang dan berbahasa inggris siapa tau ada temen-temen yang terbantu karena minimnya kemampuan berbahasa inggris seperti saya :)