Не удалось запросить разрешение на доступ к календарю IOS в Swift 4.2

Я пробовал более ранние примеры запроса разрешения на добавление элементов в календарь IOS. Они не работают с Xcode 10.1 (Swift 4.2). Когда я пытаюсь скомпилировать код, я получаю сообщение об ошибке. Если я закомментирую строки, начинающиеся с «EKEventstore.requestAccess», код выполнит цикл «.not.Determined».

Ошибка: «Член экземпляра requestAccess не может использоваться для типа EKEventStore; вы хотели вместо этого использовать значение этого типа?»

Может ли кто-нибудь найти мою ошибку, чтобы приложение IOS могло иметь разрешение на добавление событий в календарь?

func SOGetPermissionCalendarAccess() {

    switch EKEventStore.authorizationStatus(for: .event) {

    case .authorized:
        print("Authorized")

    case .denied:
        print("Access denied")

    case .notDetermined:
        EKEventStore.requestAccess(to: .event, completion:
            {[weak self] (granted: Bool, error: Error?) -> Void in
                if granted {
                    print("Access granted")
                } else {
                    print("Access denied")
                }
        })

        print("Not Determined")
    default:
        print("Case Default")
        }

}

person Howard Matis    schedule 22.11.2018    source источник


Ответы (2)


Вы должны создать экземпляр хранилища событий, как показано ниже,

let eventStore = EKEventStore()

После этого вы можете сделать запрос на разрешение, как показано ниже,

switch EKEventStore.authorizationStatus(for: .event) {

        case .authorized:
            print("Authorized")

        case .denied:
            print("Access denied")

        case .notDetermined:
            eventStore.requestAccess(to: .event, completion:
                {(granted: Bool, error: Error?) -> Void in
                    if granted {
                        print("Access granted")
                    } else {
                        print("Access denied")
                    }
            })

            print("Not Determined")
        default:
            print("Case Default")
        }

Перейдите по этой ссылке для получения дополнительной информации.

person Natarajan    schedule 22.11.2018
comment
Это сработало. Строка после eventStore.. должна быть {(предоставлено: Bool, error: Error?) -> Пусто, потому что self не используется. - person Howard Matis; 22.11.2018
comment
Да правильно. Если вы не использовали self внутри этого блока завершения, вы можете удалить эту часть. - person Natarajan; 23.11.2018
comment
Возможно ли как-то программно изменить авторизацию, запрещенную пользователем в настройках macOS? Или сбросить авторизацию приложения до статуса .notDetermined? - person Dawy; 19.01.2019

Документация Apple для EKEventStore заключается в выполнении метода reset(), который тоже не поможет. Мой обходной путь — еще раз инициализировать EKEventStore после метода requestAccess.

private var store: EKEventStore
private var calendars: [EKCalendar] = []

private func requestAccessCalendars() {
    store.requestAccess(to: .event) { [weak self] (accessGranted, error) in
        if accessGranted {
            self?.store = EKEventStore() // <- second instance
            self?.store.refreshSourcesIfNecessary()

            self?.loadCalendars()
        }
    }
}

private func loadCalendars() {
    let cals = store.calendars(for: .event)
    for c in cals {
        if c.allowsContentModifications { // without birthdays, holidays etc'...
            calendars.append(c)
        }
    }
}
person aerlich    schedule 01.11.2019