Я включаю EKAuthorizationStatus
, но даже после того, как requestAuthorisation(to:commit:)
вызывается и возвращается true и без ошибок, оператор switch по-прежнему соответствует случаю .notDetermined
, и рекурсия в нем создает бесконечный цикл. И это сводит меня с ума!
Я пытался выяснить, как на самом деле работает requestAuthorisation(to:commit:)
, так как у меня такое чувство, что эта проблема связана с параллелизмом или чем-то еще, но я ничего не смог найти, поэтому у меня возникли проблемы с истинным объяснением ситуации.
И поскольку рекурсия в моем коде определенно является частью этого бесконечного цикла, я попробовал подход без рекурсий. Но поскольку EKAuthorizationStatus
может измениться между вызовами моего приложения в хранилище событий, я хочу проверить его заранее, реагируя на все его состояния соответствующим образом. И поэтому мне пришлось бы вызывать свои методы для переключения статуса авторизации и один для его запроса и обрабатывать любые ошибки во всем моем классе, чего я не хочу из соображений удобочитаемости, безопасности и здравомыслия.
private func confirmAuthorization(for entityType: EKEntityType) throws {
switch EKEventStore.authorizationStatus(for: entityType) {
case EKAuthorizationStatus.notDetermined:
// Request authorisation for the entity type.
requestAuthorisation(for: entityType)
// Switch again.
try confirmAuthorization(for: entityType)
case EKAuthorizationStatus.denied:
print("Access to the event store was denied.")
throw EventHelperError.authorisationDenied
case EKAuthorizationStatus.restricted:
print("Access to the event store was restricted.")
throw EventHelperError.authorisationRestricted
case EKAuthorizationStatus.authorized:
print("Acces to the event store granted.")
}
}
private func requestAuthorisation(for entityType: EKEntityType) {
store.requestAccess(to: entityType) { (granted, error) in
if (granted) && (error == nil) {
DispatchQueue.main.async {
print("User has granted access to \(String(describing: entityType))") // It's being printed over and over
}
} else {
DispatchQueue.main.async {
print("User has denied access to \(String(describing: entityType))")
}
}
}
}
Я ожидал, что переключатель будет соответствовать случаю .notDetermined
при первом запуске, где он запросит авторизацию. Поэтому, когда я снова переключаю статус, теперь он должен соответствовать другому регистру, например .authorized
или .denied
. Но на самом деле он снова соответствует случаю .notDetermined
, и доступ предоставляется снова и снова. \ ›:[
приставка:
>2019-01-08 12:50:51.314628+0100 EventManager[4452:190572] libMobileGestalt MobileGestalt.c:890: MGIsDeviceOneOfType is not supported on this platform.
>2019-01-08 12:50:54.608391+0100 EventManager[4452:190572] Adding a new event.
>2019-01-08 12:50:54.784684+0100 EventManager[4452:190572] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /Users/***/Library/Developer/CoreSimulator/Devices/********-****-****-****-************/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
>2019-01-08 12:50:54.785638+0100 EventManager[4452:190572] [MC] Reading from private effective user settings.
>Acces to the event store granted.
>Saved event with identifier: Optional("F8EAC467-9EC2-476C-BF30-45588240A8D0:903EF489-BB52-4A86-917B-DF72494DEA3D")
>2019-01-08 12:51:03.019751+0100 EventManager[4452:190572] Events succsessfully saved.
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>[…]
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>2019-01-08 12:51:03.291606+0100 EventManager[4452:190572] [Common] _BSMachError: port 26b03; (os/kern) invalid capability (0x14) "Unable to insert COPY_SEND"
>2019-01-08 12:51:03.317800+0100 EventManager[4452:190572] [Common] _BSMachError: port 26b03; (os/kern) invalid capability (0x14) "Unable to insert COPY_SEND"
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>[…]
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>Acces to the event store granted.
>Preset <EventManager.EventCreationPreset: 0x6000020ca340> needs update.
>Acces to the event store granted.
>Preset <EventManager.EventCreationPreset: 0x6000020ca340> was updated.
>2019-01-08 12:51:03.567071+0100 EventManager[4452:190572] Events succsessfully saved.
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>User has granted access to EKEntityType
>[…]
try? confirmAuthorization
сразу послеrequestAuthorisation(for: entityType)
. вы получитеEKAuthorizationStatus
authorized
илиsomething
после того, как пользователь выбрал что-то вAlert
. Таким образом, вы должны снова вызватьtry? confirmAuthorization
в обратном вызовеstore.requestAccess
. И нет необходимости в рекурсии. - person ChanOnly123   schedule 05.02.2019