Swift 4.0 Eventkit无法正确获取日历和事件

时间:2018-03-28 03:25:11

标签: swift icalendar eventkit

我尝试使用Eventkit访问Mac日历。 虽然我在应用程序中有本地日历,iCloud日历和Google日历中的多个日历和许多事件,但我已成功请求访问,但我一直收到零或一系列日历或事件。 我从以下代码得到的输出是: 在我的Mac上 [] []

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

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

如果我尝试从代码创建并保存日历,那么我会收到错误: 错误域= EKErrorDomain代码= 5"在持久性不可用时尝试保存" UserInfo = {NSLocalizedDescription =在持久性不可用时尝试保存}

3 个答案:

答案 0 :(得分:5)

经过反复试验,我找到了答案。

您需要在权利文件中将com.apple.security.personal-information.calendars键设置为YES,即使您的应用未进行沙箱测试也是如此。 Apple的EventKit实现中存在一个错误,该错误会阻止您的应用获取即使未禁用沙箱,也可以访问日历(如果未设置此键)。

答案 1 :(得分:0)

我可能是错的,但是您在谓词中缺少一个参数,因此您传入nil,因此基本上没有任何排序的输出。尝试将代码更改为:

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

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

答案 2 :(得分:0)

尝试此方法

创建并获取日历

func getCalendar() -> EKCalendar? {
        let defaults = UserDefaults.standard
    
        if let id = defaults.string(forKey:"calendarID") {
            return eventStore.calendar(withIdentifier: id)
          } else {
            let calendar = EKCalendar(for: .event, eventStore: eventStore)
    
               calendar.title = "Calendar Title"
               calendar.cgColor = UIColor.blue
               calendar.source = self.eventStore.defaultCalendarForNewEvents!.source
    
             do {
                 try eventStore.saveCalendar(calendar, commit: true)
                 defaults.set(calendar.calendarIdentifier, forKey: "calendarID")
    
                 print("Created calander")
               } catch let error as NSError {
               print("failed to Create calendar with error : \(error)")
               }
            
    
              return calendar
          }
      }