Situație inițială: avem o aplicație iOS pentru controlul accesului la evenimente. În prezent, biletele sunt verificate printr-un server, motiv pentru care există o coadă la locurile cu internet slab. Trebuie să creăm un modul intern iOS SDK care ne va permite să validăm biletele complet offline și să sincronizăm rezultatele mai târziu. Mediu tehnic și domeniu: iOS 15+, Swift 5.9+, Xcode 15+, SPM. Scanare - AVFoundation. Stocare - CoreData sau SQLite (vom discuta, dar trebuie să lucrăm offline și să fim rezistenți la blocări). Criptografie - CryptoKit. Formatul biletului este QR, în interiorul încărcăturii utile base64url sub formă de JSON. Validare - verificarea semnăturii Ed25519 și verificarea regulilor (eveniment, dată, zonă, reutilizare). Care ar trebui să fie rezultatul: 1) Pachetul Swift (SPM) cu un API public care poate fi conectat la aplicația noastră. 2) Exemplu de integrare (țintă demonstrativă mică sau aplicație eșantion în interiorul depozitului) doar pentru a afișa apelurile API și fluxul de date. 3) Un set de teste unitare și teste de performanță de bază pentru părțile critice (analizarea, validarea, înregistrarea evenimentelor). Cerințe funcționale: 1) Scanare QR prin AVFoundation cu suport de flux continuu - returnarea rezultatului sub forma unui obiect structurat (ticketId, eventId, zoneId, issuedAt, validFrom, validTo, signature). 2) Validare offline - verificarea semnăturii Ed25519 folosind cheia publică a evenimentului, verificarea ferestrei și fusului orar, protecție împotriva reutilizarii biletelor pe un dispozitiv (antireutilizare locală). 3) Coada de evenimente - toate încercările și deciziile de scanare (acceptate/refuzate + motiv) sunt scrise în stocarea locală și pot fi încărcate ulterior în loturi. 4) Sincronizare - o metodă SDK care acceptă un callback/protocol pentru a trimite un pachet către API-ul nostru (avem propriul strat de rețea, deci SDK-ul nu ar trebui să impună o anumită bibliotecă HTTP). Ar trebui să existe retransmiteri, deduplicare și marcare a evenimentelor trimise cu succes. 5) Managementul cheilor - capacitatea de a actualiza un set de publicchei private (de exemplu, chei pentru mai multe eventIds) prin configurație și salvate local. Trebuie să existe o versiune a configurației și o înlocuire sigură, fără a pierde capacitatea de a verifica biletele emise anterior. Limitări: 1) Lucrează strict offline la scanare - fără solicitări de rețea în momentul scanării. 2) Nu puteți utiliza SDK-uri grele de la terți pentru scanare sau baze de date - doar cadre standard Apple sau dependențe foarte ușoare prin SPM, conform acordului. 3) API-ul public al pachetului ar trebui să fie minim și documentat în comentarii (SwiftDoc). 4) Codul trebuie să fie compatibil cu iOS 15 și versiuni ulterioare, fără API privat. Criterii de acceptare (măsurabile): 1) Validarea unui bilet corect cu verificarea semnăturii nu durează mai mult de 30 ms pe iPhone 12 în versiunea de lansare, cu o medie de 100 de rulări. 2) SDK-ul respinge corect cel puțin 6 tipuri de erori cu coduri/motive clare - semnătură incorectă, expirată, încă neactivă, zonă invalidă, reutilizare, eventId/cheie necunoscută. 3) După 500 de scanări offline, toate evenimentele sunt disponibile în coadă și nu se pierd atunci când aplicația este forțată să se termine (ucide) și apoi repornită. 4) Testele unitare acoperă cel puțin 70% din logica de analiză/validare/cozi de așteptare (folosind acoperirea Xcode). 5) Integrarea eșantionului demonstrează: pornirea scanerului, obținerea rezultatului, apelarea validare, înregistrarea unui eveniment și pornirea sincronizării. Etape de implementare: 1) Clarificarea formatului payload și a protocolului de sincronizare, fixarea SDK-ului public API. 2) Implementare de bază - parser, verificare criptografică, reguli de validare. 3) Implementarea cozii de stocare și evenimente + deduplicare. 4) Integrarea scannerului, eșantion, teste și optimizare. Vom furniza: exemple QR de încărcare utilă, chei de testare Ed25519, specificații API simulate pentru încărcarea evenimentelor și o listă de reguli de afaceri în funcție de zonă/oră.