2017-01-04 2 views
1

Я столкнулся с странным случаем с запросом доступа к календарю в iOS 9. Логика отлично работает на всех устройствах iOS 10.EKEventStore requestAccess() не отображает приглашение пользователя в iOS 9

В нашем случае мы добавили кнопку на панели инструментов, которую пользователь нажимает, чтобы добавить событие в свой Календарь.

Таким образом, мы не проверяем разрешение на доступ к календарю до тех пор, пока пользователь не нажмет кнопку «Добавить в календарь». Пример:

@IBAction func addToCalendarPressed(_ sender: UIBarButtonItem) { 
    eventStore.requestAccess(to: .event, completion: { (granted, error) in 
     if (granted) && (error == nil) { 
      // Present the EKEventEditViewController 
     } else { 
      // Do something else (show an alert) 
     } 
    }) 
} 

В iOS 10 приложение отображает приглашение для доступа к Календарю, как и следовало ожидать. В iOS 9.x приглашение не отображается, обработчик завершения немедленно запускается и получает false.

Хуже того, хотя проверка «Разрешение календаря» завершена, вы не можете войти в «Настройки» и вручную включить доступ к календарю. Что касается устройства, приложение никогда не делало проверку разрешения, поэтому приложение никогда не появляется в меню «Настройки»> «Конфиденциальность»> «Календарь».

Я попытался переместить чек в viewWillAppear или viewDidLoad вместо того, чтобы ждать нажатия кнопки, и он все еще не работает. Я вытащил некоторые примеры приложений с проверкой событий, и они работают в iOS 9. Мне просто не удалось выяснить, почему запрос не работает в этом случае.

Приложение также проверяет место (но не на этом экране), и эти работы правильно прошивкой 9.

ответ

2

Мы нашли проблему. Так или иначе, у нашего проекта не было CFBundleDisplayName в info.plist. На более позднем этапе разработки, открытие проекта в Xcode 8 добавило свойство, но оставило имя пустым.

Как приглашения разрешения на разрешение календаря, так и разрешения на получение фотографий для iOS 9 используют это значение при отображении имени приложения в приглашении на разрешение.

Исправление состоит в том, чтобы просто установить $ (PRODUCT_NAME) для CFBundleDisplayName в нашем info.plist.