Доступ к событиям iCloud Calendar - macOS App - PullRequest
1 голос
/ 23 сентября 2019

Я хочу получить доступ к событиям календаря пользователей iCloud в приложении для macOS.Во время исследования я нашел несколько учебных пособий для iOS, но я не смог найти ту, которая работает на macOS.Я пытался понять Документацию разработчика Apples для EventKit, но мне не удалось его запустить.

Вот что я сделал:

1 - Доступ к хранилищу событий

1.1 Я изменил ключ 'com.apple.security.personal-information.calendars' на YES в файле разрешений ( Вопрос переполнения стека относительно этого ).

Снимок экрана с .entitlement проекта:

img

1,2 После этого я попытался запросить доступ (в viewDidLoad)

let eventStore = EKEventStore()

    switch EKEventStore.authorizationStatus(for: .event) {
    case .authorized:
        print("Acess granted")

    case .denied:
        print("Access denied")

    case .notDetermined:
        eventStore.requestAccess(to: .event, completion: {
            (granted, error) in

            if granted {
                print("granted \(granted)")

            }else {
                print("error \(String(describing: error))")
            }

        })
    default:
        print("Case default")
    }

2 - получение событий календаря

let sources = eventStore.sources
    for source in sources{
        print(source.title)
        for calendar in source.calendars(for: .event){
            print(calendar.title)
        }
    }

    // create dates
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy/MM/dd HH:mm"

    let startDate = formatter.date(from: "2019/9/12 0:01")!
    let endDate = formatter.date(from: "2019/9/12 23:59")!


    let calendars = eventStore.calendars(for: .event)
    let predicate = eventStore.predicateForEvents(withStart: startDate, end: endDate, calendars: calendars)
    let events = eventStore.events(matching: predicate)
    print(calendars)
    print(events)

Когда я запускаю это приложение, я получаю следующий вывод консоли:

getCalendarEvents[1970:100712] CoreData: XPC: Unable to load metadata: Error Domain=NSCocoaErrorDomain Code=134070 "An error occurred in the persistent store." UserInfo={Problem=request failed, insufficient permission}
2019-09-23 18:35:24.981947+0200 getCalendarEvents[1970:100712] [error] error: -addPersistentStoreWithType:NSXPCStore configuration:(null) URL:file:///Users/henri/Library/Calendars/Calendar%20Cache options:{
    NSInferMappingModelAutomaticallyOption = 1;
    NSMigratePersistentStoresAutomaticallyOption = 1;
    NSPersistentHistoryTrackingKey =     {
        NSPersistentHistoryTrackingEntitiesToExclude =         (
            ChangeRequest
        );
    };
    agentOrDaemon = 1;
    serviceName = "com.apple.CalendarAgent.database";
} ... returned error Error Domain=NSCocoaErrorDomain Code=134070 "An error occurred in the persistent store." UserInfo={Problem=request failed, insufficient permission} with userInfo dictionary {
    Problem = "request failed, insufficient permission";
}
CoreData: error: -addPersistentStoreWithType:NSXPCStore configuration:(null) URL:file:///Users/henri/Library/Calendars/Calendar%20Cache options:{
    NSInferMappingModelAutomaticallyOption = 1;
    NSMigratePersistentStoresAutomaticallyOption = 1;
    NSPersistentHistoryTrackingKey =     {
        NSPersistentHistoryTrackingEntitiesToExclude =         (
            ChangeRequest
        );
    };
    agentOrDaemon = 1;
    serviceName = "com.apple.CalendarAgent.database";
} ... returned error Error Domain=NSCocoaErrorDomain Code=134070 "An error occurred in the persistent store." UserInfo={Problem=request failed, insufficient permission} with userInfo dictionary {
    Problem = "request failed, insufficient permission";
}
[]
[]
error nil

Я ожидал двух массивов:

[EKCalendar] и [EKEvent]

Я думаю, мне действительно нужна помощь, я много пробовал, но я относительно новичок в разработке SwiftМожет кто-нибудь помочь мне?

Спасибо!

1 Ответ

0 голосов
/ 24 сентября 2019

Причина, по которой вы не можете получить доступ к EKEventStore, заключается в том, что вам нужно предоставить строку описания того, почему вы хотите это сделать.Эта строка будет использоваться MacOS для предоставления пользователю объяснения, почему ваше приложение хочет иметь доступ к календарю пользователя.Эта строка должна поставляться с ключом NSCalendarsUsageDescription в файле info.plist вашего приложения, как описано здесь .Несмотря на то, что это часто говорится в документации, которая необходима для приложений iOS, она также была необходима для приложений Mac начиная с MacOS Mojave, как описано здесь .

...