Scroll Brake: come ho creato un blocco per iOS da 4 MB contro il doomscrolling
La storia di come la lotta ai loop di dopamina ha portato alla nascita di Scroll Brake, perché le app concorrenti chiedono permessi discutibili e come superare le trappole della Screen Time API di Apple.
La trappola dei 45 minuti
Prendo la produttività personale molto seriamente. Negli anni ho messo a punto un mio metodo di gestione del tempo e delle energie che dà ritmo alle mie giornate e mi consente di portare a termine progetti software complessi.
Eppure arrivano quei momenti in cui afferri lo smartphone con il pilota automatico e ti ritrovi a scorrere senza sosta i Reels su Instagram. Un breve video, un secondo, un terzo… l'algoritmo distribuisce una serie ininterrotta di contenuti coinvolgenti. Pensavi di staccare due minuti per riprendere fiato, e improvvisamente sono svaniti 40 minuti o un'ora intera. Gli algoritmi di raccomandazione sono progettati da ingegneri di altissimo livello per catturare l'attenzione umana a qualunque costo. Ogni swipe appare impercettibilmente più appagante del precedente, intrappolando il cervello in un loop di dopamina infinito.
Non avevo la minima intenzione di programmare una mia applicazione. Come sviluppatore e fondatore, il mio tempo è prezioso e preferisco di gran lunga affidarmi a strumenti collaudati. Sono quindi andato dritto sull'App Store.
Cosa non funziona nei moderni app blocker
Ho messo alla prova i protagonisti della categoria — Opal, OneSec, ScreenZen, Refocus, insieme alla funzione nativa Tempo di utilizzo di Apple. Quasi all'istante mi sono scontrato con scelte architetturali e di design che mi hanno lasciato perplesso:
Il paradosso delle notifiche push
Praticamente tutte queste applicazioni esordiscono chiedendo permessi per notifiche push e tracciamento analitico. Perché mai un'applicazione concepita per allontanarmi dallo smartphone dovrebbe risvegliare il display con dei banner? Come ho compreso in seguito durante lo sviluppo, non si trattava di malafede degli sviluppatori, ma di un vincolo storico del sistema iOS che spiego nel dettaglio nella sezione tecnica.
Schermate di abbonamento aggressive
Prima ancora di aver visto la schermata principale o di aver verificato se l'app risolva effettivamente il problema, vieni investito da un'aggressiva schermata di pagamento. Mascherata dietro un «periodo di prova gratuito» congegnato nella speranza che l'utente dimentichi di annullare il rinnovo. Da imprenditore comprendo le dinamiche di conversione; da utente trovo questi dark pattern inaccettabili.
L'inefficacia del Tempo di utilizzo integrato di Apple
La funzione nativa di Apple fallisce sul piano della psicologia umana. Quando appare la schermata di blocco di sistema, il pollice preme in modo del tutto meccanico su «Ignora il limite per 15 minuti». Non c'è alcun attrito cognitivo: l'azione è interamente guidata dalla memoria muscolare.
Non avevo alcuna intenzione di passare al setaccio decine di cloni con abbonamenti ricorrenti identici. Ho capito che realizzare per me stesso uno strumento leggero e nativo sarebbe stato più veloce e infinitamente più onesto.
I principi di Scroll Brake: 4 MB, zero tracker, niente abbonamento
In NovaSynapse seguiamo un principio fondamentale: « Tutto ciò di cui hai bisogno. Niente di superfluo. » Un buon software deve risolvere il problema, preservare l'autonomia della batteria e rispettare lo spazio dell'utente.
È su queste basi che è nato Scroll Brake:
- Circa 4 MB di spazio occupato: Niente framework multipiattaforma pesanti, zero WebView, nessun SDK esterno di tracciamento.
- 100% Privacy-First: Nessun account utente, nessun database, nessun server remoto. Tutto viene eseguito in locale sul dispositivo sfruttando le API native di iOS.
- Attrito cognitivo invece di divieti ciechi: Per prolungare la permanenza in un'app bloccata, è necessario attivare la corteccia prefrontale risolvendo una breve operazione matematica. Quel singolo secondo di sforzo consapevole spezza la modalità automatica.
- Design anti-dopamina senza gamification: Dopo aver risolto l'operazione non compaiono coriandoli, animazioni festive o messaggi trionfanti. Premiare il cervello con dopamina a buon mercato per aver sbloccato i social non ha senso. La schermata rimane volutamente essenziale e tranquilla: il tempo viene concesso e il ritorno avviene tramite la freccia indietro nativa di iOS in alto a sinistra (per motivi di privacy, iOS non comunica all'app principale quale applicazione abbia fatto scattare il blocco, impedendo qualsiasi reindirizzamento automatico).
- Modello di prezzo trasparente: Fino a 3 regole sono completamente gratuite per sempre (personalmente ne uso una sola: categoria «Social network» limitata a 5 minuti al giorno). Chi ha bisogno di più regole paga una sola volta per una licenza a vita (Lifetime), senza abbonamenti periodici obbligati.
Sviluppato in 4 giorni: IA e strumenti Xcode
Ho sviluppato l'app con l'assistenza dell'intelligenza artificiale, impiegando Antigravity e i modelli Gemini 3.1 Pro e Flash.
Avevo già esperienza nello sviluppo mobile con Flutter e iOS nativo, ma risaliva all'epoca precedente alla diffusione dei coding assistant. Con l'IA, completare un'applicazione così mirata e leggera è stato straordinariamente rapido. Naturalmente non si può accettare ciecamente il codice generato: le estensioni di sistema di Apple sono particolarmente delicate, per cui ho esaminato ogni singola riga di persona per escludere crash e perdite di memoria. L'intero sviluppo, compresi i test manuali su dispositivi fisici e versioni precedenti di iOS, ha richiesto appena 3 o 4 giorni lavorativi:
- Icona pronta in 15 minuti: Invece di esportare a mano decine di livelli PNG, ho usato il tool per sviluppatori di Xcode Icon Composer. I livelli vettoriali si adattano automaticamente agli stili chiaro, scuro e colorato di iOS.
- Revisione dell'App Store in meno di 24 ore: Non contenendo SDK di terze parti e non raccogliendo dati personali, Apple ha approvato la build già il giorno successivo.
Deep-dive tecnico: le insidie della Screen Time API
Veniamo alla parte centrale: l'architettura imperniata sul trio ManagedSettings, DeviceActivity e FamilyControls. Chi sviluppa con la Screen Time API di Apple si imbatte prima o poi in tre limiti strutturali del sistema. Ecco come li ho superati:
Perché i concorrenti ricorrono alle notifiche push (iOS < 26.5 vs iOS 26.5+)
Gli utenti criticano spesso le notifiche invadenti dei vari app blocker, ma per molto tempo gli sviluppatori sono rimasti bloccati nella sandbox di Apple.
- Il vecchio limite di sistema:
Quando un'applicazione viene bloccata, il sistema mostra l'interfaccia protettiva tramite ShieldActionExtension. Se l'utente tocca un'azione come «Estendi», questa estensione gira in una sandbox limitata in cui la chiamata a UIApplication.shared.open è rigorosamente proibita sia dal compilatore che dal sistema operativo. L'enum ShieldActionResponse prevedeva in passato soltanto .close, .defer e .none. Non esisteva alcun modo legittimo per aprire l'app principale e mostrare un quesito o una sfida!
- L'espediente del settore:
L'unica scappatoia consisteva nel generare una notifica push locale con UNUserNotificationCenter. L'utente doveva toccare il banner per accedere all'app. Ecco spiegato il motivo per cui quasi ogni blocker sull'App Store richiede l'autorizzazione per le notifiche.
- La soluzione nativa a partire da iOS 26.5+:
Apple ha finalmente introdotto il caso ShieldActionResponse.openParentalControlsApp. Quando viene restituito, il sistema avvia all'istante l'applicazione principale mostrando direttamente la vista del calcolo matematico (MathPuzzleView):
// ShieldActionExtension.swift
defaults?.set(true, forKey: "launchedFromShieldAction")
completionHandler(.openParentalControlsApp)
Impostando iOS 26.5+ come base minima di rilascio (IPHONEOSDEPLOYMENTTARGET = 26.5), ho potuto fare a meno di qualsiasi trucco basato su notifiche push.
L'isolamento della sandbox sui dati di utilizzo
Mi viene spesso chiesto: «Perché l'app non include grafici di utilizzo dettagliati minuto per minuto?»
La risposta è netta: Apple isola completamente i dati di Screen Time dall'applicazione host.
- L'accesso alla raccolta
DeviceActivityResultsè riservato in esclusiva a DeviceActivityReportExtension, che viene eseguita in un processo di sistema isolato. - L'applicazione principale incorpora esclusivamente un contenitore visivo: DeviceActivityReport. Tale componente viene renderizzato fuori dal processo principale (out-of-process) e proiettato sull'interfaccia dell'app.
- I dati grezzi non escono mai dalla sandbox dell'estensione: l'applicazione host non può scriverli in un database SQLite, serializzarli o trasmetterli tramite rete.
La documentazione ufficiale di Apple è inequivocabile:
« Per proteggere la privacy dell'utente, l'estensione DeviceActivityReport viene eseguita in una sandbox e i suoi dati non lasciano l'estensione. Al suo posto, l'estensione crea e restituisce viste che la tua app visualizza. »
- Impatto sul monitoraggio:
Il controllo dei limiti con DeviceActivityCenter funziona unicamente secondo una logica di sottoscrizione a soglie (DeviceActivityEvent.threshold). Il sistema notifica DeviceActivityMonitorExtension solo nel momento in cui la soglia viene superata (eventDidReachThreshold), senza inviare dati continui sull'utilizzo.
- Perché si torna indietro dalla barra di stato:
In iOS, l'applicazione host non ha alcun modo di conoscere il bundleIdentifier dell'app bloccata. Non è quindi possibile reindirizzare via codice l'utente a Instagram o TikTok. Il rientro avviene semplicemente toccando la freccia di ritorno predisposta da iOS in alto a sinistra.
Soluzione ai bug critici della Screen Time API
Durante le sessioni di test più intense sono emersi alcuni comportamenti anomali di iOS capaci di compromettere l'affidabilità di qualsiasi app blocker:
Il bug della memorizzazione eventi in DeviceActivityCenter
- Il problema: Quando si aggiornava la soglia per un
DeviceActivityNamepreesistente durante un prolungamento di tempo, iOS spesso non reagiva al nuovo limite. - La soluzione: Generare un identificatore univoco dotato di token di sessione
DeviceActivityName("limit, preceduto da una chiamata esplicita a") stopMonitoring(). - Documentazione Apple: DeviceActivityCenter.startMonitoring.
deviceActivityCenter.stopMonitoring([previousActivityName])
let newActivity = DeviceActivityName("limit_\(UUID().uuidString)_\(sessionToken)")
try deviceActivityCenter.startMonitoring(newActivity, during: schedule, events: events)
L'errore di azzeramento del giorno successivo (Dual-Event Schedule)
- Il problema: Se un DeviceActivitySchedule veniva impostato con
repeats: truee l'utente estendeva il tempo di 1 minuto, il mattino successivo il sistema applicava per sbaglio la stessa soglia ridotta da 1 minuto invece di ripristinare l'intero limite giornaliero. - La soluzione: Registrare due eventi separati all'interno della medesima pianificazione:
mainEvent: il limite giornaliero completo previsto per l'indomani.extEvent: un evento temporaneo con la data odierna inserita nell'identificatore, impostato per scadere alle 23:59.
Crash OOM (Codice 11) in DeviceActivityReport
- Il problema: Inserire timer reattivi (come contatori al secondo in SwiftUI) nella gerarchia grafica di
DeviceActivityReportforzava continui ricalcoli XPC dei dati settimanali. Ciò causava rapide perdite di memoria e l'arresto improvviso del processo da parte di iOS per errore Out-Of-Memory (codice 11). - La soluzione: Rimuovere totalmente i timer reattivi dalle viste che includono i report, fissare i parametri di filtro senza continue modifiche e ricaricare i dati unicamente in corrispondenza degli eventi del ciclo di vita (
onAppear,willEnterForeground).
La mia configurazione personale
Dal giorno del rilascio, Scroll Brake è diventato la mia principale protezione contro le distrazioni continue.
Ecco come l'ho impostato per il mio uso:
- 1 regola: categoria «Social network» bloccata.
- Limite di base: 5 minuti al giorno.
- Prolungamento: 5 minuti concessi per ciascuna operazione risolta.
- Massimo prolungamenti: 5 volte al giorno al massimo.
Ne consegue che non posso trascorrere più di 25 minuti complessivi al giorno sui social. Ma l'effetto più prezioso riguarda l'atteggiamento mentale: il cervello ha imparato che visualizzare un video comporta un piccolo costo di attenzione. In 8 casi su 10, questa modesta barriera è sufficiente per posare il telefono e tornare a concentrarsi sulle cose importanti.