ios - 带有iOS窗口小部件的EKEventStore错误:[EventKit]客户端尝试打开太多与calaccessd的连接。拒绝打开另一个

原文 标签 ios widget ios13 ekeventstore

我有一个使用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/

相关文章:

ios - 从 UIViewController 显示 UIView 作为上下文菜单预览

ios - Codility 编程测试和 Objective-C 语法

ios - Quickblox iOS : chatRoomDidEnter called multiple times

javascript - 在Primefaces中,如何通过javascript中的小部件类型获取小部件

javascript - 在 jquery 小部件中使用 grep 时 "this"的范围发生变化

widget - 无法在 iOS 14 模拟器中启动主屏幕小部件

ios - 使用 UIActivityViewController 向特定电话号码发送短信

ios - iOS9 RTL上的UIDatePicker翻转

ios - 找不到“此应用程序正在从后台线程修改自动布局引擎”的来源

ios - SwiftUI @Binding 初始化