[英]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.