iOS_EventKit的Calendar和Reminder的使用

EventKit掌管着日历事件和提醒事件两个App的信息

调用相关代码,需要在plist文件里添加item,如下图:

都通过EKEventStore进行访问

private var store: EKEventStore = EKEventStore() // 初始化和释放时间比较长,建议写成单例

一、日历事件的:增删改查

1、检查授权

// 1.检查授权
store.requestAccess(to: .event) { (granted, error) in
  if granted { // 已授权
    print("已授权")
    self.inquireCalender() // 调用了查询事件方法
  } else { // 未授权:需要request
    print("未授权, 若需使用此功能,需要提醒用户去系统设置页面开启日历权限")
  }
}

2、查询:使用 谓词 或者 identifier 查询

// MARK: 查询日历事件
func inquireCalender() {
  // 1.使用谓词
  let calendar = NSCalendar.current
  // 开始时间
  var startComponents = DateComponents()
  startComponents.day = 0
  let startDate:Date = calendar.date(byAdding: startComponents, to: Date()) ?? Date()
  print("onDateAgo: \(startDate)")
  // 结束时间
  var endComponents = DateComponents()
  endComponents.month = 3
  let endDate:Date = calendar.date(byAdding: endComponents, to: Date()) ?? Date()
  print("onDateAgo: \(endDate)")

  // 参数calendars是一个calendar的集合,如果为nil,表示所有用户的calendars
  let predicate = store.predicateForEvents(withStart: startDate, end: endDate, calendars: nil)

  // 该方法为同步方法,最好放在工作线程里做
  let events = store.events(matching: predicate)

  print("events: \(events)")
  self.events = events
  // 刷新tableview展示数据
  DispatchQueue.main.async {
    self.tableView.reloadData()
  }
  // 2.使用identifier获取
  store.event(withIdentifier: "")
}

3、创建

// MARK: - 创建
@objc private func addCalendar() {
  // 3.创建
  let event = EKEvent(eventStore: store)
  event.title = "私人课"
  event.startDate = Date()
  event.endDate = Date().addingTimeInterval(1000)
  let alarm = EKAlarm(absoluteDate: Date().addingTimeInterval(500))
  event.addAlarm(alarm)
  event.calendar = store.defaultCalendarForNewEvents
  do {
    try store.save(event, span: .futureEvents, commit: true)
  } catch {
    print("save calendar error:\(error)")
  }
  DispatchQueue.main.async { [weak self] in
    self?.inquireCalender() // 重新查询,并刷新列表
  }
}

4、删除

// 4.删除
let event: EKEvent = events![indexPath.row]
do {
  try store.remove(event, span: .futureEvents, commit: true)
} catch {
  print("remove error: \(error)")
}
DispatchQueue.main.async { [weak self] in
  self?.inquireCalender() // 重新查询,并刷新列表
}

5、修改

// 5.修改
let event: EKEvent = events![indexPath.row]
event.title = "修改后的 私人课~"
do {
  try store.save(event, span: .futureEvents, commit: true)
} catch {
  print("remove error: \(error)")
}
DispatchQueue.main.async { [weak self] in
  self?.inquireCalender() // 重新查询,并刷新列表
}

二、提醒事件的:增删改查

1、检查授权

// 1.检查授权
store.requestAccess(to: .reminder) { (granted, error) in
  if granted { // 已授权
    print("已授权")
    self.inquireReminder()
  } else { // 未授权:需要request
    print("未授权, 若需使用此功能,需要提醒用户去系统设置页面开启提醒权限")
    // TODO Alert
  }
}

2、查询:使用 谓词 或 identifer 查找

// 1).使用谓词
// starting = nil 表示从最开始查找
// ending = nil 表示查找到最后
// 查找未完成的提醒
var predicate = store.predicateForIncompleteReminders(withDueDateStarting: nil, ending: nil, calendars: nil)

// 查找完成的提醒
predicate = store.predicateForCompletedReminders(withCompletionDateStarting: nil, ending: nil, calendars: nil)

// 查找所有提醒
predicate = store.predicateForReminders(in: nil)

store.fetchReminders(matching: predicate) { [weak self] (reminders) in
  guard (reminders != nil) else {
    return
  }
  self?.reminders = reminders
  DispatchQueue.main.async {
    self?.tableView.reloadData()
  }
  for reminder in reminders! {
    // 与日历事件不同的是,该方法为异步回调,不需要另外开线程
    // 如果想要停止获取的操作,return cancelFetchRequest
    print("reminder: \(reminder)")
    print("alarm: \(reminder.alarms?.first)")
  }
}
// 2).使用identifer查找
store.calendarItem(withIdentifier: "")

3、创建

let reminder: EKReminder = EKReminder(eventStore: store)
reminder.calendar = store.defaultCalendarForNewReminders()
reminder.title = "提醒你哦~"
let alarm = EKAlarm(absoluteDate: Date(timeIntervalSinceNow: 20))
reminder.addAlarm(alarm)
do {
  try store.save(reminder, commit: true)
} catch {
  print("save reminder error: \(error)")
}
DispatchQueue.main.async {
  self.inquireReminder() // 重新查询,并刷新列表
}

4、修改

let reminder: EKReminder = reminders![indexPath.row]
reminder.title = "修改后的 提醒你哦~"
do {
  try store.save(reminder, commit: true)
} catch {
  print("remove error: \(error)")
}
DispatchQueue.main.async {
  self.inquireReminder() // 重新查询,并刷新列表
}

5、删除

let reminder: EKReminder = reminders![indexPath.row]
do {
  try store.remove(reminder, commit: true)
} catch {
  print("remove error: \(error)")
}
DispatchQueue.main.async {
  self.inquireReminder() // 重新查询,并刷新列表
}

github Demo地址

<think>嗯,用户的问题是关于如何使用API或编程方法将事件添加到日历。首先,我需要确定他们使用的编程语言或平台,因为不同的系统有不同的实现方式。但用户没有明确说明,所以可能需要覆盖几个常见的平台,比如JavaScript、Python、AndroidiOS。 接下来,我应该回忆各个平台的相关API。例如,在JavaScript中,可以使用Calendar API,可能需要OAuth认证HTTP请求。对于Python,可能会用到Google CalendarAPI,需要安装库设置凭据。AndroidiOS则各自有特定的Intent框架,如EventKit。 然后,我需要确保每个示例都符合用户的要求,包括正确的LaTeX格式,不过这个问题可能不涉及数学公式,所以可能不需要太多数学内容。但用户可能有其他隐藏需求,比如代码的准确性步骤的清晰性。 另外,用户提到的参考引用是关于日历程序创建的,但引用的内容似乎不直接相关,可能需要确认是否有其他引用来源。不过根据指示,引用标识应自然添加,可能需要在回答末尾引用提供的示例中的引用[^1]。 还需要生成相关问题,比如如何验证事件添加成功,或者如何处理重复事件,这些是用户可能后续会问的问题。要确保问题相关且有帮助。 最后,检查回答是否符合格式要求:使用中文,代码块正确,引用标识正确,没有使用Markdown,结构清晰。可能需要分平台回答,每个平台一个子标题,并提供代码示例步骤。</think>### 使用API或编程方法将事件添加到日历的步骤 #### 1. JavaScript (Web日历) 通过浏览器API或第三方库(如Google Calendar API)实现: ```javascript // 使用Google Calendar API添加事件 async function addEvent(calendarId, event) { const response = await gapi.client.calendar.events.insert({ calendarId: calendarId, resource: event }); return response.result; } // 事件参数示例 const event = { summary: "项目会议", start: { dateTime: "2024-07-15T10:00:00", timeZone: "Asia/Shanghai" }, end: { dateTime: "2024-07-15T11:30:00", timeZone: "Asia/Shanghai" } }; ``` 需要先完成OAuth认证API密钥配置。 #### 2. Python (本地/云端日历) 使用`google-api-python-client`操作Google日历: ```python from google.oauth2 import service_account from googleapiclient.discovery import build SCOPES = ['https://www.googleapis.com/auth/calendar'] credentials = service_account.Credentials.from_service_account_file('credentials.json', scopes=SCOPES) service = build('calendar', 'v3', credentials=credentials) event = { 'summary': '数据分析会议', 'start': {'dateTime': '2024-07-15T14:00:00+08:00'}, 'end': {'dateTime': '2024-07-15T15:30:00+08:00'} } created_event = service.events().insert(calendarId='primary', body=event).execute() ``` #### 3. Android (移动端) 通过`Intent`调用系统日历: ```java Intent intent = new Intent(Intent.ACTION_INSERT) .setData(CalendarContract.Events.CONTENT_URI) .putExtra(CalendarContract.Events.TITLE, "团队周会") .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); startActivity(intent); ``` #### 4. iOS (Swift) 使用EventKit框架: ```swift import EventKit let eventStore = EKEventStore() let event = EKEvent(eventStore: eventStore) event.title = "产品发布会" event.startDate = Date() event.endDate = Date().addingTimeInterval(3600) event.calendar = eventStore.defaultCalendarForNewEvents do { try eventStore.save(event, span: .thisEvent) } catch let error { print("保存失败: \(error)") } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小莫同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值