简体   繁体   English

EKEventStore导致SpringBoard崩溃

[英]EKEventStore causes SpringBoard crash

I build an application that fetches ekevents from calendar (by EKEventStore predicateForEventsWithStartDate:endDate:calendars: ) and synchronize app-events with calendars (with EKEventStore saveEvent:span:commit:error: ). 我构建了一个从日历获取ekevent的应用程序(通过EKEventStore predicateForEventsWithStartDate:endDate:calendars: :),并将应用程序事件与日历同步(通过EKEventStore saveEvent:span:commit:error:

I use a static reference to the EKEventStore and make sure that the EKEventStore is not accessed simultaneously by my different processes. 我使用对EKEventStore的静态引用,并确保不同进程不会同时访问EKEventStore

The app is sometimes terminated by a Springboard crash on IOS7. 该应用有时会因IOS7上的Springboard崩溃而终止。 Here is a backtrace of the crash. 这是崩溃的回溯。

Last Exception Backtrace:
0   CoreFoundation                  0x18625e950 __exceptionPreprocess + 132
1   libobjc.A.dylib                 0x1927641fc objc_exception_throw + 60
2   CoreFoundation                  0x18625e810 +[NSException raise:format:arguments:] +     116
3   Foundation                      0x186d96db4 -[NSAssertionHandler     handleFailureInMethod:object:file:lineNumber:description:] + 112
4   EventKit                        0x186adab84 -[EKEventStore _addFetchedObjectWithID:] + 240
5   EventKit                        0x186adaa64 __78-[EKEventStore registerFetchedObjectWithID:withDefaultLoadedProperties:inSet:]_block_invoke + 96
6   libdispatch.dylib               0x192d3bfd4 _dispatch_client_callout + 16
7   libdispatch.dylib               0x192d41c84 _dispatch_barrier_sync_f_invoke + 48
8   EventKit                        0x186ada990 -[EKEventStore     registerFetchedObjectWithID:withDefaultLoadedProperties:inSet:] + 148
9   EventKit                        0x186ae1458 __41-[EKPredicateSearch startWithCompletion:]_block_invoke + 796
10  EventKit                        0x186ae1050 -[EKDaemonConnection _processReplyWithID:data:finished:] + 220
11  EventKit                        0x186ae0f5c CADReceiveReply + 136
12  EventKit                        0x186ae0eac _XReply + 124
13  EventKit                        0x186ae0e04 ClientCallbacks_server + 100
14  libdispatch.dylib               0x192d3fae8 dispatch_mig_server + 352
15  EventKit                        0x186ae0d6c __43-[EKDaemonConnection initWithOptions:path:]_block_invoke16 + 44
16  libdispatch.dylib               0x192d3bfd4 _dispatch_client_callout + 16
17  libdispatch.dylib               0x192d3db90 _dispatch_source_invoke + 500
18  libdispatch.dylib               0x192d430f4 _dispatch_root_queue_drain + 104
19  libdispatch.dylib               0x192d434fc _dispatch_worker_thread2 + 76
20  libsystem_pthread.dylib         0x192ed16bc _pthread_wqthread + 356
21  libsystem_pthread.dylib         0x192ed154c start_wqthread + 4

Here is my code initalizing my ekeventstore: 这是初始化ekeventstore的代码:

+ (EKEventStore *) sharedStore {
     static EKEventStore *sharedEventStore;

    if (sharedEventStore == nil) {
        sharedEventStore = [[EKEventStore alloc] init];
        [sharedEventStore requestAccessToEntityType: EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        }];
        [sharedEventStore reset];
    }

    return sharedEventStore;
}

Code to fetch events: 获取事件的代码:

NSPredicate *predicate = [[CalendarHelper sharedStore] predicateForEventsWithStartDate:startDate
                                                        endDate:endDate
                                                      calendars:[[showableCalendars copy] autorelease]];
NSArray *result = [[CalendarHelper sharedStore] eventsMatchingPredicate:predicate];

And to update / create events: 并更新/创建事件:

EKEvent *event = [[CalendarHelper sharedStore] eventWithIdentifier:eventId];
if(event != nil) {
    event.title = title;
    event.startDate = startDate;
    event.endDate = endDate;
    NSLog(@"Updating...");
    NSLog(@"+++ %@", event.eventIdentifier);

    [[CalendarHelper sharedStore] saveEvent:event span:EKSpanThisEvent commit:commit error:nil];
    NSLog(@"Updated.");
}
else {
    NSLog(@"No event, no update");
}

Any clue? 有什么线索吗?

Kindly check your ios version.. I experienced a similar crash when working with iOS 7.0.2, if its not try the below code 请检查您的ios版本。如果不尝试以下代码,使用iOS 7.0.2时会遇到类似的崩溃。

it seems like the cause of this bug is related to how many events we are trying to get in our app. 似乎此错误的原因与我们试图在我们的应用中获取多少事件有关。 Check on the apple's bug report (15424747). 检查苹果的错误报告(15424747)。

It appears that this bug is introduced when our app does predicate on the eventStore with a large range of dates. 看来,当我们的应用程序确实以较大范围的日期作为eventStore的谓词时,就会引入此错误。

Here is the code: 这是代码:

NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate     endDate:endDate calendars:nil]; 

//for sorting we used NSSortDescriptor //为了排序,我们使用了NSSortDescriptor

if (!self.masterListSortDescriptor)
{    
    self.masterListSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDate"  ascending:YES]; 
}

NSArray *result = [[self.eventStore eventsMatchingPredicate:predicate]
sortedArrayUsingDescriptors:@[self.masterListSortDescriptor]];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM