Expertiză · Aplicații mobile
Aplicații pentru telefon, construite astfel încât logica să poată fi verificată fără telefon.
Construim aplicații native iOS în Swift, cu senzori și HealthKit, și aplicații cu un singur cod pentru iOS, Android și web atunci când proiectul nu cere senzori. Nucleul de logică se testează separat de ecran.
Construit dejaSunt trei implementări proprii, nu una. Un depozit cu cinci ținte de aplicație (patru iOS și una macOS) definite în `project.yml`, ale cărui teste de logică le-am rulat azi: 160 din 160 trec. O a doua aplicație iOS, în alt proiect, cu 40 de fișiere Swift și HealthKit. Și o a treia direcție, cu un singur cod pentru iOS, Android și web, a cărei variantă web răspunde astăzi. Rezerva care schimbă răspunsul la întrebarea pe care o pune orice cumpărător înainte de toate: niciuna dintre aplicațiile noastre nu este publicată în App Store sau Google Play. Motivul e unul singur și are nume — `DEVELOPMENT_TEAM` este gol în configurația de proiect, adică lipsește identificatorul de echipă din Apple Developer Program. Mașina are o identitate de semnare validă, suficientă pentru instalare pe dispozitiv propriu, insuficientă pentru distribuție în magazin. E o problemă de cont, nu de cod, dar rămâne o problemă și o scriem aici, nu la subsol.
O aplicație mobilă are două părți care se strică diferit. Partea care citește senzorii și calculează ceva — un unghi, un scor, o stare — și partea care desenează ecrane. Le ținem separate, și nu din motive estetice: în depozitul nostru principal de iOS, fișierele de nucleu nu importă interfața, așa că pot fi compilate direct cu `swiftc` pe Mac și rulate ca un program obișnuit, fără simulator și fără telefon. Suita are 160 de verificări grupate în 16 etape; am rulat-o azi și trece integral. Asta e motivul pentru care putem spune ce face exact un algoritm, în loc să spunem că „funcționează bine”.
Pe iOS lucrăm în Swift 6, cu țintă minimă iOS 17. Același depozit definește cinci aplicații ca ținte separate: patru pentru iPhone și una pentru macOS, iar cea de macOS refolosește cincisprezece fișiere din nucleul celei de iOS, fără copiere. Senzorii se citesc la sursă: interfața Apple pentru senzorii din căști expune orientarea capului, iar aplicația compară unghiul curent cu o poziție pe care utilizatorul o calibrează la începutul sesiunii. Pragurile nu sunt „reglaje interne”: sub 7° e drept, între 7° și 13° e alunecare, peste 13° ținut trei secunde declanșează alerta, iar netezirea folosește o medie exponențială cu coeficientul 0,15. Toate cele patru valori stau în patru linii consecutive de cod și pot fi arătate.
Când proiectul nu are nevoie de senzori, nu recomandăm nativ. A treia direcție din portofoliu e un singur cod care se compilează pentru iPhone, Android și browser — React Native cu Expo — iar varianta web e publicată și răspunde azi. Diferența practică pentru client: un chestionar, un calculator sau un tablou de bord nu justifică două echipe și două depozite; o aplicație care ascultă un senzor la douăzeci de probe pe secundă, da.
Ce nu putem încă. Nicio aplicație a noastră nu e în App Store sau Google Play. Nu pentru că nu compilează — compilează, se instalează pe simulator și trece testele — ci pentru că în configurația de proiect identificatorul de echipă Apple e gol, adică nu există o înscriere în Apple Developer Program legată de aceste build-uri. Pe Mac există o identitate de semnare validă, de tip dezvoltare, care ajunge pentru instalare pe propriul dispozitiv și nu ajunge pentru magazin. Pentru un proiect de client, contul de dezvoltator se deschide pe firma clientului și rămâne al lui — asta e discuția care trebuie purtată la început, nu la final.