— Caso Studio · Mobile & Full-Stack

Tap.me.
Una codebase,
tre piattaforme

Abbiamo portato sull'App Store l'app di un'associazione no-profit senza riscriverla, senza un Mac e senza costi infrastrutturali aggiuntivi — unificando tre canali di notifiche push su un unico backend.

1Codebase · 3 piattaforme
5Lingue, con RTL
0€Infrastruttura aggiunta
<3'Da git push a IPA firmata
Il Contesto

Un saluto, un tap

Tap.me, sviluppata per l'Associazione Anna e Marco E.T.S., ha un proposito semplice e umano: mandare un saluto alle persone care con un solo tocco. Un tap, e tutti i contatti ricevono una notifica con il tuo messaggio.

L'app era già sul Play Store come PWA (Trusted Web Activity) con backend Node.js e notifiche Web Push. Il problema: metà degli utenti potenziali ha un iPhone, e su iOS quella tecnologia non arriva sull'App Store. Serviva una vera app nativa.

La Sfida

Quattro vincoli, zero scorciatoie

01 · Niente riscrittura

Una precedente riscrittura in React Native era arrivata a TestFlight dopo 33 build: due codebase da mantenere per sempre. Serviva un'altra strada.

02 · Push native

Le Web Push non funzionano nelle app iOS: andava integrato APNs lato app e lato server, senza rompere i canali esistenti.

03 · Niente Mac

Sviluppo, firma del codice e distribuzione interamente in cloud, senza hardware Apple.

04 · Conformità App Store

Cancellazione account in-app, dichiarazione DSA per l'UE, export compliance, certificati e provisioning.

La Soluzione

Un bridge nativo, non una riscrittura

Abbiamo impacchettato la web app esistente in un guscio nativo con Capacitor: stessa identica interfaccia, stesso codice, con un bridge JavaScript che — solo quando l'app gira su iOS — sostituisce le Web Push con le notifiche native APNs, apre i link esterni fuori dall'app e aggiunge il feedback aptico. Sul web e su Android il codice resta invariato.

architettura.txt
┌─ FRONTEND — una sola codebase ────────────────────┐
│  HTML/CSS/JS vanilla · i18n 5 lingue · RTL        │
│  bridge nativo condizionale (Capacitor)           │
└──────┬──────────────┬──────────────┬──────────────┘
       │              │              │
   PWA / TWA     App iOS        Browser
   Play Store    App Store         Web
       │              │              │
┌──────┴──────────────┴──────────────┴──────────────┐
│  BACKEND — Node.js / Express su Railway           │
│  MongoDB · JWT · bcrypt · rate limiting           │
│  push a 3 canali: Web Push · APNs · FCM└───────────────────────────────────────────────────┘

La build iOS avviene interamente in cloud con Codemagic (macOS M2): firma automatica via App Store Connect API, numerazione build incrementale e upload diretto a TestFlight. Dal push su GitHub all'app installabile, nessun Mac coinvolto.

Il Lavoro

Problemi notevoli risolti

01

Push multi-canale. Il server sceglie per ogni dispositivo il canale giusto: Web Push (VAPID) per le PWA, APNs diretto (HTTP/2, token-based) per iOS, FCM come canale legacy — con pulizia automatica di token e subscription scadute.

02

Cache che congelava gli aggiornamenti. Il service worker serviva il codice dalla cache e gli utenti restavano su versioni vecchie anche dopo i deploy. Risolto con strategia network-first e fallback offline.

03

Recupero password senza email né SMS. Gli account sono identificati dal solo numero di telefono. Soluzione a costo zero: il codice di reset arriva come notifica push sui dispositivi registrati, con hash bcrypt e scadenza a 15 minuti.

04

Prefissi internazionali retrocompatibili. Numeri esteri supportati preservando il matching dei numeri italiani già in produzione — senza migrazione del database.

05

Conformità Apple. Cancellazione account in-app (Guideline 5.1.1), dichiarazione DSA, export compliance, safe-area per notch e home indicator: i dettagli che separano un'approvazione da un rifiuto.

Registro SIAE

Il software Tap.me è depositato presso il Registro Pubblico Speciale per i Programmi per Elaboratore (SIAE) — registrazione n. D000029673 del 29/05/2026, titolare dei diritti Associazione Anna e Marco E.T.S. Andrea Di Leo figura tra gli autori registrati del programma.

Risultato

Deploy continuo su tre fronti

Gli aggiornamenti web e Android vanno in produzione con un git push e raggiungono gli utenti alla prima riapertura dell'app; iOS segue con una build cloud automatica su TestFlight. Un'unica squadra, un'unica codebase, tre piattaforme allineate.

JavaScriptCapacitor 8Node.jsExpress MongoDBAPNsWeb PushFCM RailwayCodemagic CI/CDGitHubPWA / TWA

Hai un progetto simile? Parliamone →