迅速。活动未保存到日历

时间:2018-06-10 22:19:29

标签: ios swift eventkit

我正在尝试将所有日历中的特定事件复制到目标日历。不幸的是,我的活动没有保存在目标日历中。

我的代码只是步骤:

  • 检查权限(成功)
  • 加载日历(成功)
  • 加载事件(成功)
  • 保存事件(失败)

我确信有一些事件可以从终端保存,打印“试图保存”几次。

看起来代码通过“try self.eventStore.save(event,span:.thisEvent)”并在那里退出函数而不调用“Saved”或输入catch子句。

有源代码:

import UIKit
import EventKit

class ViewController: UIViewController{

    @IBOutlet weak var status: UILabel!

    var calendars: [EKCalendar]?

    var targetCalendar: EKCalendar?
    var targetCalendarEvents: [EKEvent]?

    let eventStore = EKEventStore()

    let targetCalendarName = "TargetCalendarName"

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(_ animated: Bool) {
        DispatchQueue.main.async{
            self.status.text = "Idle"
        }

        checkCalendarAuthorizationStatus()
    }

    func checkCalendarAuthorizationStatus() {
        let status = EKEventStore.authorizationStatus(for: EKEntityType.event)

        switch (status) {
        case EKAuthorizationStatus.notDetermined:
            // This happens on first-run
            requestAccessToCalendar()
        case EKAuthorizationStatus.authorized:
            // Things are in line with being able to show the calendars in the table view
            loadCalendars()
            loadEvents()
        case EKAuthorizationStatus.restricted, EKAuthorizationStatus.denied:
            // We need to help them give us permission
            print("Missing permissions [00]")
        }
    }

    func requestAccessToCalendar() {
        eventStore.requestAccess(to: EKEntityType.event, completion: {
            (accessGranted: Bool, error: Error?) in

            if accessGranted == true {
                DispatchQueue.main.async(execute: {
                    self.loadCalendars()
                    self.loadEvents()
                })
            } else {
                print("Missing permissions [01]")
            }
        })
    }

    func loadEvents(){
        print("Loading..")
        DispatchQueue.main.async{
            self.status.text = "Loading"
        }

        let eventStore = EKEventStore()

        var initialized = false

        //Two months
        let dateTo = NSDate(timeIntervalSinceNow: +30*24*3600 * 2)

        for calendar in self.calendars! {
            let predicate = eventStore.predicateForEvents(withStart: Date() as Date as Date, end: dateTo as Date, calendars: [calendar])

            let events = eventStore.events(matching: predicate)

            if calendar.title == targetCalendarName  {
                print("Initialized")
                targetCalendar = calendar
                targetCalendarEvents = events
                initialized = true
            }
        }

        if(!initialized){
            print("Not Initialized")
        } else {
            for calendar in self.calendars! {

                let predicate = eventStore.predicateForEvents(withStart: Date() as Date as Date, end: dateTo as Date, calendars: [calendar])

                let events = eventStore.events(matching: predicate)

                if calendar.title != targetCalendarName && calendar.title != "Contacts" {

                    //print("Loaded Calendar \(calendar.title)")
                    print("Loaded Calendar")

                    for event in events {
                        if(!(event.location?.isEmpty)!){
                            //print("Event \(event.location ?? "Missing Location") \(event.startDate) \(event.endDate)")

                            addEventToTarget(eventToAdd: event)
                        }
                    }
                }
            }
        }


        DispatchQueue.main.async {
            self.status.text = "Done"
        }
        print("Done")
    }

    func loadCalendars() {
        self.calendars = eventStore.calendars(for: EKEntityType.event)
    }

    func addEventToTarget(eventToAdd: EKEvent){

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

            for event in self.targetCalendarEvents! {
                if(!(event.location?.isEmpty)!){
                    if(
                        eventToAdd.title == event.title &&
                        eventToAdd.startDate == event.startDate &&
                        eventToAdd.endDate == event.endDate
                    ){
                        print("Possible duplicate - skipping")
                        return
                    }
                }
            }

            if (granted) && (error == nil) {

                let event:EKEvent = EKEvent(eventStore: self.eventStore)

                event.title = eventToAdd.title
                event.startDate = eventToAdd.startDate
                event.endDate = eventToAdd.endDate
                event.notes = ""
                event.location = eventToAdd.location

                event.calendar = self.targetCalendar

                //print("Trying to save \(event.title) \(String(describing: event.location))")
                print("Trying to save")
                do {
                    try self.eventStore.save(event, span: .thisEvent)
                    print("Saved \(event.title) \(String(describing: event.location)) in \(event.calendar.title)")
                } catch {
                    print("failed to save event with error : \(error as NSError)")
                }
            }
            else{

                print("failed to save event with error : \(String(describing: error)) or access not granted")
            }
        }
    }
}

TargetCalendarName是正确的日历名称

有时会有成功保存的事件,但只有几个(2-5)成功保存。我不知道为什么。 因此对于我来说,200对我来说是不够的。

1 个答案:

答案 0 :(得分:1)

感谢@matt提出解决方案。

现在我保存事件ONCE(以前我请求访问每个非常糟糕的事件),所以我请求访问eventStore一次,并且可以成功保存事件。

func saveEvents(){
    eventStore.requestAccess(to: .event) { (granted, error) in

        if (granted) && (error == nil) {

            for event in self.eventsToCopy {
                print("Trying to save")
                do {
                    try self.eventStore.save(event, span: .thisEvent)
                    print("Saved \(event.title) \(String(describing: event.location)) in \(event.calendar.title)")
                } catch {
                    print("failed to save event with error : \(error as NSError)")
                }
            }
        }
        else{

            print("failed to save event with error : \(String(describing: error)) or access not granted")
        }
    }
}