Ang pahintulot sa pag-access ng kalendaryo ay isang mekanismo ng mga mobile OS na nagpoprotekta sa data ng kalendaryo ng gumagamit mula sa hindi awtorisadong pagbasa at pagbabago. Sa iOS, ang pag-access sa kalendaryo ay ipinatupad sa pamamagitan ng framework na EventKit na may mga klase na EKEventStore at EKCalendar, at sa Android — sa pamamagitan ng mga pahintulot na READ_CALENDAR at WRITE_CALENDAR kasama ng CalendarContract API. Ayon sa Apple Developer Documentation, 2025, para sa pag-access ng kalendaryo sa iOS 18+ kinakailangan ang tahasang kahilingan sa pamamagitan ng system dialog. EventKit ay nagbibigay ng pinag-isang interface para sa pagbasa at paglikha ng mga kaganapan sa lahat ng konektadong kalendaryo.
Mga pangunahing punto
Ang pahintulot sa pag-access sa kalendaryo ay isang mekanismo ng proteksyon ng personal na data na kumokontrol sa pagbasa at pagsulat ng mga kaganapan sa mga application ng kalendaryo ng device. Ang kalendaryo ay naglalaman ng kumpidensyal na impormasyon: mga pagpupulong, mga deadline, mga paalala at mga personal na plano ng gumagamit, kaya inuuri ng mga mobile OS ang pag-access dito bilang kritikal.
Sa iOS, ang pag-access sa kalendaryo ay kinokontrol ng framework na EventKit. Ang application ay maaaring humiling ng access para sa pagbasa at pagsulat ng mga kaganapan, at ang gumagamit ay maaaring tanggapin o tanggihan ang kahilingan sa pamamagitan ng system dialog. Sa Android, ang proteksyon ay batay sa dalawang runtime na pahintulot: READ_CALENDAR at WRITE_CALENDAR.
Ayon sa pananaliksik ng Pew Research Center (2024), humigit-kumulang 45% ng mga gumagamit ng mobile device ay regular na gumagamit ng kalendaryo, at 62% sa kanila ay tumatanggi ng access sa mga application na hindi nagpapaliwanag ng dahilan ng kahilingan ng data ng kalendaryo.
Pangunahing prinsipyo — ang application ay dapat humiling ng access lamang para sa mga function na direktang nauugnay sa kalendaryo: paglikha ng mga paalala, pag-sync ng mga kaganapan, pag-import ng iskedyul.
Sa iOS, ang pag-access sa kalendaryo at mga paalala ay ibinibigay ng isang framework na EventKit. Ang sentral na klase na EKEventStore ay namamahala sa lahat ng operasyon: kahilingan ng pahintulot, pagbasa ng mga kaganapan, paglikha at pag-edit ng mga entry sa kalendaryo. Sa unang tawag ng requestAccess(to:entityType:), ang system ay nagpapakita ng native dialog na may paliwanag.
Ang klase na EKEventStore ay ang entry point sa subsystem ng kalendaryo ng iOS. Upang humiling ng access, dapat tawagan ang pamamaraang requestAccess(to: .event) na nagpapasa ng uri ng entity (kaganapan o paalala). Pagkatapos makuha ang pahintulot, ang EKEventStore ay nagbibigay ng access sa lahat ng kalendaryong konektado sa mga account ng iCloud, Google, Exchange at iba pang provider.
Isang mahalagang katangian: ang EKEventStore ay isang mabigat na bagay, ang paglikha nito ay tumatagal ng oras at kumokonsumo ng mga mapagkukunan. Inirerekomenda na i-initialize ito nang isang beses at muling gamitin sa buong lifecycle ng application. Ayon sa WWDC Session 10117 (2024), inirerekomenda ng Apple ang pag-cache ng instance ng EventStore para sa pag-optimize ng pagganap.
Hindi pinaghihiwalay ng iOS ang mga pahintulot sa pagbasa at pagsulat ng kalendaryo — ang gumagamit ay nagbibigay ng alinman sa buong access o tumatanggi. Gayunpaman, maaaring kontrolin ng application ang mga operasyon sa antas ng code: pagbasa ng mga kaganapan sa pamamagitan ng EKEventStore.event, paglikha sa pamamagitan ng EKEventStore.save at pagtanggal sa pamamagitan ng EKEventStore.remove. Mula noong iOS 18, lumitaw ang posibilidad na humiling ng access lamang sa isang partikular na uri ng entity — .event o .reminder.
Sa iOS 17+ ipinakilala ng Apple ang mekanismo ng pansamantalang access: ang ilang application ay maaaring makakuha ng access sa loob ng 24 na oras pagkatapos ng isang beses na kumpirmasyon ng gumagamit. Ang function na ito ay lalong kapaki-pakinabang para sa mga application na nangangailangan ng kalendaryo nang isang beses lamang — halimbawa, para sa pag-import ng iskedyul ng kumperensya.
Sa Android, ang pag-access sa kalendaryo ay protektado ng dalawang magkahiwalay na pahintulot: READ_CALENDAR at WRITE_CALENDAR. Pareho silang nabibilang sa kategoryang mapanganib at nangangailangan ng runtime na kahilingan. Ang paghihiwalay ng pagbasa at pagsulat ay nagpapahintulot sa gumagamit na maayos na ayusin ang antas ng access ng application.
Ang pahintulot na READ_CALENDAR ay nagbibigay sa application ng kakayahang magbasa ng mga kaganapan mula sa lahat ng kalendaryo ng gumagamit, kabilang ang mga pangalan, oras, kalahok at paglalarawan. Ang pahintulot na WRITE_CALENDAR ay nagpapahintulot sa paglikha, pagbabago at pagtanggal ng mga kaganapan. Pareho ay tinukoy sa manifest sa pamamagitan ng tag na uses-permission at hinihiling sa runtime sa pamamagitan ng ActivityResultLauncher.
Simula sa Android 14 (API 34), binabalaan ng system ang gumagamit kung ang application ay humihiling ng parehong pahintulot nang sabay-sabay. Inirerekomenda na hilingin ang mga ito nang hiwalay: una READ_CALENDAR para sa pagbasa, pagkatapos WRITE_CALENDAR sa unang pagtatangka na lumikha ng kaganapan. Ayon sa Google I/O 2024, ang pamamaraang ito ay nagbabawas ng antas ng pagtanggi ng 23%.
Ang CalendarContract ay isang Android ContentProvider na nag-istruktura ng data ng kalendaryo sa mga relational na talahanayan. Ang mga pangunahing talahanayan: Calendars (listahan ng mga kalendaryo), Events (mga kaganapan), Attendees (mga kalahok), Reminders (mga paalala). Ang pag-access sa data ay isinasagawa sa pamamagitan ng ContentResolver.query() na may pagtukoy ng URI at proyeksyon.
Upang magpasok ng bagong kaganapan, dapat gamitin ang ContentValues na may pagtukoy ng kalendaryo, oras ng pagsisimula at pagtatapos, pamagat at paglalarawan. Ang CalendarContract ay sumusuporta sa mga time zone, paulit-ulit na kaganapan at mga paalala na may nako-configure na interval ng abiso.
Ang pagpapatupad ng kahilingan sa pag-access ng kalendaryo ay nangangailangan ng pagsasaalang-alang sa mga tampok ng platform. Nasa ibaba ang mga halimbawa sa Swift at Kotlin na nagpapakita ng tamang pagtatrabaho sa EventKit at CalendarContract.
Ang kahilingan sa pag-access ng kalendaryo ng iOS ay isinasagawa sa pamamagitan ng pamamaraang requestAccess ng klase na EKEventStore. Ang halimbawa sa ibaba ay nagpapakita ng paglikha ng kaganapan pagkatapos makuha ang pahintulot.
import EventKit
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event) { granted, error in
guard granted else {
print("Access sa kalendaryo ay tinanggihan")
return
}
let event = EKEvent(eventStore: eventStore)
event.title = "Pulong ng koponan"
event.startDate = Date()
event.endDate = Date(timeIntervalSinceNow: 3600)
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
print("Kaganapan ay nilikha: \(event.eventIdentifier)")
} catch {
print("Error sa pag-save: \(error.localizedDescription)")
}
}
Sa Android, ang kahilingan ng mga pahintulot na READ_CALENDAR at WRITE_CALENDAR ay isinasagawa sa pamamagitan ng ActivityResultLauncher. Ang halimbawa ay nagpapakita ng pagbasa ng mga kaganapan mula sa kalendaryo ng gumagamit pagkatapos makuha ang access.
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", "Kaganapan: ${it.getString(titleIndex)}")
}
}
} else {
// Ipakita ang paliwanag at mag-alok na pumunta sa mga setting
requestPermissionSettingsRedirect()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendarPermissionLauncher.launch(
arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
)
}
Ang pagtatrabaho sa mga pahintulot ng kalendaryo ay nangangailangan ng isang pinag-isipang estratehiya na isinasaalang-alang ang mga kinakailangan ng parehong platform at mga inaasahan ng mga gumagamit. Ang pagsunod sa mga rekomendasyon sa ibaba ay tumutulong sa pagpasa ng moderasyon at pagtaas ng porsyento ng pagbibigay ng access.
Humingi ng access sa kalendaryo lamang sa sandaling ang gumagamit ay nagsasagawa ng isang aksyon na nangangailangan ng data ng kalendaryo: “Idagdag sa kalendaryo”, “I-sync ang iskedyul”, “Mag-import ng mga kaganapan”. Ang paunang paliwanag gamit ang pre-permission dialog (sariling dialog bago ang system dialog) ay nagpapataas ng porsyento ng pagsang-ayon ng 35%, ayon sa Localytics (2024).
Sa iOS gamitin ang key na NSCalendarsUsageDescription sa privacy manifest na may tiyak na teksto. Sa halip na “Para sa paglikha ng mga kaganapan” isulat “Para sa pagdaragdag ng mga ehersisyo sa iyong kalendaryo”. Ang tiyak na pagkakabalangkas ay nagpapataas ng conversion ng kahilingan ng 20–30%.
Kung tinanggihan ng gumagamit ang kahilingan, huwag ipakita muli ang system dialog — ito ay hahantong sa pag-activate ng neverAskAgain sa Android o hindi pagiging available ng dialog sa iOS. Sa halip, mag-alok na pumunta sa mga setting sa pamamagitan ng Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) sa Android o UIApplication.openSettingsURLString sa iOS.
Sa muling pagpasok sa screen, suriin ang status ng pahintulot. Sa iOS tawagan ang EKEventStore.authorizationStatus(for: .event) at i-update ang UI ayon sa kasalukuyang status. Sa Android gamitin ang ContextCompat.checkSelfPermission() upang suriin ang kasalukuyang estado at magpasya kung ipapakita ang button ng pag-redirect sa mga setting.
Mga madalas itanong
Ang mga application ay humihingi ng access sa kalendaryo para sa paglikha ng mga kaganapan, pag-sync ng iskedyul, pag-import ng mga deadline at integrasyon sa mga paalala. Mga halimbawa: mga fitness tracker ay nagdaragdag ng mga ehersisyo, mga tagaplano ay lumilikha ng mga gawain, at mga application sa paglalakbay ay nag-iimport ng mga flight sa kalendaryo ng gumagamit.
READ_CALENDAR ay nagbibigay ng access sa pagbasa ng lahat ng kaganapan at kalendaryo ng gumagamit. WRITE_CALENDAR ay nagpapahintulot sa paglikha, pagbabago at pagtanggal ng mga kaganapan. Ang gumagamit ay maaaring magbigay ng isang pahintulot nang wala ang isa, na nagbibigay ng flexible na kontrol sa antas ng access ng application sa data ng kalendaryo.
Buksan ang Mga Setting — Privacy at seguridad — Mga Kalendaryo. Piliin ang application at patayin ang switch ng access. Ang application ay mawawalan ng kakayahang magbasa at lumikha ng mga kaganapan hanggang sa susunod na tahasang kahilingan at kumpirmasyon ng gumagamit.
Ang application ay hindi makakabasa o makakalikha ng mga kaganapan. Ang pamamaraang requestAccess ay magbabalik ng granted = false sa iOS o checkSelfPermission ay magbabalik ng PERMISSION_DENIED sa Android. Ang developer ay dapat magbigay ng graceful degradation — ang application ay patuloy na gumagana nang walang mga function ng kalendaryo, hindi bumabagsak o nagpapakita ng mga error.
Sa iOS, ang ganitong posibilidad ay wala — ang EventKit ay nangangailangan ng buong access para sa anumang operasyon sa mga kaganapan. Sa Android, maaari mong gamitin ang Intent.ACTION_INSERT upang lumikha ng isang kaganapan sa pamamagitan ng system calendar application, na hindi nangangailangan ng runtime na pahintulot, ngunit hindi rin pinapayagan ang pagbasa ng mga umiiral na kaganapan.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din