EKEventStore requestAccessToEntityType сбой приложения в iOS 10 и выше

#ios #swift #calendar #ekevent #ekeventstore

#iOS #swift #Календарь #ekevent #ekeventstore

Вопрос:

У меня есть приложение, в котором я должен добавлять события в календарь по умолчанию, который работал нормально до iOS 10. Теперь в iOS 10 он не предоставляет доступ. Я установил use legacy swift language version значение yes . Мой код

 let eventStore = EKEventStore()
switch EKEventStore.authorizationStatusForEntityType(EKEntityType.Event) {
   case .Authorized:
            //access
   case .Denied:
            print("Access denied")
   case .NotDetermined:
       eventStore.requestAccessToEntityType(EKEntityType.Event, completion:
                {[weak self] (granted: Bool, error: NSError?) -> Void in
                    if granted {
                        //access
                    } else {
                        print("Access denied")
                    }
                })
   default:
            print("Case Default")
  }
  

Во время отладки моего приложения происходит сбой eventStore.requestAccessToEntityType в Xcode 8.

Скриншот отладки

Мое приложение работает, и мне нужно его решить. Любая помощь уместна. Заранее спасибо.

Ответ №1:

В сборках iOS 10 необходимо установить сообщение с описанием для предупреждения о разрешении в Info.plist

Важно: приложение iOS, связанное с iOS 10.0 или после нее, должно включать в свой файл Info.plist ключи описания использования для типов данных, к которым ему необходимо получить доступ, иначе произойдет сбой. Для конкретного доступа к данным напоминаний и календаря они должны включать NSRemindersUsageDescription и NSCalendarsUsageDescription соответственно.

из документов Apple

Комментарии:

1. Действительно странно, что он просто вылетает без предупреждения или вывода на консоль. Обычно вы получаете явное предупреждение об этом.

2. Я согласен, должно быть какое-то предупреждение, то же самое происходило с разрешением камеры, мне потребовалось некоторое время, чтобы разобраться

Ответ №2:

     let eventStore = EKEventStore()
switch EKEventStore.authorizationStatus(for: .event) {
case .authorized: break
//access
case .denied:
    print("Access denied")
case .notDetermined:
    eventStore.requestAccess(to: .event, completion:
        {[weak self] (granted: Bool, error: Error?) -> Void in
            if granted {
                //access
            } else {
                print("Access denied")
            }
        })
default:
    print("Case Default")
}
  

С XCode 8 и swift 3 это новый формат. Вы тестировали свое приложение на iOS 10.

Комментарии:

1. Да, у меня есть тест в iOS 10 — Xcode 8. И я не перешел на swift 3. Для проблемы пользовательского интерфейса с раскадровкой в Xcode 8 я должен использовать Xcode 7.3.