Сегодня я обновил свой Xcode до 15.0 и свой iPhone до iOS 17, но теперь мой код, записывающий EKEvent в календарь, больше не работает. В более ранних версиях iOS все работало нормально. У меня проблема с совместимостью или есть другая причина?
Ошибка заключается в следующем:
Error: -requestAccessToEntityType:completion: has been deprecated-calling this method is no longer allowed. Instead, use -requestFullAccessToEventsWithCompletion:, -requestWriteOnlyAccessToEventsWithCompletion:, or -requestFullAccessToRemindersWithCompletion:
Мой код выглядит следующим образом:
func accesCalenderToAddEvent() {
let eventStore: EKEventStore = EKEventStore()
eventStore.requestAccess(to: EKEntityType.event) { granted, error in
DispatchQueue.main.async {
if (granted) && (error == nil) {
let event = EKEvent(eventStore: self.eventStore)
event.title = "Event 1"
event.startDate = Date()
event.endDate = Date()
let eventController = EKEventEditViewController()
eventController.event = event
eventController.eventStore = eventStore
eventController.editViewDelegate = self
self.present(eventController, animated: true, completion: nil)
} else {
let alertController = UIAlertController(title: "Calendar Permission Required", message: "Please enable Calender permissions in settings.", preferredStyle: UIAlertController.Style.alert)
let okAction = UIAlertAction(title: "OK", style: .default, handler: {(cAlertAction) in
//Redirect to Settings app
UIApplication.shared.open(URL(string:UIApplication.openSettingsURLString)!)
})
alertController.addAction(okAction)
self.present(alertController, animated: true, completion: nil)
}
}
}
}
Пожалуйста, предложите мне решение для iOS 17, потому что в более ранней версии оно у меня работает.
Заранее спасибо.
Из документации :
Если ваше приложение использует только EKEventEditViewController, чтобы позволить пользователю создавать и сохранять события календаря, не запрашивайте доступ к событиям.
Объем разрешений для iOS 17 изменился и теперь включает чтение, запись и полный доступ, в отличие от iOS 16, где был только полный доступ. Это вызывает ошибку при использовании eventStore.requestAccess() в iOS 17, но не в iOS 16.
Уведомление об устаревании: https://developer.apple.com/documentation/eventkit/ekeventstore/1507547-requestaccesstoentitytype
Дополнительная информация: https://developer.apple.com/documentation/eventkit/ekeventstore/4162272-requestfullaccesstoeventswithcom
Чтобы обеспечить поддержку в iOS 17, напишите код, подобный приведенному ниже:
if #available(iOS 17.0, *) {
eventStore.requestWriteOnlyAccessToEvents { granted, error in
DispatchQueue.main.async {
//write the existing logic here
}
}
}else {
//put the old code here so it’s been working in earlier versions before iOS 17.
}
Примечание:
Если вы используете только EKEventEditViewController, вам не нужно получить любое разрешение согласно этому официальному документу: Документация