В настоящее время мы используем следующий API для создания анонимного пользователя:
Auth.auth().signInAnonymously
И следующий код для выхода:
Auth.auth().signOut
Чтобы связать анонимного пользователя с учетной записью Apple, мы используем:
user.link(with: oAuthCredential)
Ниже показан наш текущий процесс, в результате которого для одного устройства создается несколько анонимных пользователей.
- На странице входа пользователь нажимает «Продолжить в качестве гостя» -> создается первый анонимный пользователь.
- На главной странице приложения пользователь нажимает «Продолжить с Apple» -> анонимный пользователь привязывается к Apple
- Пользователь нажимает «Выйти».
- На странице входа пользователь снова нажимает «Продолжить в качестве гостя» -> создается второй анонимный пользователь.
- На главной странице приложения пользователь нажимает «Продолжить с Apple». Поскольку учетная запись Apple уже связана с первым пользователем, Firebase снова регистрирует пользователя как первого пользователя.
- В результате второй анонимный пользователь становится пользователем-зомби.

Мой вопрос: какой надежный и рекомендуемый метод предотвращения этой ситуации?
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
Мобильная версия