Projekat 12 · Identitet i dokumenti
React Native moduli za čipove u pasošima i POS terminale
Na dva projekta protokol za hardver napisao sam nativno i React Nativeu dao jedan API za njega: za NFC čip u njemačkom pasošu i za preko 100 platnih terminala.
100+ terminala
glavna brojka
1 ograničenje
Ni za čip u pasošu ni za platni terminal nije postojala biblioteka vrijedna upotrebe.
Priča u 5 koraka
Stack
- Java
- Kotlin
- Swift
- Turbo Modules
- React Native
- Android
- NFC / ICAO 9303
01 · Kontekst
Dvaput sam morao natjerati React Native da komunicira s hardverom za koji nije postojala biblioteka vrijedna upotrebe: s NFC čipom u njemačkom pasošu i s kineskim platnim terminalom na Androidu.
Dvaput sam morao natjerati React Native da komunicira s hardverom za koji nije postojala biblioteka vrijedna upotrebe: s NFC čipom u njemačkom pasošu i s kineskim platnim terminalom na Androidu.
U oba slučaja protokol sam implementirao u nativnom jeziku platforme i JavaScriptu dao uzak sloj, pa su detalji platforme ostali izvan JavaScript koda. Razlika je bila u onome što je tražio svaki od tih uređaja.
02 · Nije se smjelo mijenjati
React Native radi dobro dok aplikaciji ne zatreba nešto što platforma može, a do čega JavaScript ne dopire.
React Native radi dobro dok aplikaciji ne zatreba nešto što platforma može, a do čega JavaScript ne dopire.
Čitanje e-pasoša znači implementirati protokol ICAO 9303, koji traži handshake za autentikaciju prije nego što čip vrati bilo kakve podatke. Godine 2020. za njega nije postojala upotrebljiva biblioteka.
S kineskim platnim terminalom bilo je još teže, jer je dokumentacija za njegov SDK bila oskudna i napisana na španskom. Preveo sam je da bih s uređajem uopšte mogao raditi.
U oba slučaja sav je posao bio u sloju između nativnog koda i JavaScripta. Greška u tom sloju osjetila bi se u svakoj funkcionalnosti koja bi se kasnije gradila na njemu.
03 · Šta sam uradio
Čitač pasoša (2020). Protokol čipa implementirao sam u Javi za Android, istu logiku prenio u Swift za iOS i izložio je React Nativeu kroz Turbo Module.
Čitač pasoša (2020). Protokol čipa implementirao sam u Javi za Android, istu logiku prenio u Swift za iOS i izložio je React Nativeu kroz Turbo Module. Turbo Modules su tada još bili eksperimentalni dio nove arhitekture, morali su se ručno registrovati i imali su oskudnu dokumentaciju.
Najvažnija odluka bila je da istu logiku prenesem, umjesto da drugu implementaciju pišem od nule. Dvije nezavisne implementacije ovakvog protokola s vremenom se razilaze: granične slučajeve počnu tretirati različito, pa isti pasoš prođe na jednom telefonu, a padne na drugom. U verifikaciji identiteta to znači da se prema osobi s dokumentom postupa različito, zavisno od telefona koji ima.
Pročitane podatke dekodirao je vanjski servis, a moj dio bio je čitanje podataka s čipa.
Platni terminal (2022). Funkcije terminala za kartice, štampač i hardver izložio sam React Nativeu kroz Turbo Module u Javi. Zatim sam u Kotlinu napisao launcher koji je zamijenio početni Android ekran i zaključao uređaj na jednu aplikaciju.
Na uređaju koji isplaćuje gotovinu zaključavanje je bilo pitanje kontrole: osoba za pultom ne smije moći otvoriti browser, instalirati bilo šta ili promijeniti neku postavku. Zaključavanje se isplatilo i drugi put, jer se uređaj zaključan na jednu aplikaciju koju kontrolišete može ažurirati preko mreže. Više od sto terminala ažurirano je bez ijednog odlaska na lokaciju. Aplikacija je u object storageu provjeravala ima li nove verzije, a kad ažuriranje ne bi uspjelo, ništa se ne bi desilo: aplikacija je nastavljala raditi i ponavljala pokušaj svakih pet minuta dok ne uspije.
Svaki terminal bio je registrovan u admin dashboardu, koji je prikazivao njegovu aktivnost od trenutka povezivanja do toga ko je izdao koji kupon.
Termalno štampanje. Štampač za račune ne zna za slike, fontove ni raspored: štampa samo tačke. Logo se mora pretvoriti u bitmapu i ručno pozicionirati, u jedinicama papira i bez ikakvog pregleda. Zvuči trivijalno, ali jedini način da se to uradi jeste da se štampa i mjeri.
04 · Rezultat
Kriptografski potpisani podaci iz pasoša pročitani s čipa na obje platforme, iz jedne implementacije protokola
- Kriptografski potpisani podaci iz pasoša pročitani s čipa na obje platforme, iz jedne implementacije protokola
- Preko 100 platnih terminala zaključanih na jednu aplikaciju i ažuriranih preko mreže
- Neuspjela ažuriranja koja nisu ništa koštala: terminal je nastavljao raditi i ponovo pokušavao
05 · Šta bih uradio drugačije
Na modulu za pasoš Java implementaciju sam ručno prenio u Swift i provjerio je testiranjem.
Na modulu za pasoš Java implementaciju sam ručno prenio u Swift i provjerio je testiranjem. Trebao sam napraviti zajednički skup testnih vektora za protokol, odnosno poznatih ulaza s očekivanim izlazima, i pokrenuti ga nad obje implementacije. Testirati da se dvije implementacije ponašaju isto nije isto što i testirati da su ispravne. Ja sam uradio prvo, a vjerovao sam da sam uradio drugo.
Povezane usluge
Usluge koje se oslanjaju na ovaj projekat.
- Mobilne aplikacijeHardver u React NativeuPOS terminali s Androidom za prekogranične novčane doznake, 2022. Funkcije za kartice, štampač i ostali hardver React Native poziva preko Turbo Modulea, a launcher napisan u Kotlinu zaključava svaki uređaj na jednu aplikaciju.
- Regulisani i osjetljivi sistemiVerifikacija identiteta i KYCNFC čip u njemačkim pasošima, očitan iz React Native aplikacije.
- Mobilne aplikacijeOffline-first aplikacijeViše od stotinu terminala ažuriranih preko mreže. Kad ažuriranje nije uspjelo, ništa se nije promijenilo: terminal je radio dalje i pokušavao ponovo svakih pet minuta.
- Backend, podaci i integracijeZakazani poslovi i logika naplateAžuriranja platnih terminala preko mreže, koja su se ponavljala svakih pet minuta dok ne uspiju, a terminal je za to vrijeme normalno radio.
Povezani tekstovi
Tekstovi nastali iz ovog projekta.
- 26 AUG 2026 · 5 minŠtampanje logoa na termalnom štampaču za priznanice iz React NativeaTermalni štampač prima samo tačke, pa logo mora postati jednobitna bitmapa, spakovana po osam tačaka u bajt i ručno pozicionirana u jedinicama papira, bez pregleda prije štampe.
- 12 AUG 2026 · 5 minČitanje NFC čipa u pasošu iz React NativeaGodine 2020. za to nije postojala upotrebljiva biblioteka. Nativni modul u Javi, ista logika prenesena u Swift i jedan zajednički interfejs kroz Turbo Module.
Projekat 12
Radite na sličnom problemu? Odgovaramo u roku od jednog radnog dana.
Prvi poziv traje 30 minuta i ni na šta vas ne obavezuje.