通過 EventKit 可以對 iOS 日歷事件進(jìn)行讀取,添加等操作彰居。但網(wǎng)上找到的都是使用 Objective-C 來編寫的诚纸。
下面提供一個(gè) Swift 版的樣例,演示如何添加一個(gè)事件以及獲取所有的事件列表陈惰。
1畦徘、首先配置info.plist
從 iOS10 起,蘋果增強(qiáng)對用戶的安全和隱私的保護(hù)抬闯。在申請很多私有權(quán)限的時(shí)候都需要添加描述井辆。我們這里需要訪問日歷,那就需要在 info.plist 添加日歷相關(guān)的描述字段溶握。
字段名:NSCalendarsUsageDescription 杯缺。描述隨便,我這里就寫“App需要您的同意,才能訪問日歷”奈虾。
2夺谁、代碼如下(已升級至Swift5)
import UIKit
import EventKit
class ViewController: UIViewController {
override func viewDidLoad()
{
super.viewDidLoad()
localEventStore()
}
// 插入一個(gè)新事件,并查詢前后90天的事件
func eventStore()
{
let eventStore = EKEventStore()
// 'EKEntityType.reminder' or 'EKEntityType.event'
eventStore.requestAccess(to: .event, completion: { (granted, error) in
if (granted) && (error == nil) {
print("granted \(granted)")
print("error \(error)")
// 新建一個(gè)事件
let event:EKEvent = EKEvent(eventStore: eventStore)
event.title = "新增一個(gè)測試事件"
event.startDate = Date()
event.endDate = Date()
event.notes = "這個(gè)是備注"
event.calendar = eventStore.defaultCalendarForNewEvents
do{
try eventStore.save(event, span: .thisEvent)
print("Saved Event")
}catch{}
// 獲取所有的事件(前后90天)
let startDate = Date().addingTimeInterval(-3600*24*90)
let endDate = Date().addingTimeInterval(3600*24*90)
let predicate2 = eventStore.predicateForEvents(withStart: startDate,
end: endDate, calendars: nil)
print("查詢范圍 開始:\(startDate) 結(jié)束:\(endDate)")
if let eV = eventStore.events(matching: predicate2) as [EKEvent]? {
for i in eV {
print("標(biāo)題 \(i.title)" )
print("開始時(shí)間: \(i.startDate)" )
print("結(jié)束時(shí)間: \(i.endDate)" )
}
}
}
})
}
//從上面的運(yùn)行結(jié)果可以看出肉微,我們把系統(tǒng)中所有的日歷事件都查詢出來了匾鸥,不管是本地日歷事件(如果有iCloud同步則是iCloud日歷),還是系統(tǒng)自帶的節(jié)假日碉纳、生日日歷事件勿负。如果我們只關(guān)注本地日歷事件,可以在查詢的時(shí)候添加個(gè)日歷參數(shù)即可劳曹。代碼如下奴愉。
// 查詢本地日歷前后90天的事件
func localEventStore()
{
let eventStore = EKEventStore()
// 請求日歷事件
eventStore.requestAccess(to: .event, completion: {
granted, error in
if (granted) && (error == nil) {
print("granted \(granted)")
print("error \(error)")
//獲取本地日歷(剔除節(jié)假日,生日等其他系統(tǒng)日歷)
let calendars = eventStore.calendars(for: .event).filter({
(calender) -> Bool in
return calender.type == .local || calender.type == .calDAV
})
// 獲取所有的事件(前后90天)
let startDate = Date().addingTimeInterval(-3600*24*90)
let endDate = Date().addingTimeInterval(3600*24*90)
let predicate2 = eventStore.predicateForEvents(withStart: startDate,
end: endDate, calendars: calendars)
print("查詢范圍 開始:\(startDate) 結(jié)束:\(endDate)")
if let eV = eventStore.events(matching: predicate2) as [EKEvent]? {
for i in eV {
print("標(biāo)題 \(i.title)" )
print("開始時(shí)間: \(i.startDate)" )
print("結(jié)束時(shí)間: \(i.endDate)" )
}
}
}
})
}
}
原文出自:www.hangge.com 轉(zhuǎn)載請保留原文鏈接:https://www.hangge.com/blog/cache/detail_644.html