Il permesso di accesso al calendario è un meccanismo dei sistemi operativi mobili che protegge i dati del calendario dell'utente da letture e modifiche non autorizzate. Su iOS, l'accesso al calendario è implementato tramite il framework EventKit con le classi EKEventStore e EKCalendar, mentre su Android — tramite i permessi READ_CALENDAR e WRITE_CALENDAR in combinazione con l'API CalendarContract. Secondo la Apple Developer Documentation, 2025, per accedere al calendario su iOS 18+ è necessaria una richiesta esplicita tramite il dialogo di sistema. EventKit fornisce un'interfaccia unificata per leggere e creare eventi su tutti i calendari connessi.
Punti chiave
Il permesso di accesso al calendario è un meccanismo di protezione dei dati personali che controlla la lettura e la scrittura di eventi nelle applicazioni di calendario del dispositivo. Il calendario contiene informazioni sensibili: riunioni, scadenze, promemoria e piani personali — pertanto i sistemi operativi mobili classificano l'accesso ad esso come critico.
Su iOS, l'accesso al calendario è regolato dal framework EventKit. Un'app può richiedere l'accesso in lettura e scrittura agli eventi e l'utente può concedere o negare la richiesta tramite un dialogo di sistema. Su Android, la protezione si basa su due permessi runtime: READ_CALENDAR e WRITE_CALENDAR.
Secondo uno studio del Pew Research Center (2024), circa il 45% degli utenti di dispositivi mobili utilizza regolarmente il calendario e il 62% di loro nega l'accesso alle app che non spiegano il motivo della richiesta dei dati del calendario.
Il principio chiave — un'app dovrebbe richiedere l'accesso solo per funzionalità direttamente correlate al calendario: creare promemoria, sincronizzare eventi, importare programmi.
Su iOS, l'accesso al calendario e ai promemoria è fornito tramite un unico framework — EventKit. La classe centrale EKEventStore gestisce tutte le operazioni: richiedere il permesso, leggere eventi, creare e modificare voci del calendario. Alla prima chiamata a requestAccess(to:entityType:), il sistema mostra un dialogo nativo con una spiegazione.
La classe EKEventStore è il punto di ingresso al sottosistema del calendario iOS. Per richiedere l'accesso, è necessario chiamare il metodo requestAccess(to: .event), passando il tipo di entità (evento o promemoria). Dopo aver ottenuto il permesso, EKEventStore fornisce l'accesso a tutti i calendari connessi a iCloud, Google, Exchange e altri provider.
Una caratteristica importante: EKEventStore è un oggetto pesante — la sua creazione richiede tempo e consuma risorse. Si consiglia di inizializzarlo una volta e riutilizzarlo per tutto il ciclo di vita dell'applicazione. Secondo la WWDC Session 10117 (2024), Apple raccomanda di memorizzare nella cache l'istanza di EventStore per ottimizzare le prestazioni.
iOS non separa i permessi di lettura e scrittura del calendario — l'utente concede l'accesso completo o lo nega. Tuttavia, l'app può controllare le operazioni a livello di codice: leggere eventi tramite EKEventStore.event, creare tramite EKEventStore.save ed eliminare tramite EKEventStore.remove. Da iOS 18, è possibile richiedere l'accesso solo a un tipo specifico di entità — .event o .reminder.
In iOS 17+, Apple ha introdotto un meccanismo di accesso temporaneo: alcune app possono ottenere l'accesso per 24 ore dopo una conferma una tantum dell'utente. Questa funzione è particolarmente utile per le app che necessitano di accesso al calendario una tantum — ad esempio, per importare il programma di una conferenza.
Su Android, l'accesso al calendario è protetto da due permessi separati: READ_CALENDAR e WRITE_CALENDAR. Entrambi appartengono alla categoria pericolosa e richiedono richieste runtime. La separazione tra lettura e scrittura consente all'utente di regolare con precisione il livello di accesso dell'app.
Il permesso READ_CALENDAR consente all'app di leggere eventi da tutti i calendari dell'utente, inclusi nomi, orari, partecipanti e descrizioni. Il permesso WRITE_CALENDAR consente di creare, modificare ed eliminare eventi. Entrambi sono specificati nel manifesto tramite il tag uses-permission e richiesti in fase di esecuzione tramite ActivityResultLauncher.
A partire da Android 14 (API 34), il sistema avvisa l'utente se un'app richiede entrambi i permessi contemporaneamente. Si consiglia di richiederli separatamente: prima READ_CALENDAR per la lettura, poi WRITE_CALENDAR al primo tentativo di creazione di un evento. Secondo Google I/O 2024, questo approccio riduce il tasso di rifiuto del 23%.
CalendarContract è un ContentProvider Android che struttura i dati del calendario in tabelle relazionali. Le tabelle principali includono: Calendars (elenco di calendari), Events (eventi), Attendees (partecipanti), Reminders (notifiche). L'accesso ai dati avviene tramite ContentResolver.query() con un URI e una proiezione specificati.
Per inserire un nuovo evento, è necessario utilizzare ContentValues specificando il calendario, l'ora di inizio e fine, il titolo e la descrizione. CalendarContract supporta fusi orari, eventi ricorrenti e promemoria con intervalli di notifica personalizzabili.
L'implementazione delle richieste di accesso al calendario richiede la considerazione delle caratteristiche specifiche della piattaforma. Di seguito sono riportati esempi in Swift e Kotlin che dimostrano il corretto funzionamento con EventKit e CalendarContract.
La richiesta di accesso al calendario iOS viene effettuata tramite il metodo requestAccess della classe EKEventStore. L'esempio seguente mostra la creazione di un evento dopo aver ottenuto il permesso.
import EventKit
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event) { granted, error in
guard granted else {
print("Accesso al calendario negato")
return
}
let event = EKEvent(eventStore: eventStore)
event.title = "Riunione di squadra"
event.startDate = Date()
event.endDate = Date(timeIntervalSinceNow: 3600)
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
print("Evento creato: \(event.eventIdentifier)")
} catch {
print("Errore di salvataggio: \(error.localizedDescription)")
}
}
Su Android, la richiesta dei permessi READ_CALENDAR e WRITE_CALENDAR viene effettuata tramite ActivityResultLauncher. L'esempio mostra la lettura degli eventi dal calendario dell'utente dopo aver ottenuto l'accesso.
val calendarPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
if (permissions[Manifest.permission.READ_CALENDAR] == true) {
val uri = CalendarContract.Events.CONTENT_URI
val projection = arrayOf(
CalendarContract.Events.TITLE,
CalendarContract.Events.DTSTART,
CalendarContract.Events.DTEND
)
val cursor = contentResolver.query(uri, projection, null, null, null)
cursor?.use {
val titleIndex = it.getColumnIndex(CalendarContract.Events.TITLE)
while (it.moveToNext()) {
Log.d("Calendario", "Evento: ${it.getString(titleIndex)}")
}
}
} else {
// Mostra spiegazione e suggerisci di andare nelle impostazioni
requestPermissionSettingsRedirect()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendarPermissionLauncher.launch(
arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
)
}
Lavorare con i permessi del calendario richiede una strategia ben ponderata che consideri i requisiti di entrambe le piattaforme e le aspettative dell'utente. Seguire le raccomandazioni di seguito aiuta a superare la moderazione e aumentare il tasso di concessione delle autorizzazioni.
Richiedi l'accesso al calendario solo quando l'utente esegue un'azione che richiede dati del calendario: “Aggiungi al calendario”, “Sincronizza programma”, “Importa eventi”. Un dialogo pre-autorizzazione (un dialogo personalizzato prima di quello di sistema) aumenta il tasso di consenso del 35%, secondo Localytics (2024).
Su iOS, utilizza la chiave NSCalendarsUsageDescription nel manifesto della privacy con un testo specifico. Invece di “Per creare eventi”, scrivi “Per aggiungere allenamenti al tuo calendario”. Una formulazione specifica aumenta il tasso di conversione della richiesta del 20–30%.
Se l'utente rifiuta la richiesta, non mostrare nuovamente il dialogo di sistema — questo attiverà neverAskAgain su Android o renderà il dialogo non disponibile su iOS. Invece, offri di andare nelle impostazioni tramite Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) su Android o UIApplication.openSettingsURLString su iOS.
Quando si rientra nella schermata, verifica lo stato del permesso. Su iOS, chiama EKEventStore.authorizationStatus(for: .event) e aggiorna l'interfaccia utente in base allo stato corrente. Su Android, utilizza ContextCompat.checkSelfPermission() per verificare lo stato corrente e decidere se mostrare il pulsante di reindirizzamento alle impostazioni.
Domande frequenti
Le app richiedono l'accesso al calendario per creare eventi, sincronizzare programmi, importare scadenze e integrarsi con i promemoria. Esempi: i tracker fitness aggiungono allenamenti, i pianificatori creano attività e le app di viaggio importano voli nel calendario dell'utente.
READ_CALENDAR fornisce l'accesso in lettura a tutti gli eventi e calendari dell'utente. WRITE_CALENDAR consente di creare, modificare ed eliminare eventi. L'utente può concedere un permesso senza l'altro, offrendo un controllo flessibile sul livello di accesso dell'app ai dati del calendario.
Apri Impostazioni — Privacy e sicurezza — Calendari. Seleziona l'app e disattiva l'interruttore di accesso. L'app perderà la capacità di leggere e creare eventi fino alla successiva richiesta esplicita e conferma dell'utente.
L'app non sarà in grado di leggere o creare eventi. Il metodo requestAccess restituirà granted = false su iOS, o checkSelfPermission restituirà PERMISSION_DENIED su Android. Gli sviluppatori dovrebbero implementare un degradazione graduale — l'app continua a funzionare senza funzionalità del calendario senza crash o errori.
Su iOS, non è possibile — EventKit richiede l'accesso completo per qualsiasi operazione sugli eventi. Su Android, puoi utilizzare Intent.ACTION_INSERT per creare un evento tramite l'app di calendario di sistema, che non richiede permessi runtime, ma non consente nemmeno di leggere eventi esistenti.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche