iOS 17下使用EventKit向原生提醒应用添加事项失败,求排查
iOS 17.0 原生提醒应用添加事项问题排查与修复
核心问题:权限请求方法错误
你的代码中申请提醒事项权限时,错误调用了requestFullAccessToEvents——这是日历事件的权限申请接口,提醒事项必须使用requestFullAccessToReminders。iOS 17+对EventKit的事件和提醒权限做了严格区分,用错接口会导致无法获取提醒的访问权限,直接导致添加操作失败。
修复后的权限申请代码:
func requestAccessForReminders() { let status = EKEventStore.authorizationStatus(for: .reminder) if status == .authorized { print("已获取提醒事项访问权限") } else { eventStore.requestFullAccessToReminders { success, error in if success { print("提醒事项访问权限申请成功") } else { print("提醒事项权限申请失败:\(error?.localizedDescription ?? "未知错误")") } } } }
次要问题:未利用时间参数(功能缺失)
你定义的addEventToReminders方法接收了起始时间和时长参数,但没有将这些信息绑定到提醒事项上,导致创建的是无时间属性的待办。可以通过添加EKAlarm和设置截止时间来补全功能:
func addEventToReminders(title: String, startHour: Int, startMinute: Int, duration: Int) { guard let targetCalendar = eventStore.defaultCalendarForNewReminders() else { print("无法获取默认提醒日历") return } let newReminder = EKReminder(eventStore: eventStore) newReminder.title = title newReminder.calendar = targetCalendar // 构建提醒时间 let reminderDateComponents = DateComponents(hour: startHour, minute: startMinute) if let reminderTime = Calendar.current.date(from: reminderDateComponents) { // 添加提醒闹钟 newReminder.addAlarm(EKAlarm(absoluteDate: reminderTime)) // 设置截止时间(基于传入的时长) let dueTime = reminderTime.addingTimeInterval(TimeInterval(duration * 60)) newReminder.dueDateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: dueTime) } do { try eventStore.save(newReminder, commit: true) print("提醒事项添加成功") } catch { print("添加提醒失败:\(error.localizedDescription)") } }
Info.plist配置注意事项
确保正确配置了提醒事项的权限描述键:
- 键:
NSRemindersUsageDescription - 值:清晰说明App访问提醒的用途(例如"为您创建和管理待办事项")
如果仅处理提醒事项,无需重复添加日历权限的描述,避免混淆。
额外注意事项
- 添加提醒前必须确认权限已授权,建议在权限申请成功的回调中触发添加操作,或者先检查
EKEventStore.authorizationStatus(for: .reminder)的状态。 EKEventStore实例复用是合理的,你的代码中已将其设为类属性,无需修改。
内容的提问来源于stack exchange,提问作者matiasortizluna
相关产品推荐
相关产品推荐

