【问题标题】:Swift 4.0 Eventkit Cannot get calendars and events correctlySwift 4.0 Eventkit 无法正确获取日历和事件
【发布时间】:2018-03-28 03:25:11
【问题描述】:

我正在尝试使用 Eventkit 访问 Mac 日历。 已成功请求访问权限,但我不断收到 nil 或日历或事件数组为空,即使我在本地日历、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)

如果我尝试从代码创建和保存日历,则会出现错误: Error Domain=EKErrorDomain Code=5 "当持久性不可用时尝试保存" UserInfo={NSLocalizedDescription=当持久性不可用时尝试保存}

【问题讨论】:

  • 来自文档:developer.apple.com/documentation/eventkit/ekerror/code/… 此错误代码“5”是内部错误。其次,“我从以下代码得到的输出是:在我的 Mac [] [] 上”你有 4 个打印语句,但在问题输出中只显示 2 个
  • @art-divin 第二个打印语句永远不会执行,因为没有日历。

标签: swift icalendar eventkit


【解决方案1】:

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

您需要在您的权利文件中将 com.apple.security.personal-information.calendars 键设置为 YES,即使您的应用没有沙盒化。 Apple 的 EventKit 实现中存在一个错误,该错误会阻止您的应用访问如果它没有设置这个键,即使沙盒被禁用,日历也是如此。

【讨论】:

    【解决方案2】:

    我可能是错的,但是您在传递 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)
    

    【讨论】:

    • 此更改是明智的,但此问题的根本原因是由于权限错误,调用 eventStore.calendars() 时未枚举日历(请参阅我的答案)。跨度>
    • 感谢您的澄清。很好,您已经设法找到问题的根本原因。
    【解决方案3】:

    试试这个方法

    创建和获取日历

    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
              }
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多