2016-12-28 1 views
4

Я хочу добавить события в календарь «someName». В случае, если календарь с заданным именем не существует, я создам его программно. Моя проблема в том, что событие не добавляется, когда localSource (типа EKSource) оказывается нулевым. Я добавил 3 проверки, чтобы убедиться, что я получаю значение localSource, но даже в некоторых случаях localSource равен нулю. Так что на мои телефонные события добавляются, но на телефоне моего друга они этого не делают.Невозможно добавить событие в календарь

Я последовал за различные должности, и я понял, что EKSource может быть из 6 типов: https://developer.apple.com/reference/eventkit/eksourcetype

То, что я не понимаю, в каких случаях localSource будет ноль? Что это означает на обычном языке? Могу ли я что-то сделать из кода, чтобы сделать его не ноль или что-то должно быть сделано пользователем на устройстве?

- (void)setCalendar { 
    NSArray *calendars = [self.eventStore calendarsForEntityType:nil]; 
    NSString *calendarTitle = someName; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title matches %@", calendarTitle]; 
    NSArray *filtered = [calendars filteredArrayUsingPredicate:predicate]; 
    if ([filtered count]) { 
     self.calendar = [filtered firstObject]; 
    } 
    else { 
     self.calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore]; 
     self.calendar.title = calendarTitle; 
     EKSource *localSource; 
     for (EKSource *source in self.eventStore.sources) 
     { 

      //if iCloud account is setup then add the event in that calendar 
      if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"]) 
      { 
       localSource = source; 
       break; 
      } 
     } 
     if (localSource == nil) 
     { 
      for (EKSource *source in self.eventStore.sources) 
      { 
       //if iCloud is not setup then look for local source 
       if (source.sourceType == EKSourceTypeLocal) 
       { 
        localSource = source; 
        break; 
       } 
      } 

     } 
     if (!localSource) { 
      localSource = [self.eventStore defaultCalendarForNewEvents].source; 
     } 
     self.calendar.source = localSource; 
     NSError *calendarErr = nil; 
     BOOL calendarSuccess = [self.eventStore saveCalendar:self.calendar commit:YES error:&calendarErr]; 
     if (!calendarSuccess) { 
      NSLog(@"Error while updating calendar %@", calendarErr); 
     } 
    } 

}

PS: У меня есть разрешение на добавление событий календаря.

+0

У вас есть разрешение на манипуляции с календарем вашего друга? Разве ваш друг позволяет вашему приложению делать это? – NSDmitry

+0

Да, у меня есть все необходимые разрешения. –

+0

Что такое версия iOS для iPhone вашего и друга? –

ответ

4

Местный источник отображает поля, подобные «на моем iphone», «icloud», «gmail» в календаре пользователя. В моем коде локальный источник имеет значение null, когда пользователь установил учетную запись icloud, но не дал разрешения учетной записи icloud для записи в календарь. Таким образом, даже если приложение имеет разрешение на запись в календарь, но местный источник равен нулю, следовательно, сбой события в календаре не выполняется.

Мой код добавляет к календарю в данных 2-х случаях:

  1. пользователь вошел в ICloud и дал разрешение на ICloud писать в календарь. В этом случае локальный источник не равен нулю, а календарь создается с именем «someName» в «iCloud».
  2. пользователь не подписался на icloud. Теперь календарь создается с именем «someName» в локальном источнике «на моем iphone».