#ios #objective-c #eventkit
#iOS #objective-c #eventkit
Вопрос:
Я пытаюсь создать событие с одним сигналом тревоги программно, как это:
(void)exportEvent:(AgendaEvent*)evento
onCalendar:(EKCalendar*)calendar {
EKEventStore* store= [[[EKEventStore alloc] init] autorelease];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if(!granted) {
// show "not granted" message
return;
}
// save event
NSCalendar* gc= [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
EKEvent* event= [EKEvent eventWithEventStore:store];
event.title= evento.descrizione;
event.startDate= [gc dateFromComponents:evento.begin];
if(evento.end)
event.endDate= [gc dateFromComponents:evento.end];
else {
NSDateComponents* endDateComponents= [[evento.begin copy] autorelease];
endDateComponents.day ;
endDateComponents.hour= 0;
endDateComponents.minute= -1;
endDateComponents.second= 0;
NSDate* endDate= [gc dateFromComponents:endDateComponents];
// endDate is correctly set at 23:59 of the same day of beginDate, when all day beginDay is at 00:00
event.endDate= endDate;
event.allDay= YES;
}
event.calendar= calendar;
// reminder
NSDateComponents* reminderDateComponents= [[evento.begin copy] autorelease];
reminderDateComponents.day--;
reminderDateComponents.hour= 9;
reminderDateComponents.minute= 0;
NSDate* reminderDate= [gc dateFromComponents:reminderDateComponents];
// reminder date is correctly set at 9:00 of the previous day of beginDate
[event addAlarm:[EKAlarm alarmWithAbsoluteDate:reminderDate]];
NSError* err= nil;
[store saveEvent:event span:EKSpanThisEvent commit:YES error:amp;err];
if(err) {
// show "unable to export" message
return;
}
// show "exported" message
});
}];
}
но только несколько раз (или, точнее, часто) [store saveEvent:event span:EKSpanThisEvent commit:YES error:amp;err]
происходит сбой с:
2014-06-13 09:34:01.300 xxx[224:60b] CADObjectGetRelation failed with error Error Domain=NSMachErrorDomain Code=268435459 "The operation couldn’t be completed. (Mach error 268435459 - (ipc/send) invalid destination port)"
2014-06-13 09:34:01.301 xxx[224:60b] Impossibile esportare evento: Error Domain=EKErrorDomain Code=29 "Impossibile modificare avvisi." UserInfo=0x16a7c7e0 {NSLocalizedDescription=Impossibile modificare avvisi.}
Я даже не могу найти описание для кода 29 в EKErrorDomain, у кого-нибудь есть ключ?
Пожалуйста, имейте в виду, что:
- Я не использую arc, как вы можете видеть, но мне кажется довольно правильным (и для статического анализатора тоже).
- Я также попытался разделить сохранение события на два этапа: один для события и один для сигнала тревоги с точно такими же результатами.
- «Невозможно изменить avvisi». означает «Невозможно изменить предупреждения».
- Пробовал на iPad air с симулятором ios7.1.1 и ios7.1
CADObjectGetRelation
соответствующее сообщение не всегда отображается, даже если создание события завершается неудачно, но, похоже, не отображается при создании события и сигналов тревоги.
Ответ №1:
Хорошо, после некоторых проб и ошибок мне удалось заставить его работать. Проблема в том, что непосредственно перед вызовом exportEvent:
я создавал другой EKEventStore
для чтения и выбора EKCalendar
календаря.
Я удалил store
из тела селектора вопросов и передал его в качестве параметра с предыдущего шага, и теперь он работает. Я полагаю, это связано с тем, что задействован некоторый ipc, store
который освобождается между шагом выбора пользовательского календаря и фактическим созданием события. Если между освобождением на шаге 1 и перераспределением на шаге 2 проходит недостаточно времени, соединение ipc отклоняется, что объясняет, почему иногда оно работало.