2015-08-07 3 views
4

Для моего приложения мне нужно создать календарь в учетной записи iCloud пользователя и добавить события в этот календарь.Поддержание ссылки на подтверждение синхронизации для календаря

Я Создание календаря с помощью этого:

let newCalendar = EKCalendar(forEntityType: EKEntityTypeEvent, eventStore: EventManager.sharedInstance.eventStore) 
    newCalendar.title = "MyAppCalendar" 
    let color = UIColor(red: CGFloat(arc4random_uniform(255))/255, green: CGFloat(arc4random_uniform(255))/255, blue: CGFloat(arc4random_uniform(255))/255, alpha: 1) 
    newCalendar.CGColor = color.CGColor 

    var mySource:EKSource? 
    for source in EventManager.sharedInstance.eventStore?.sources() as! [EKSource] { 
     if source.sourceType.value == EKSourceTypeCalDAV.value && source.title == "iCloud" { 
      mySource = source 
      break 
     } 
    } 
    if mySource == nil { 
     //crearting alert and displaying to user 
     return 
    } 
    else { 
     newCalendar.source = mySource! 
    } 

    var error:NSError? 
    if EventManager.sharedInstance.eventStore!.saveCalendar(newCalendar, commit: true, error: &error) { 
     let calendarName = newCalendar.title 
     let calendarIdentifier = newCalendar.calendarIdentifier 
     //save these in db and server 
    }else { 
     SharedConstants.handleErrors(error!) 
    } 

Где EventManager это мой класс, чтобы сохранить ссылку на EKEventStore экземпляра объекта.

Но в документации Apple в нем говорится, что calendarIdentifier изменяется при синхронизации.

Итак, мой вопрос заключается в том, как сохранить ссылку на этот календарь?

+0

Взгляните на этот ответ: http://stackoverflow.com/questions/15912137/what-exactly-constitutes-a-full-calendar-sync- в-ekcalendar/31631405 # 31631405. Наверное, это поможет. –

+0

@Visput спасибо за эту ссылку, но как я могу преодолеть свою проблему? –

ответ

2

Нет решения, которое будет работать в 100% случаях, потому что, как вы знаете, calendarIdentifier может быть изменено. Таким образом, нет никакого уникального идентификатора, который будет ссылаться на конкретный календарь все время.
Но можно сделать решение, которое будет работать в большинстве случаев. Я предлагаю использовать такой алгоритм для обращения к конкретному календарю:
Предполагаю, что у вас есть кешированные calendarIdentifier и title для вашего календаря.

  1. Итерировать по всем календарям.
  2. Проверьте, нет ли в календаре идентификатора, равного кэшированному идентификатору.
  3. Если идентификаторы равны, то вы нашли свой календарь.
  4. В другом случае проверьте, имеет ли какой-либо календарь название, эквивалентное кешированному идентификатору.
  5. Если заголовки равны, то, возможно, вы нашли свой календарь. Это может быть неверно, если пользователь заменил заголовки для своего календаря и другого. Я думаю, что этот сценарий имеет довольно низкий шанс.
  6. В другом случае вы не сможете найти свой календарь. Это может произойти в случае, если пользователь удалит ваш календарь.

Вот фрагмент кода для вышеприведенного алгоритма:

func eventsCalendarWithIdentifier(identifier: String!, title: String!) -> EKCalendar? { 
    var calendarWithIdentifier: EKCalendar? = nil 
    var calendarWithTitle: EKCalendar? = nil 

    let eventStore = EventManager.sharedInstance.eventStore! 
    for aCalendar in eventStore.calendarsForEntityType(EKEntityTypeEvent) as! [EKCalendar] { 
     if var anIdentifier = aCalendar.calendarIdentifier { 
      if anIdentifier == identifier { 
       calendarWithIdentifier = aCalendar 
       break 
      } 
     } 

     if var aTitle = aCalendar.title { 
      if aTitle == title { 
       calendarWithTitle = aCalendar 
      } 
     } 

    } 

    return calendarWithIdentifier ?? calendarWithTitle 
} 

Кроме того, важно, чтобы обрабатывать события, когда потенциал полной синхронизации это произошло, и воссоздать свой календарь экземпляр. Это важно, потому что пользователь может удалить свой календарь, пока ваше приложение находится в фоновом режиме, в этом случае календарь будет недействительным.
Вот фрагмент кода для обработки таких событий:

func registerObserver() { 
    NSNotificationCenter.defaultCenter().addObserver(self, 
     selector: "storeChanged", 
     name: EKEventStoreChangedNotification, 
     object: nil) 
} 

func unregisterObserver() { 
    NSNotificationCenter.defaultCenter().removeObserver(self, 
     name: EKEventStoreChangedNotification, 
     object: nil) 
} 

func storeChanged() { 
    let myCalendar = self.eventsCalendarWithIdentifier(cachedIdentifier, title: cachedTitle) 
    if myCalendar == nil { 
     // Calendar lost. 
    } 
    // Updated UI if needed. 
} 
+0

Спасибо, что нашли время ответить мне. Но я ищу надежный способ получить свой календарь из ios calendar db. На самом деле я уже устал от вашего подхода, добавив третье ограничение календаря 'CGColor', но он все еще не является надежным. Я буду ждать каких-либо улучшений, если это возможно. –

Смежные вопросы