EKEventStore с ошибкой виджета iOS: [EventKit] Клиент попытался открыть слишком много подключений к calaccessd. Отказ открыть другое - PullRequest
1 голос
/ 30 сентября 2019

У меня есть виджет iOS, который использует EKEventStore для работы с напоминаниями. Виджет инициализирует EKEventStore только один раз, а затем использует этот экземпляр. Виджеты обычно создаются при просмотре в сегодняшнем viewController и уничтожаются, когда у пользователя есть центр уведомлений. Это приводит к инициализации EKEventStore каждый раз, когда пользователь просматривает виджет. После 10 раз подряд просмотра виджета возникает следующая ошибка:

[EventKit] Client tried to open too many connections to calaccessd. Refusing to open another

Я диагностировал проблему и обнаружил, что это происходит после 10 просмотров виджета. Чтобы воспроизвести это, вам нужно открыть другое приложение, а затем каждый раз возвращаться к виджету, чтобы перезагрузить виджет при его просмотре.

Я правильно инициализирую EKEventStore следующим образом:

self.eventStore = [[EKEventStore alloc] init];
[self.eventStore requestAccessToEntityType:EKEntityTypeReminder
                                                   completion:^(BOOL granted, NSError *error) {

}];

Я понимаю, что это может быть проблемой для инициализации EKEventStore несколько раз в одном сеансе виджета. Но когда пользователь уходит из виджета, я ожидаю, что это ограниченное число раз инициализации EKEventStore будет сброшено при перезагрузке виджета с самого начала.

1 Ответ

0 голосов
/ 18 октября 2019

Реализуйте общий синглтон-класс для управления EKEventStore следующим образом, используйте синглтон как в приложении, так и в расширении (виджете):

+(EventStoreManager *)sharedInstance {
    static dispatch_once_t onceToken;
    static EventStoreManager *  eventStoreSharedInstance;

    dispatch_once(&onceToken, ^{
        eventStoreSharedInstance = [[EventStoreManager alloc] init];
    });
    return eventStoreSharedInstance;
}

Это решило вышеуказанную проблему. Этот синглтон поддерживается даже тогда, когда расширение или виджет уничтожены. Благодаря поддержке Apple за предоставление этого исправления.

...