Die Kalenderzugriffsberechtigung ist ein Mechanismus mobiler Betriebssysteme, der Kalenderdaten des Benutzers vor unbefugtem Lesen und Ändern schützt. Unter iOS wird der Kalenderzugriff über das EventKit-Framework mit den Klassen EKEventStore und EKCalendar implementiert, unter Android — über die Berechtigungen READ_CALENDAR und WRITE_CALENDAR in Verbindung mit der CalendarContract-API. Laut der Apple Developer Documentation, 2025 ist für den Zugriff auf den Kalender unter iOS 18+ eine explizite Anfrage über den Systemdialog erforderlich. EventKit bietet eine einheitliche Schnittstelle zum Lesen und Erstellen von Ereignissen in allen verbundenen Kalendern.
Wichtige Punkte
Die Kalenderzugriffsberechtigung ist ein Mechanismus zum Schutz personenbezogener Daten, der das Lesen und Schreiben von Ereignissen in den Kalenderanwendungen des Geräts steuert. Der Kalender enthält vertrauliche Informationen: Besprechungen, Fristen, Erinnerungen und persönliche Pläne — daher stufen mobile Betriebssysteme den Zugriff darauf als kritisch ein.
Unter iOS wird der Kalenderzugriff durch das EventKit-Framework geregelt. Eine App kann Lese- und Schreibzugriff auf Ereignisse anfordern, und der Benutzer kann die Anfrage über einen Systemdialog gewähren oder ablehnen. Unter Android basiert der Schutz auf zwei Laufzeitberechtigungen: READ_CALENDAR und WRITE_CALENDAR.
Laut einer Studie des Pew Research Center (2024) nutzen etwa 45% der Mobilgerätenutzer regelmäßig den Kalender, und 62% von ihnen verweigern Apps den Zugriff, die den Grund für die Anforderung von Kalenderdaten nicht erklären.
Das wichtigste Prinzip — eine App sollte nur für Funktionen, die direkt mit dem Kalender zusammenhängen, Zugriff anfordern: Erstellen von Erinnerungen, Synchronisieren von Ereignissen, Importieren von Zeitplänen.
Unter iOS wird der Zugriff auf den Kalender und die Erinnerungen über ein einziges Framework bereitgestellt — EventKit. Die zentrale Klasse EKEventStore verwaltet alle Operationen: Anfordern der Berechtigung, Lesen von Ereignissen, Erstellen und Bearbeiten von Kalendereinträgen. Beim ersten Aufruf von requestAccess(to:entityType:) zeigt das System einen nativen Dialog mit einer Erklärung an.
Die Klasse EKEventStore ist der Einstiegspunkt in das iOS-Kalender-Subsystem. Um Zugriff anzufordern, müssen Sie die Methode requestAccess(to: .event) aufrufen und dabei den Entitätstyp (Ereignis oder Erinnerung) übergeben. Nach Erhalt der Berechtigung gewährt EKEventStore Zugriff auf alle mit iCloud, Google, Exchange und anderen Anbietern verbundenen Kalender.
Eine wichtige Eigenschaft: EKEventStore ist ein schweres Objekt — seine Erstellung dauert Zeit und verbraucht Ressourcen. Es wird empfohlen, es einmal zu initialisieren und während des gesamten Anwendungslebenszyklus wiederzuverwenden. Laut WWDC Session 10117 (2024) empfiehlt Apple, die EventStore-Instanz zur Leistungsoptimierung zwischenzuspeichern.
iOS trennt nicht zwischen Lese- und Schreibberechtigungen für den Kalender — der Benutzer gewährt entweder vollen Zugriff oder lehnt ab. Die App kann jedoch Operationen auf Codeebene steuern: Ereignisse lesen über EKEventStore.event, erstellen über EKEventStore.save und löschen über EKEventStore.remove. Seit iOS 18 ist es möglich, Zugriff nur auf einen bestimmten Entitätstyp anzufordern — .event oder .reminder.
In iOS 17+ führte Apple einen temporären Zugriffsmechanismus ein: Einige Apps können nach einmaliger Bestätigung durch den Benutzer für 24 Stunden Zugriff erhalten. Diese Funktion ist besonders nützlich für Apps, die nur einmalig Kalenderzugriff benötigen — zum Beispiel zum Importieren eines Konferenzzeitplans.
Unter Android ist der Kalenderzugriff durch zwei separate Berechtigungen geschützt: READ_CALENDAR und WRITE_CALENDAR. Beide gehören zur Kategorie der gefährlichen Berechtigungen und erfordern Laufzeitanfragen. Die Trennung von Lese- und Schreibzugriff ermöglicht es dem Benutzer, die Zugriffsebene der App fein abzustimmen.
Die Berechtigung READ_CALENDAR erlaubt der App, Ereignisse aus allen Benutzerkalendern zu lesen, einschließlich Namen, Zeiten, Teilnehmer und Beschreibungen. Die Berechtigung WRITE_CALENDAR ermöglicht das Erstellen, Ändern und Löschen von Ereignissen. Beide werden im Manifest über das uses-permission-Tag angegeben und zur Laufzeit über ActivityResultLauncher angefordert.
Ab Android 14 (API 34) warnt das System den Benutzer, wenn eine App beide Berechtigungen gleichzeitig anfordert. Es wird empfohlen, sie getrennt anzufordern: zuerst READ_CALENDAR zum Lesen, dann WRITE_CALENDAR beim ersten Versuch, ein Ereignis zu erstellen. Laut Google I/O 2024 reduziert dieser Ansatz die Ablehnungsrate um 23%.
CalendarContract ist ein Android-ContentProvider, der Kalenderdaten in relationale Tabellen strukturiert. Die wichtigsten Tabellen umfassen: Calendars (Liste der Kalender), Events (Ereignisse), Attendees (Teilnehmer), Reminders (Benachrichtigungen). Der Datenzugriff erfolgt über ContentResolver.query() mit einer angegebenen URI und Projektion.
Zum Einfügen eines neuen Ereignisses müssen Sie ContentValues mit Angabe des Kalenders, der Start- und Endzeit, des Titels und der Beschreibung verwenden. CalendarContract unterstützt Zeitzonen, wiederkehrende Ereignisse und Erinnerungen mit anpassbaren Benachrichtigungsintervallen.
Die Implementierung von Kalenderzugriffsanfragen erfordert die Berücksichtigung plattformspezifischer Funktionen. Nachfolgend finden Sie Beispiele in Swift und Kotlin, die die korrekte Arbeit mit EventKit und CalendarContract demonstrieren.
Die Anfrage für den iOS-Kalenderzugriff erfolgt über die requestAccess-Methode der EKEventStore-Klasse. Das folgende Beispiel zeigt das Erstellen eines Ereignisses nach Erhalt der Berechtigung.
import EventKit
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event) { granted, error in
guard granted else {
print("Kalenderzugriff verweigert")
return
}
let event = EKEvent(eventStore: eventStore)
event.title = "Team-Besprechung"
event.startDate = Date()
event.endDate = Date(timeIntervalSinceNow: 3600)
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
print("Ereignis erstellt: \(event.eventIdentifier)")
} catch {
print("Speicherfehler: \(error.localizedDescription)")
}
}
Unter Android erfolgt die Anfrage der Berechtigungen READ_CALENDAR und WRITE_CALENDAR über ActivityResultLauncher. Das Beispiel zeigt das Lesen von Ereignissen aus dem Benutzerkalender nach Erhalt des Zugriffs.
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("Kalender", "Ereignis: ${it.getString(titleIndex)}")
}
}
} else {
// Erklärung anzeigen und zu den Einstellungen gehen vorschlagen
requestPermissionSettingsRedirect()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendarPermissionLauncher.launch(
arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
)
}
Die Arbeit mit Kalenderberechtigungen erfordert eine durchdachte Strategie, die die Anforderungen beider Plattformen und die Erwartungen des Benutzers berücksichtigt. Die Befolgung der nachstehenden Empfehlungen hilft, die Moderation zu bestehen und die Genehmigungsrate zu erhöhen.
Fordern Sie Kalenderzugriff nur an, wenn der Benutzer eine Aktion ausführt, die Kalenderdaten erfordert: „Zum Kalender hinzufügen“, „Zeitplan synchronisieren“, „Ereignisse importieren“. Ein Vorab-Berechtigungsdialog (ein benutzerdefinierter Dialog vor dem Systemdialog) erhöht die Zustimmungsrate um 35%, laut Localytics (2024).
Verwenden Sie unter iOS den Schlüssel NSCalendarsUsageDescription im Datenschutzmanifest mit einem konkreten Text. Schreiben Sie statt „Zum Erstellen von Ereignissen“ lieber „Zum Hinzufügen von Trainingseinheiten zu Ihrem Kalender“. Eine konkrete Formulierung erhöht die Konversionsrate der Anfrage um 20–30%.
Wenn der Benutzer die Anfrage ablehnt, zeigen Sie den Systemdialog nicht erneut an — dies löst unter Android neverAskAgain aus oder macht den Dialog unter iOS unzugänglich. Bieten Sie stattdessen an, zu den Einstellungen zu gehen, und zwar über Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) unter Android oder UIApplication.openSettingsURLString unter iOS.
Überprüfen Sie beim erneuten Betreten des Bildschirms den Berechtigungsstatus. Rufen Sie unter iOS EKEventStore.authorizationStatus(for: .event) auf und aktualisieren Sie die Benutzeroberfläche entsprechend dem aktuellen Status. Verwenden Sie unter Android ContextCompat.checkSelfPermission(), um den aktuellen Zustand zu überprüfen und zu entscheiden, ob der Weiterleitungsbutton zu den Einstellungen angezeigt werden soll.
Häufig gestellte Fragen
Apps fordern Kalenderzugriff an, um Ereignisse zu erstellen, Zeitpläne zu synchronisieren, Fristen zu importieren und sich in Erinnerungen zu integrieren. Beispiele: Fitness-Tracker fügen Trainingseinheiten hinzu, Planer erstellen Aufgaben und Reise-Apps importieren Flüge in den Kalender des Benutzers.
READ_CALENDAR gewährt Zugriff zum Lesen aller Ereignisse und Kalender des Benutzers. WRITE_CALENDAR ermöglicht das Erstellen, Ändern und Löschen von Ereignissen. Der Benutzer kann eine Berechtigung ohne die andere erteilen, was eine flexible Kontrolle über die Zugriffsebene der App auf Kalenderdaten ermöglicht.
Öffnen Sie Einstellungen — Datenschutz & Sicherheit — Kalender. Wählen Sie die App aus und deaktivieren Sie den Zugriffsschalter. Die App verliert die Fähigkeit, Ereignisse zu lesen und zu erstellen, bis zur nächsten expliziten Anfrage und Bestätigung durch den Benutzer.
Die App kann keine Ereignisse lesen oder erstellen. Die requestAccess-Methode gibt unter iOS granted = false zurück, oder checkSelfPermission gibt unter Android PERMISSION_DENIED zurück. Entwickler sollten Graceful Degradation implementieren — die App funktioniert ohne Kalenderfunktionen weiter, ohne abzustürzen oder Fehler anzuzeigen.
Unter iOS ist dies nicht möglich — EventKit erfordert für alle Operationen mit Ereignissen vollständigen Zugriff. Unter Android können Sie Intent.ACTION_INSERT verwenden, um ein Ereignis über die systemeigene Kalender-App zu erstellen, was keine Laufzeitberechtigungen erfordert, aber auch keine vorhandenen Ereignisse auslesen kann.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch