Сохранение события календаря iOS теперь выдает ошибку

Error pushing dirty properties for EKPersistentLocation to daemon: Error Domain=NSMachErrorDomain Code=4097 "unknown error code"
Connection interrupted!

Любые идеи относительно того, почему я больше не могу сохранять свои события?

    NSString *eventIdentifier = ...
    EKEventStore *store = [EKEventStore new];
    EKEvent *event = [store eventWithIdentifier:eventIdentifier];
    if(event == nil) {
        event = [EKEvent eventWithEventStore:store];
    }

    //fill event code here

    //save event
    NSError *error = nil;
    BOOL success = [store saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
    if(error) {
        @throw error;
    }

    if(!success) {
        @throw [Error ERROR_EVENT_SYNC_FAILED_NO_ERROR];
    }

Интересно, что объект ошибки не генерируется, но успех НЕТ. Код ошибки и сообщение не особенно полезны. Я не уверен, что это значит под грязными свойствами, но я не повторно использую старое событие, а беру его из магазина или каждый раз создаю новое. Я также не знаю, что означает Connection Interrupted.

Любая помощь будет оценена по достоинству.


person kmm3    schedule 09.11.2015    source источник


Ответы (3)


У меня была аналогичная ошибка. Это было вызвано запросом доступа к событиям типа .event и попыткой сохранить напоминание. Если вы сохраняете записи календаря как события, запросите доступ к .event, если вы запрашиваете доступ к напоминаниям, запрашивайте доступ типа .reminder.
Ниже приведен пример запроса доступа к напоминаниям.

    override func viewWillAppear(_ animated: Bool) {
            self.eventStore = EKEventStore()
            self.reminders = [EKReminder]()
            self.eventStore.requestAccess(to: .reminder, completion: requestAccessCompletionHandler)
        }

        func requestAccessCompletionHandler (granted: Bool, error: Error?) {
            NSLog("requestAccessCompletionHandler")
            if (granted) {

                let predicate = self.eventStore.predicateForReminders(in: nil)
                self.eventStore.fetchReminders(matching: predicate, completion: { (reminders: [EKReminder]?) -> Void in
                    self.reminders = reminders
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                })
            } else {
                print("The app is not permitted to access reminders, make sure to grant permission in the settings and try again")
            }
        }
person Larry Ricker    schedule 02.09.2017

Для тех, кому интересно, «грязные свойства» относятся к свойствам EKEvent, которым не назначен правильный тип. «Теперь выдает ошибку» в заголовке было связано с тем, что эта конкретная ветвь кода не вызывалась из-за изменения и правильного кода до того, как она была вызвана.

person kmm3    schedule 09.11.2015

В интересах других людей, которые ищут NSMachErrorDomain Code=4097 в связи с EventKit, я недавно начал видеть этот код при обновлении свойств startDate и endDate повторяющегося события с диапазоном .futureEvents, но не сразу фиксируя изменения.

Вызов:

try eventStore.save(event, span: span, commit: false)

и позже при закрытии экрана редактирования:

try eventStore.save(event, span: span, commit: true)

Второй вызов выдает ошибку, не фиксирует изменения и показывает этот вывод в консоли:

Month 13 is out of bounds [EventKit] Failed to get melted object for frozen object related by key detachedItems. Event store is nil [EventKit] Connection interrupted! [CADXPCProxyHelper] Received error from calaccessd connection: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.apple.calaccessd" UserInfo={NSDebugDescription=connection to service named com.apple.calaccessd}. Attempting to call any reply handler. [EventKit] Error committing event store: [Error Domain=NSMachErrorDomain Code=4097 "unknown error code"]

Редактировать: я обнаружил, что настоящая проблема заключалась в том, что мой первоначальный вызов с commit: false использовал .futureEvents, но моя функция не обновляла выбранный диапазон, поэтому второй вызов по умолчанию был .thisEvent. Кажется, что это несоответствие между пролетами вызывало ошибку.

person blwinters    schedule 08.12.2017