我有一个使用EKEventStore
处理提醒的iOS小部件。小部件仅初始化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) {
}];
我了解在小部件的同一 session 中多次初始化
EKEventStore
可能是一个问题。但是,当用户离开窗口小部件时,我希望从开始重新加载窗口小部件时重置初始化EKEventStore
的次数有限。
最佳答案
实现一个共享的singleton类,以如下方式管理EKEventStore
,在应用程序和扩展程序(窗口小部件)中都使用singleton:
+(EventStoreManager *)sharedInstance {
static dispatch_once_t onceToken;
static EventStoreManager * eventStoreSharedInstance;
dispatch_once(&onceToken, ^{
eventStoreSharedInstance = [[EventStoreManager alloc] init];
});
return eventStoreSharedInstance;
}
这样就解决了上述问题。即使扩展名或窗口小部件被销毁,该单例也将保留。
感谢Apple支持提供此修复程序。
关于ios - 带有iOS窗口小部件的EKEventStore错误:[EventKit]客户端尝试打开太多与calaccessd的连接。拒绝打开另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58160810/