Swift.Событие не сохраняется в календаре - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь скопировать определенные события из всех календарей в целевой календарь.К сожалению, мои события не сохраняются в целевом календаре.

Просто мой код по шагам:

  • Проверка разрешений (успех)
  • Загрузка календарей (успех)
  • Загрузка событий (успех)
  • Сохранение событий (сбой)

Я уверен, что есть события, которые нужно сохранить с терминала, который выводит «Попытка сохранить» пару раз.

И похоже, что код проходит через "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) за сотни, которые должны сэкономить.Понятия не имею почему.Так что 5 на 200 для меня недостаточно.

1 Ответ

0 голосов
/ 11 июня 2018

Спасибо @matt за предложение решения.

Теперь я сохраняю события ОДНАЖДЫ (ранее я запрашивал доступ для каждого очень плохого события), поэтому я запрашиваю доступ к 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")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...