微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以编程方式访问 Apple 提醒应用中列表中的提醒

如何解决如何以编程方式访问 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 举报,一经查实,本站将立刻删除。