Не удается добавить / изменить аварийные сигналы EKAlarm к [вновь созданному] событию EKEvent

#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 отклоняется, что объясняет, почему иногда оно работало.