Toestemming voor toegang tot de agenda is een mechanisme van mobiele besturingssystemen dat de agendagegevens van de gebruiker beschermt tegen ongeautoriseerd lezen en wijzigen. In iOS wordt toegang tot de agenda gerealiseerd via het EventKit-framework met de klassen EKEventStore en EKCalendar, en op Android via de machtigingen READ_CALENDAR en WRITE_CALENDAR in combinatie met de CalendarContract API. Volgens Apple Developer Documentation, 2025 is voor toegang tot de agenda in iOS 18+ een expliciet verzoek via het systeemdialoogvenster vereist. EventKit biedt een uniforme interface voor het lezen en aanmaken van gebeurtenissen in alle verbonden agenda's.
Belangrijkste punten
Toestemming voor toegang tot de agenda is een mechanisme voor de bescherming van persoonsgegevens dat het lezen en schrijven van gebeurtenissen in agenda-apps op het apparaat regelt. De agenda bevat vertrouwelijke informatie: afspraken, deadlines, herinneringen en persoonlijke plannen van de gebruiker, daarom classificeren mobiele besturingssystemen toegang ertoe als kritiek.
Op iOS wordt de toegang tot de agenda gereguleerd door het EventKit-framework. De app kan toegang aanvragen voor het lezen en schrijven van gebeurtenissen, en de gebruiker kan het verzoek accepteren of weigeren via het systeemdialoogvenster. Op Android is de bescherming gebaseerd op twee runtime-machtigingen: READ_CALENDAR en WRITE_CALENDAR.
Volgens onderzoek van het Pew Research Center (2024) gebruikt ongeveer 45% van de mobiele gebruikers regelmatig de agenda, en 62% van hen weigert toegang aan apps die de reden van het verzoek om agendagegevens niet uitleggen.
Het belangrijkste principe — de app mag alleen toegang vragen voor functies die direct verband houden met de agenda: het aanmaken van herinneringen, het synchroniseren van gebeurtenissen, het importeren van schema's.
Op iOS wordt toegang tot de agenda en herinneringen geboden door één enkel framework EventKit. De centrale klasse EKEventStore beheert alle bewerkingen: het aanvragen van toestemming, het lezen van gebeurtenissen, het aanmaken en bewerken van agenda-items. Bij de eerste aanroep van requestAccess(to:entityType:) toont het systeem een native dialoogvenster met uitleg.
De klasse EKEventStore is het toegangspunt tot het agendac subsysteem van iOS. Om toegang aan te vragen, moet de methode requestAccess(to: .event) worden aangeroepen met het entiteitstype (gebeurtenis of herinnering). Na het verkrijgen van toestemming biedt EKEventStore toegang tot alle agenda's die zijn verbonden met iCloud-, Google-, Exchange- en andere provideraccounts.
Een belangrijk kenmerk: EKEventStore is een zwaar object, het aanmaken ervan kost tijd en verbruikt bronnen. Het wordt aanbevolen om het eenmalig te initialiseren en opnieuw te gebruiken gedurende de levenscyclus van de app. Volgens WWDC Session 10117 (2024) raadt Apple aan om de EventStore-instantie te cachen voor prestatieoptimalisatie.
iOS maakt geen onderscheid tussen lees- en schrijfmachtigingen voor de agenda — de gebruiker verleent ofwel volledige toegang of weigert. De app kan echter bewerkingen op codeniveau regelen: gebeurtenissen lezen via EKEventStore.event, aanmaken via EKEventStore.save en verwijderen via EKEventStore.remove. Sinds iOS 18 is de mogelijkheid ontstaan om alleen toegang tot een specifiek entiteitstype aan te vragen — .event of .reminder.
In iOS 17+ heeft Apple een mechanisme voor tijdelijke toegang geïntroduceerd: sommige apps kunnen na eenmalige bevestiging door de gebruiker 24 uur toegang krijgen. Deze functie is vooral handig voor apps die de agenda maar één keer nodig hebben — bijvoorbeeld voor het importeren van een conferentieschema.
Op Android wordt de toegang tot de agenda beschermd door twee afzonderlijke machtigingen: READ_CALENDAR en WRITE_CALENDAR. Beide behoren tot de gevaarlijke categorie en vereisen een runtime-aanvraag. De scheiding tussen lezen en schrijven stelt de gebruiker in staat om het toegangsniveau van de app fijn af te stemmen.
De machtiging READ_CALENDAR geeft de app de mogelijkheid om gebeurtenissen uit alle agenda's van de gebruiker te lezen, inclusief namen, tijd, deelnemers en beschrijving. De machtiging WRITE_CALENDAR maakt het mogelijk om gebeurtenissen aan te maken, te wijzigen en te verwijderen. Beide worden in het manifest gespecificeerd via de tag uses-permission en worden tijdens runtime aangevraagd via ActivityResultLauncher.
Sinds Android 14 (API 34) waarschuwt het systeem de gebruiker als de app beide machtigingen tegelijkertijd aanvraagt. Het wordt aanbevolen om ze afzonderlijk aan te vragen: eerst READ_CALENDAR voor lezen, daarna WRITE_CALENDAR bij de eerste poging om een gebeurtenis aan te maken. Volgens Google I/O 2024 verlaagt deze benadering het weigeringspercentage met 23%.
CalendarContract is een Android ContentProvider die agendagegevens structureert in relationele tabellen. De belangrijkste tabellen: Calendars (lijst van agenda's), Events (gebeurtenissen), Attendees (deelnemers), Reminders (herinneringen). Toegang tot gegevens vindt plaats via ContentResolver.query() met opgave van URI en projectie.
Om een nieuwe gebeurtenis in te voegen, moet ContentValues worden gebruikt met opgave van de agenda, start- en eindtijd, titel en beschrijving. CalendarContract ondersteunt tijdzones, terugkerende gebeurtenissen en herinneringen met een configureerbaar meldingsinterval.
Het implementeren van de toegangsaanvraag voor de agenda vereist het in overweging nemen van platformspecifieke kenmerken. Hieronder staan voorbeelden in Swift en Kotlin die correct werken met EventKit en CalendarContract demonstreren.
Het aanvragen van toegang tot de iOS-agenda gebeurt via de methode requestAccess van de klasse EKEventStore. Het onderstaande voorbeeld toont het aanmaken van een gebeurtenis na het verkrijgen van toestemming.
import EventKit
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event) { granted, error in
guard granted else {
print("Toegang tot agenda geweigerd")
return
}
let event = EKEvent(eventStore: eventStore)
event.title = "Teamvergadering"
event.startDate = Date()
event.endDate = Date(timeIntervalSinceNow: 3600)
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
print("Gebeurtenis aangemaakt: \(event.eventIdentifier)")
} catch {
print("Opslagfout: \(error.localizedDescription)")
}
}
Op Android wordt het aanvragen van de machtigingen READ_CALENDAR en WRITE_CALENDAR uitgevoerd via ActivityResultLauncher. Het voorbeeld toont het lezen van gebeurtenissen uit de agenda van de gebruiker na het verkrijgen van toegang.
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("Calendar", "Gebeurtenis: ${it.getString(titleIndex)}")
}
}
} else {
// Uitleg tonen en voorstellen om naar instellingen te gaan
requestPermissionSettingsRedirect()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendarPermissionLauncher.launch(
arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
)
}
Werken met agendamachtigingen vereist een doordachte strategie die rekening houdt met de vereisten van beide platforms en de verwachtingen van gebruikers. Het volgen van de onderstaande aanbevelingen helpt om door de moderatie te komen en het percentage toegangstoekenning te verhogen.
Vraag alleen toegang tot de agenda op het moment dat de gebruiker een actie uitvoert waarvoor agendagegevens nodig zijn: „Toevoegen aan agenda”, „Schema synchroniseren”, „Gebeurtenissen importeren”. Vooraf uitleggen met behulp van een pre-permission dialoogvenster (eigen dialoog voor het systeemdialoogvenster) verhoogt het acceptatiepercentage met 35%, volgens Localytics (2024).
Gebruik op iOS de sleutel NSCalendarsUsageDescription in het privacy manifest met specifieke tekst. Schrijf in plaats van „Voor het aanmaken van gebeurtenissen”: „Voor het toevoegen van trainingen aan uw agenda”. Een concrete formulering verhoogt de conversie van de aanvraag met 20–30%.
Als de gebruiker het verzoek heeft geweigerd, toon dan niet opnieuw het systeemdialoogvenster — dit leidt tot het activeren van neverAskAgain op Android of het niet beschikbaar zijn van het dialoogvenster op iOS. Bied in plaats daarvan aan om naar de instellingen te gaan via Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) op Android of UIApplication.openSettingsURLString op iOS.
Controleer bij het opnieuw betreden van het scherm de machtigingsstatus. Roep op iOS EKEventStore.authorizationStatus(for: .event) aan en werk de UI bij volgens de huidige status. Gebruik op Android ContextCompat.checkSelfPermission() om de huidige status te controleren en te beslissen of de knop voor doorverwijzing naar instellingen moet worden getoond.
Veelgestelde vragen
Apps vragen toegang tot de agenda voor het aanmaken van gebeurtenissen, het synchroniseren van schema's, het importeren van deadlines en integratie met herinneringen. Voorbeelden: fitnesstrackers voegen trainingen toe, planners maken taken aan en reisapps importeren vluchten in de agenda van de gebruiker.
READ_CALENDAR biedt toegang tot het lezen van alle gebeurtenissen en agenda's van de gebruiker. WRITE_CALENDAR maakt het mogelijk om gebeurtenissen aan te maken, te wijzigen en te verwijderen. De gebruiker kan de ene machtiging verlenen zonder de andere, wat flexibele controle biedt over het toegangsniveau van de app tot agendagegevens.
Open Instellingen — Privacy en beveiliging — Agenda's. Selecteer de app en schakel de toegangsschakelaar uit. De app verliest de mogelijkheid om gebeurtenissen te lezen en aan te maken tot het volgende expliciete verzoek en bevestiging door de gebruiker.
De app kan geen gebeurtenissen lezen of aanmaken. De methode requestAccess retourneert granted = false op iOS of checkSelfPermission retourneert PERMISSION_DENIED op Android. De ontwikkelaar moet graceful degradation voorzien — de app blijft werken zonder agendafuncties, zonder te crashen of fouten weer te geven.
Op iOS bestaat deze mogelijkheid niet — EventKit vereist volledige toegang voor elke bewerking met gebeurtenissen. Op Android kunt u Intent.ACTION_INSERT gebruiken om een gebeurtenis aan te maken via de systeemagenda-app, wat geen runtime-machtigingen vereist, maar ook niet toestaat om bestaande gebeurtenissen te lezen.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook