Дозвола за приступ календару је механизам мобилних оперативних система који штити календарске податке корисника од неовлашћеног читања и измене. На iOS-у приступ календару је реализован кроз оквир EventKit са класама EKEventStore и EKCalendar, а на Android-у — кроз дозволе READ_CALENDAR и WRITE_CALENDAR у пару са CalendarContract API-јем. Према Apple Developer Documentation, 2025, за приступ календару на iOS 18+ потребан је јасан захтев кроз системски дијалог. EventKit пружа јединствени интерфејс за читање и креирање догађаја на свим повезаним календарима.
Главно
Дозвола за приступ календару је механизам заштите личних података који контролише читање и писање догађаја у календарским апликацијама уређаја. Календар садржи поверљиве информације: састанке, рокове, подсетнике и личне планове корисника, па мобилни оперативни системи класификују приступ њему као критичан.
На iOS-у приступ календару је регулисан оквиром EventKit. Апликација може да затражи приступ за читање и писање догађаја, а корисник може да прихвати или одбије захтев кроз системски дијалог. На Android-у заштита се заснива на двије рунтим дозволе: READ_CALENDAR и WRITE_CALENDAR.
Према истраживању Pew Research Center (2024), око 45% корисника мобилних уређаја редовно користи календар, а 62% њих одбија приступ апликацијама које не објашњавају разлог захтева за календарским подацима.
Кључни принцип — апликација треба да захтева приступ само за функције које су директно повезане са календаром: креирање подсетника, синхронизација догађаја, увоз распореда.
На iOS-у приступ календару и подсетницама омогућен јединственим оквиром EventKit. Централна класа EKEventStore управља свим операцијама: захтев дозволе, читање догађаја, креирање и уређивање календарских уноса. При првом позиву requestAccess(to:entityType:), систем приказује нативни дијалог са објашњењем.
Класа EKEventStore је улазна тачка у подсистем календара iOS-а. За захтев приступа потребно је позвати методу requestAccess(to: .event), проследивши тип ентитета (догађај или подсетник). Након добијања дозволе, EKEventStore пружа приступ свим календарима повезаним са iCloud, Google, Exchange и другим пружаоцима.
Важна карактеристика: EKEventStore је тешки објекат, његово креирање захтева време и троши ресурсе. Препоручује се да се иницијализује једном и поново користи током животног циклуса апликације. Према WWDC Session 10117 (2024), Apple препоручује кеширање инстанце EventStore ради оптимизације перформанси.
iOS не раздваја дозволе за читање и писање календара — корисник даје или пун приступ или га одбија. Међутим, апликација може да контролише операције на нивоу кода: чита догађаје кроз EKEventStore.event, креира кроз EKEventStore.save и брише кроз EKEventStore.remove. Од iOS 18 појавила се могућност захтева приступа само одређеном типу ентитета — .event или .reminder.
У iOS 17+ Apple је увела механизам привременог приступа: неке апликације могу добити приступ на 24 сата након једнократног потврде корисника. Ова функција је посебно корисна за апликације којима је календар потребан само једнократно — на примјер, за увоз распореда конференције.
На Android-у приступ календару је заштићен двијема одвојеним дозволама: READ_CALENDAR и WRITE_CALENDAR. Обе спадају у категорију опасних и захтевају рунтим захтев. Одвајање читања од писања омогућава кориснику да фино подешава ниво приступа апликације.
Дозвола READ_CALENDAR даје апликацији могућност читања догађаја из свих календара корисника, укључујући имена, време, учеснике и опис. Дозвола WRITE_CALENDAR омогућава креирање, измену и брисање догађаја. Обе су наведене у манифесту кроз таг uses-permission и захтевају се током извршавања кроз ActivityResultLauncher.
Почев од Android 14 (API 34), систем упозорава корисника ако апликација захтева обе дозволе истовремено. Препоручује се да се захтевају одвојено: прво READ_CALENDAR за читање, затим WRITE_CALENDAR при првом покушају креирања догађаја. Према Google I/O 2024, овакав приступ смањује проценат одбијања за 23%.
CalendarContract је Android ContentProvider који структурише календарске податке у релационе табеле. Главне табеле: Calendars (листа календара), Events (догађаји), Attendees (учесници), Reminders (подсетници). Приступ подацима се остварује кроз ContentResolver.query() са наводом URI и пројекције.
За уметање новог догађаја потребно је користити ContentValues са наводом календара, времена почетка и краја, наслова и описа. CalendarContract подржава временске зоне, понављајуће догађаје и подсетнике са подесивим интервалом обавештавања.
Имплементација захтева за приступ календару захтева узимање у обзир платформених карактеристика. Испод су примери у Swift-у и Kotlin-у који приказују правилан рад са EventKit-ом и CalendarContract-ом.
Захтев за приступ календару iOS-а се извршава кроз методу requestAccess класе EKEventStore. Пример испод приказује креирање догађаја након добијања дозволе.
import EventKit
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event) { granted, error in
guard granted else {
print("Приступ календару је одбијен")
return
}
let event = EKEvent(eventStore: eventStore)
event.title = "Тимски састанак"
event.startDate = Date()
event.endDate = Date(timeIntervalSinceNow: 3600)
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
print("Догађај креиран: \(event.eventIdentifier)")
} catch {
print("Грешка чувања: \(error.localizedDescription)")
}
}
На Android-у захтев дозвола READ_CALENDAR и WRITE_CALENDAR се извршава кроз ActivityResultLauncher. Пример приказује читање догађаја из календара корисника након добијања приступа.
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", "Догађај: ${it.getString(titleIndex)}")
}
}
} else {
// Прикажи објашњење и понуди прелазак на поставке
requestPermissionSettingsRedirect()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendarPermissionLauncher.launch(
arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
)
}
Рад са дозволама за календар захтева промишљену стратегију која узима у обзир захтеве обе платформе и очекивања корисника. Праћење доњих препорука помаже да се прође модерација и повећа проценат одобравања приступа.
Захтевајте приступ календару само у тренутку када корисник обавља радњу која захтева календарске податке: „Додај у календар”, „Синхронизуј распоред”, „Увози догађаје”. Претходно објашњење коришћењем pre-permission dialoga (властитог дијалога пре системског) повећава проценат прихватана за 35%, према Localytics (2024).
На iOS-у користите кључ NSCalendarsUsageDescription у privacy manifest-у са конкретним текстом. Уместо „За креирање догађаја” напишите „За додавање вежби у ваш календар”. Конкретна формулација повећава конверзију захтева за 20–30%.
Ако је корисник одбио захтев, не приказујте системски дијалог поново — то ће довести до активирања neverAskAgain на Android-у или недоступности дијалога на iOS-у. Уместо тога, предложите прелазак на поставке кроз Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) на Android-у или UIApplication.openSettingsURLString на iOS-у.
При поновном уласку на екран проверавајте статус дозволе. На iOS-у позивите EKEventStore.authorizationStatus(for: .event) и ажурирајте UI у складу са тренутним статусом. На Android-у користите ContextCompat.checkSelfPermission() за проверу тренутног стања и одлукивање о приказивању дугмета за прелазак на поставке.
Често постављана питања
Апликације захтевају приступ календару ради креирања догађаја, синхронизације распореда, увоза рокова и интеграције са подсетницима. Примјери: фитнес трекери додају тренинге, планери креирају задатке, а туристичке апликације увозе летове у календар корисника.
READ_CALENDAR омогућава читање свих догађаја и календара корисника. WRITE_CALENDAR омогућава креирање, измену и брисање догађаја. Корисник може да одобри једну дозволу без друге, што пружа флексибилну контролу над нивоом приступа апликације календарским подацима.
Отворите Поставке — Приватност и безбедност — Календари. Изаберите апликацију и искључите прекидач приступа. Апликација ће изгубити могућност читања и креирања догађаја до следећег јасног захтева и потврде од корисника.
Апликација неће моћи да чита или креира догађаје. Метода requestAccess ће вратити granted = false на iOS-у или checkSelfPermission ће вратити PERMISSION_DENIED на Android-у. Програмер треба да предвиди грациозну деградацију — апликација наставља да ради без функција календара, без падања или приказивања грешака.
На iOS-у та могућност не постоји — EventKit захтева пун приступ за све операције са догађајима. На Android-у можете користити Intent.ACTION_INSERT за креирање догађаја кроз системску апликацију календара, што не захтева рунтим дозволе, али ни не омогућава читање постојећих догађаја.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође