Проверка учетной записи, частично вошедшей в cloudkit? «Обновить настройки Apple ID»

#swift #cloudkit

#swift #cloudkit

Вопрос:

У меня есть приложение для iOS, большая часть функциональности которого зависит от cloudkit. Тем не менее, я, кажется, могу перейти в состояние, когда пользователь частично вошел в систему. Основные проверки входа в cloudkit пройдены, я могу получить свой RecordID, но я не могу читать или записывать в записи, как при полном входе в систему.

Полная информация ниже — есть идеи о том, как определить это состояние без тестирования чтения или записи?

При запуске телефона я получаю предупреждение «Обновить настройки Apple ID», в котором говорится

«Некоторые службы учетной записи будут недоступны, пока вы не выполните повторный вход»

Итак, проблема явно связана с этим (что, похоже, часто встречается в симуляторе …). Если я доберусь до своих настроек и повторно введу свой пароль, все в мире в порядке. Я могу справиться с этим путем обработки ошибок при попытке чтения или записи, но я бы предпочел проверить заранее и соответствующим образом предупредить пользователя.

Как я проверяю сегодня:

При запуске я проверяю, авторизован ли пользователь в cloudkit:

     if FileManager.default.ubiquityIdentityToken != nil {
        print("User logged in") // IT PASSES IN THIS STATE
    }
    else {
        print("User is not logged in")
    }
  

Пока все хорошо. Тест пройден, пользователь авторизован. Однако, когда я перехожу к чтению или записи, становится ясно, что я НЕ вошел в систему. Например, я получу CKErrorPermissionFailure при попытке записи.

Дополнительное примечание — в текущем «частично»? состояние входа в систему, приведенное ниже, возвращает правильный идентификатор записи для моего пользователя:

 let container = CKContainer.default()
container.fetchUserRecordID() { recordID, error in
  

Есть идеи о том, как программно определить это частичное состояние для cloudkit? Спасибо!

Ответ №1:

Я не нашел ответа, который бы касался этого, но хотел задокументировать две вещи, которые могли бы быть полезны

  1. Хотя проверка статуса возвращается активной, если я затем попытаюсь извлечь запись, требующую вашего входа в iCloud, произойдет сбой, и я могу использовать этот сбой для определения статуса выхода.

  2. Другая проблема, с которой я столкнулся, — это несколько пользователей, у которых включен iCloud, но по какой-то причине не включен iCloud Drive. Вы можете проверить это с помощью приведенного ниже подхода:

     CKContainer.default().accountStatus { (accountstatus, error) in
            switch accountstatus {
                case .noAccount:
                    log.error("user logged out of iCloud OR iCloud Drive off")  
            case .restricted:
                print("restricted")
            case .available:
                print("user logged into iCloud and iCloud drive")  
            case .couldNotDetermine:
                 log.warning("could not determine account status")
            default:
                log.error("New account status returned")
       }
    }