如何解决如何以编程方式访问 Apple 提醒应用中列表中的提醒
我想创建一个 nspredicate,它可以访问提醒应用的特定命名列表中的提醒。提醒应用程序能够在命名列表中创建提醒。中描述的 EKReminder 类(或它继承自的 EKCalendar) https://developer.apple.com/doocumentation/eventkit/ekreminder 没有与命名列表相关的属性。如果在 Swift 中包含一个片段,我们将不胜感激。
解决方法
我在 Reminders-cli 中使用了一个编写良好的库来查找 Reminders 应用程序数据库的详细信息。
1 - 所有提醒列表都存储为单独的日历。该列表可以通过
访问private let Store = EKEventStore()
Store.calendars(for: .reminder)
2 - 可以使用以下语句访问特定列表中的提醒(例如:“锻炼”):
reminders.showListItems(withName: "Workout")
3 - 如果列表是“组”的一部分,则列表中的第一项是组的名称。目前尚不清楚如何将组名称标识为“组”。如果您在提醒应用程序中建立一个群组,应用程序中的显示会显示群组名称,并缩进群组的组成部分。
4 - 我的 ContentView.swift 文件
import SwiftUI
import EventKit
//import Reminders ( I chose to insert a copy of the library and added
//an array to store the reminders )
private var reminders = Reminders()
//private var calendar: EKCalendar?
struct ContentView: View {
private var allReminders:[EKReminder]
init() {
if Reminders.requestAccess() {
print("Access granted")
}
reminders.showLists() // prints all the lists in the Reminder database
reminders.showListItems(withName: "Workout")
self.allReminders = reminders.allReminders
print("Number of Reminders: \(self.allReminders.count)")
}
var body: some View {
NavigationView {
List {
ForEach (0 ..< self.allReminders.count) {i in
Text(self.allReminders[i].title)
}
.navigationTitle("Reminders")
}
}
}
5 - 我的库 Reminders.swift 副本
//
// Reminders.swift
//
// Copied from https://github.com/keith/reminders-cli
//
//
import EventKit
import Foundation
private let Store = EKEventStore()
private let dateFormatter = RelativeDateTimeFormatter()
private func formattedDueDate(from reminder: EKReminder) -> String? {
return reminder.dueDateComponents?.date.map {
dateFormatter.localizedString(for: $0,relativeTo: Date())
}
}
private func format(_ reminder: EKReminder,at index: Int) -> String {
let dateString = formattedDueDate(from: reminder).map { " (\($0))" } ?? ""
return "\(index): \(reminder.title ?? "<unknown>")\(dateString)"
}
public final class Reminders {
var allReminders: [EKReminder] = [] // added by me
public static func requestAccess() -> Bool {
let semaphore = DispatchSemaphore(value: 0)
var grantedAccess = false
Store.requestAccess(to: .reminder) { granted,_ in
grantedAccess = granted
semaphore.signal()
}
semaphore.wait()
return grantedAccess
}
func showLists() {
let calendars = self.getCalendars()
for calendar in calendars {
print(calendar.title)
}
}
func showListItems(withName name: String) {
let calendar = self.calendar(withName: name)
let semaphore = DispatchSemaphore(value: 0)
self.reminders(onCalendar: calendar) { reminders in
for (i,reminder) in reminders.enumerated() {
print(format(reminder,at: i))
self.allReminders.append(reminder) // added by me
}
semaphore.signal()
}
semaphore.wait()
}
func complete(itemAtIndex index: Int,onListNamed name: String) {
let calendar = self.calendar(withName: name)
let semaphore = DispatchSemaphore(value: 0)
self.reminders(onCalendar: calendar) { reminders in
guard let reminder = reminders[safe: index] else {
print("No reminder at index \(index) on \(name)")
exit(1)
}
do {
reminder.isCompleted = true
try Store.save(reminder,commit: true)
print("Completed '\(reminder.title!)'")
} catch let error {
print("Failed to save reminder with error: \(error)")
exit(1)
}
semaphore.signal()
}
semaphore.wait()
}
func addReminder(string: String,toListNamed name: String,dueDate: DateComponents?) {
let calendar = self.calendar(withName: name)
let reminder = EKReminder(eventStore: Store)
reminder.calendar = calendar
reminder.title = string
reminder.dueDateComponents = dueDate
do {
try Store.save(reminder,commit: true)
print("Added '\(reminder.title!)' to '\(calendar.title)'")
} catch let error {
print("Failed to save reminder with error: \(error)")
exit(1)
}
}
// MARK: - Private functions
private func reminders(onCalendar calendar: EKCalendar,completion: @escaping (_ reminders: [EKReminder]) -> Void)
{
let predicate = Store.predicateForReminders(in: [calendar])
Store.fetchReminders(matching: predicate) { reminders in
let reminders = reminders?
.filter { !$0.isCompleted }
completion(reminders ?? [])
}
}
private func calendar(withName name: String) -> EKCalendar {
if let calendar = self.getCalendars().find(where: { $0.title.lowercased() == name.lowercased() }) {
return calendar
} else {
print("No reminders list matching \(name)")
exit(1)
}
}
private func getCalendars() -> [EKCalendar] {
return Store.calendars(for: .reminder)
.filter { $0.allowsContentModifications }
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。