Как избежать «зомби» анонимных пользователей Firebase при связывании входа в систему с Apple?IOS

Программируем под IOS
Ответить
Anonymous
 Как избежать «зомби» анонимных пользователей Firebase при связывании входа в систему с Apple?

Сообщение Anonymous »

Мне было интересно, как можно было бы предотвратить создание нескольких анонимных пользователей Firebase на одном устройстве.
В настоящее время мы используем следующий API для создания анонимного пользователя:
Auth.auth().signInAnonymously

И следующий код для выхода:
Auth.auth().signOut

Чтобы связать анонимного пользователя с учетной записью Apple, мы используем:
user.link(with: oAuthCredential)

Ниже показан наш текущий процесс, в результате которого для одного устройства создается несколько анонимных пользователей.
  • На странице входа пользователь нажимает «Продолжить в качестве гостя» -> создается первый анонимный пользователь.
  • На главной странице приложения пользователь нажимает «Продолжить с Apple» -> анонимный пользователь привязывается к Apple
  • Пользователь нажимает «Выйти».
  • На странице входа пользователь снова нажимает «Продолжить в качестве гостя» -> создается второй анонимный пользователь.
  • На главной странице приложения пользователь нажимает «Продолжить с Apple». Поскольку учетная запись Apple уже связана с первым пользователем, Firebase снова регистрирует пользователя как первого пользователя.
  • В результате второй анонимный пользователь становится пользователем-зомби.
Если шаги 3–5 повторяются, новые анонимные пользователи-зомби будут создаваться, как показано на снимке экрана.
Изображение

Мой вопрос: какой надежный и рекомендуемый метод предотвращения этой ситуации?
func updateBasedOnLoginStatus() {
if let user = Auth.auth().currentUser, user.isAnonymous {
// Show Apple sign up button, hide sign out button.
appleSignUpButton.isHidden = false
signOutButton.isHidden = true
} else {
// Hide Apple sign up button, show sign out button.
appleView.isHidden = true
signOutButton.isHidden = false
}
}

// https://stackoverflow.com/questions/796 ... r-to-apple
private func handleOAuthCredentialAsync(_ oAuthCredential: OAuthCredential) {
Task {
defer {
updateBasedOnLoginStatus()
}

if let user = Auth.auth().currentUser, user.isAnonymous {
do {
_ = try await user.link(with: oAuthCredential)
} catch let linkError as NSError {
if linkError.code == AuthErrorCode.credentialAlreadyInUse.rawValue {
if let newCredential = linkError.userInfo[AuthErrorUserInfoUpdatedCredentialKey] as? OAuthCredential {
do {
_ = try await Auth.auth().signIn(with: newCredential)
} catch {
Utils.showErrorAlert(viewController: self, message: error.localizedDescription)
}
}
}
}
} else {
// We shouldn't reach here. This page is handling anonymous user to login user.

do {
_ = try await Auth.auth().signIn(with: oAuthCredential)
} catch {
Utils.showErrorAlert(viewController: self, message: error.localizedDescription)
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... with-apple
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»