RequestAccessToEntityType:completion: устарел, его вызов больше не разрешен. Вместо этого используйте requestFullAccessToEventsWithCompletion:

Сегодня я обновил свой 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, потому что в более ранней версии оно у меня работает.

Заранее спасибо.


141
2

Ответы:

Из документации :

Если ваше приложение использует только 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, вам не нужно получить любое разрешение согласно этому официальному документу: Документация