Takvim erişim izni, kullanıcının takvim verilerini yetkisiz okuma ve değiştirmeye karşı koruyan bir mobil işletim sistemi mekanizmasıdır. iOS'ta takvim erişimi, EKEventStore ve EKCalendar sınıflarıyla EventKit çerçevesi aracılığıyla uygulanırken, Android'de — READ_CALENDAR ve WRITE_CALENDAR izinleriyle CalendarContract API'si aracılığıyla uygulanır. Apple Developer Documentation, 2025'e göre, iOS 18+ üzerinde takvime erişmek için sistem diyalogu aracılığıyla açık bir talep gerekir. EventKit, bağlı tüm takvimlerde etkinlikleri okumak ve oluşturmak için birleşik bir arayüz sağlar.
Önemli Noktalar
Takvim erişim izni, cihazın takvim uygulamalarındaki etkinliklerin okunmasını ve yazılmasını kontrol eden bir kişisel veri koruma mekanizmasıdır. Takvim hassas bilgiler içerir: toplantılar, son teslim tarihleri, hatırlatıcılar ve kişisel planlar — bu nedenle mobil işletim sistemleri buna erişimi kritik olarak sınıflandırır.
iOS'ta takvim erişimi EventKit çerçevesi tarafından düzenlenir. Bir uygulama etkinliklere okuma ve yazma erişimi talep edebilir ve kullanıcı sistem diyalogu aracılığıyla talebi kabul edebilir veya reddedebilir. Android'de koruma, iki çalışma zamanı iznine dayanır: READ_CALENDAR ve WRITE_CALENDAR.
Pew Research Center (2024) tarafından yapılan bir araştırmaya göre, mobil cihaz kullanıcılarının yaklaşık %45'i düzenli olarak takvim kullanıyor ve bunların %62'si takvim verilerini talep etme nedenini açıklamayan uygulamalara erişimi reddediyor.
Temel ilke — bir uygulama yalnızca takvimle doğrudan ilgili özellikler için erişim talep etmelidir: hatırlatıcı oluşturma, etkinlikleri senkronize etme, programları içe aktarma.
iOS'ta takvim ve hatırlatıcılara erişim, tek bir çerçeve olan EventKit aracılığıyla sağlanır. Merkezi EKEventStore sınıfı tüm işlemleri yönetir: izin talep etme, etkinlikleri okuma, takvim girişleri oluşturma ve düzenleme. requestAccess(to:entityType:) ilk çağrıldığında, sistem bir açıklama ile yerel bir diyalog görüntüler.
EKEventStore sınıfı, iOS takvim alt sistemine giriş noktasıdır. Erişim talep etmek için requestAccess(to: .event) yöntemini çağırmanız ve varlık türünü (etkinlik veya hatırlatıcı) iletmeniz gerekir. İzin alındıktan sonra, EKEventStore iCloud, Google, Exchange ve diğer sağlayıcılara bağlı tüm takvimlere erişim sağlar.
Önemli bir özellik: EKEventStore ağır bir nesnedir — oluşturulması zaman alır ve kaynak tüketir. Bir kez başlatılması ve uygulama yaşam döngüsü boyunca yeniden kullanılması önerilir. WWDC Session 10117 (2024)'ye göre Apple, performans optimizasyonu için EventStore örneğini önbelleğe almayı önerir.
iOS, takvim okuma ve yazma izinlerini ayırmaz — kullanıcı ya tam erişim verir ya da reddeder. Ancak uygulama, kod düzeyinde işlemleri kontrol edebilir: EKEventStore.event ile etkinlikleri okuma, EKEventStore.save ile oluşturma ve EKEventStore.remove ile silme. iOS 18'den itibaren, yalnızca belirli bir varlık türüne (.event veya .reminder) erişim talep etmek mümkündür.
iOS 17+'da Apple geçici erişim mekanizması tanıttı: bazı uygulamalar, kullanıcının tek seferlik onayından sonra 24 saat boyunca erişim elde edebilir. Bu özellik, tek seferlik takvim erişimine ihtiyaç duyan uygulamalar için özellikle yararlıdır — örneğin, bir konferans programını içe aktarmak için.
Android'de takvim erişimi iki ayrı izinle korunur: READ_CALENDAR ve WRITE_CALENDAR. Her ikisi de tehlikeli kategorisine aittir ve çalışma zamanı talebi gerektirir. Okuma ve yazmanın ayrılması, kullanıcının uygulamanın erişim düzeyini ince ayar yapmasına olanak tanır.
READ_CALENDAR izni, uygulamanın kullanıcının tüm takvimlerinden adlar, saatler, katılımcılar ve açıklamalar dahil olmak üzere etkinlikleri okumasına izin verir. WRITE_CALENDAR izni, etkinlik oluşturma, değiştirme ve silmeye izin verir. Her ikisi de bildirim dosyasında uses-permission etiketi aracılığıyla belirtilir ve ActivityResultLauncher aracılığıyla çalışma zamanında talep edilir.
Android 14'ten (API 34) itibaren sistem, bir uygulama her iki izni aynı anda talep ederse kullanıcıyı uyarır. Bunları ayrı ayrı talep etmeniz önerilir: önce okuma için READ_CALENDAR, ardından ilk etkinlik oluşturma girişiminde WRITE_CALENDAR. Google I/O 2024'e göre bu yaklaşım, reddetme oranını %23 azaltır.
CalendarContract, takvim verilerini ilişkisel tablolarda yapılandıran bir Android ContentProvider'dır. Ana tablolar şunları içerir: Calendars (takvim listesi), Events (etkinlikler), Attendees (katılımcılar), Reminders (bildirimler). Veri erişimi, belirtilen URI ve projeksiyonla ContentResolver.query() aracılığıyla gerçekleştirilir.
Yeni bir etkinlik eklemek için takvimi, başlangıç ve bitiş saatini, başlığı ve açıklamayı belirten ContentValues kullanmanız gerekir. CalendarContract, saat dilimlerini, yinelenen etkinlikleri ve özelleştirilebilir bildirim aralıklarına sahip hatırlatıcıları destekler.
Takvim erişim taleplerinin uygulanması, platforma özgü özelliklerin dikkate alınmasını gerektirir. Aşağıda, EventKit ve CalendarContract ile doğru çalışmayı gösteren Swift ve Kotlin örnekleri verilmiştir.
iOS takvim erişim talebi, EKEventStore sınıfının requestAccess yöntemi aracılığıyla yapılır. Aşağıdaki örnek, izin alındıktan sonra bir etkinlik oluşturmayı gösterir.
import EventKit
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event) { granted, error in
guard granted else {
print("Takvim erişimi reddedildi")
return
}
let event = EKEvent(eventStore: eventStore)
event.title = "Ekip toplantısı"
event.startDate = Date()
event.endDate = Date(timeIntervalSinceNow: 3600)
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
print("Etkinlik oluşturuldu: \(event.eventIdentifier)")
} catch {
print("Kaydetme hatası: \(error.localizedDescription)")
}
}
Android'de READ_CALENDAR ve WRITE_CALENDAR izinlerinin talebi ActivityResultLauncher aracılığıyla yapılır. Örnek, erişim sağlandıktan sonra kullanıcının takviminden etkinlikleri okumayı gösterir.
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("Takvim", "Etkinlik: ${it.getString(titleIndex)}")
}
}
} else {
// Açıklamayı göster ve ayarlara gitmeyi öner
requestPermissionSettingsRedirect()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendarPermissionLauncher.launch(
arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
)
}
Takvim izinleriyle çalışmak, her iki platformun gereksinimlerini ve kullanıcı beklentilerini dikkate alan iyi düşünülmüş bir strateji gerektirir. Aşağıdaki önerilere uymak, denetimden geçmeye ve izin verme oranını artırmaya yardımcı olur.
Takvim erişimini yalnızca kullanıcı takvim verileri gerektiren bir işlem yaptığında talep edin: “Takvime ekle”, “Programı senkronize et”, “Etkinlikleri içe aktar”. Ön izin diyaloğu (sistem diyaloğundan önce özel bir diyalog), Localytics (2024)'e göre onay oranını %35 artırır.
iOS'ta, gizlilik bildiriminde belirli bir metinle NSCalendarsUsageDescription anahtarını kullanın. “Etkinlik oluşturmak için” yerine “Takviminize antrenman eklemek için” yazın. Belirli bir ifade, talep dönüşüm oranını %20–30 artırır.
Kullanıcı talebi reddederse, sistem diyaloğunu tekrar göstermeyin — bu, Android'de neverAskAgain'i tetikler veya iOS'ta diyaloğu kullanılamaz hale getirir. Bunun yerine, Android'de Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) veya iOS'ta UIApplication.openSettingsURLString aracılığıyla ayarlara gitmeyi önerin.
Ekrana yeniden girildiğinde izin durumunu kontrol edin. iOS'ta EKEventStore.authorizationStatus(for: .event) öğesini çağırın ve geçerli duruma göre kullanıcı arayüzünü güncelleyin. Android'de, geçerli durumu kontrol etmek ve ayarlar yönlendirme düğmesini gösterip göstermemeye karar vermek için ContextCompat.checkSelfPermission() kullanın.
Sıkça Sorulan Sorular
Uygulamalar, etkinlik oluşturmak, programları senkronize etmek, son teslim tarihlerini içe aktarmak ve hatırlatıcılarla entegre olmak için takvim erişimi talep eder. Örnekler: fitness takipçileri antrenman ekler, planlayıcılar görev oluşturur ve seyahat uygulamaları kullanıcının takvimine uçuşları içe aktarır.
READ_CALENDAR, kullanıcının tüm etkinliklerini ve takvimlerini okuma erişimi sağlar. WRITE_CALENDAR, etkinlik oluşturma, değiştirme ve silmeye izin verir. Kullanıcı, diğeri olmadan bir izni verebilir ve bu da uygulamanın takvim verilerine erişim düzeyi üzerinde esnek kontrol sağlar.
Ayarlar — Gizlilik ve Güvenlik — Takvimler'i açın. Uygulamayı seçin ve erişim anahtarını kapatın. Bir sonraki açık talep ve kullanıcı onayına kadar uygulama etkinlikleri okuma ve oluşturma yeteneğini kaybeder.
Uygulama etkinlikleri okuyamaz veya oluşturamaz. requestAccess yöntemi iOS'ta granted = false döndürür veya checkSelfPermission Android'de PERMISSION_DENIED döndürür. Geliştiriciler zarif bozulma uygulamalıdır — uygulama çökmeden veya hata göstermeden takvim özellikleri olmadan çalışmaya devam eder.
iOS'ta bu mümkün değildir — EventKit, etkinliklerle ilgili herhangi bir işlem için tam erişim gerektirir. Android'de, sistem takvim uygulaması aracılığıyla bir etkinlik oluşturmak için Intent.ACTION_INSERT kullanabilirsiniz; bu, çalışma zamanı izinleri gerektirmez ancak mevcut etkinlikleri okumaya da izin vermez.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun