Мое приложение iOS регистрирует пользователей анонимно, а затем я предоставляю им возможность через настройки для входа в приложение с помощью Google или Facebook.
Я пытаюсь использовать предварительно созданный FirebaseUI и заставил Google войти в систему; однако я не смог заставить его связаться с анонимной учетной записью, вместо этого он создает другого пользователя.
Я следил, между прочим:
[1] https://firebase.google.com/docs/auth/ios/anonymous-auth
[2] https://firebase.google.com/docs/auth/ios/account-linking
Я попытался изучить параметры пользователя и authUI функций authUI, но не смог получить учетные данные для Google:
guard let authentication = user.authentication else { return }
let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
accessToken: authentication.accessToken)
Или Facebook:
let credential = FacebookAuthProvider.credential(withAccessToken: AccessToken.current!.tokenString)
Поскольку user.authentication не существует и не существует AccessToken.
Вот мои попытки реализовать FUIAuthDelegate:
extension MainTabBarController : FUIAuthDelegate {
func authUI(_ authUI: FUIAuth, didSignInWith user: User?, error: Error?) {
guard error == nil else {
toast("Login failed through provider, please try again.", size: .small, duration: .normal)
return
}
if let u = Auth.auth().currentUser {
var credential : AuthCredential? = nil
switch u.providerID {
case GoogleAuthProviderID:
//credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken)
break;
case FacebookAuthProviderID:
//credential = FacebookAuthProvider.credential(withAccessToken: AccessToken.current!.tokenString)
break;
default:
return
}
//u.link(with: credential) { (user, error) in
}
/*var credential : AuthCredential? = nil
if let pId = user?.providerID {
switch pId {
case GoogleAuthProviderID:
//credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken)
break;
case FacebookAuthProviderID:
//credential = FacebookAuthProvider.credential(withAccessToken: AccessToken.current!.tokenString)
break;
default:
return
}
}
if let cred = credential {
user?.link(with: cred) { (authResult, error) in
if let error = error {
let prevUser = Auth.auth().currentUser
Auth.auth().signIn(with: cred) { (authResult, error) in
if let error = error {
return
}
}
}
}
}*/
}
func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?) {
guard error == nil else {
loginAction(sender: self)
toast("Login failed, please try again.", size: .large, duration: .normal)
return
}
guard let ar = authDataResult else {return}
let isNewUser = ar.additionalUserInfo?.isNewUser
ar.user.providerID
if isNewUser != nil && isNewUser! {
// Populate some default settings for app options. On-boarding?
}
}
}
Кнопка, которую нужно щелкнуть, чтобы инициировать последовательность входа в систему, имеет следующий код, за которым следует класс, реализующий Auth VC:
func loginAction(sender: AnyObject) {
let authUI = FUIAuth.init(uiWith: Auth.auth())
authUI?.delegate = self
authUI?.providers = [FUIGoogleAuth(), FUIFacebookAuth(permissions: ["email","user_friends","ads_read"])]
let qAuthVC = MyAuthViewController(authUI: authUI!)
let navc = UINavigationController(rootViewController: qAuthVC)
self.present(navc, animated: true, completion: nil)
}
class MyAuthViewController : FUIAuthPickerViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.init(red: 255, green: 255, blue: 255, alpha: 1)
let margins = view.layoutMarginsGuide
let iLogo = UIImageView(image: UIImage(named: "appIcon"))
iLogo.translatesAutoresizingMaskIntoConstraints = false
iLogo.contentMode = .scaleAspectFit
self.view.insertSubview(iLogo, at: 0)
iLogo.centerXAnchor.constraint(equalTo: margins.centerXAnchor).isActive = true
iLogo.centerYAnchor.constraint(equalTo: margins.centerYAnchor).isActive = true
}
override init(nibName: String?, bundle: Bundle?, authUI: FUIAuth) {
super.init(nibName: nil, bundle: bundle, authUI: authUI)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Я ожидаю, что после того, как пользователь войдет в FirebaseUI через Facebook или Google, учетная запись будет связана с анонимной учетной записью, и, таким образом, он сможет войти в свою учетную запись Google или Facebook и просмотреть все данные своего приложения. (включая любые предметы, которые они создали, когда были анонимным пользователем). И если бы они по какой-либо причине решили войти в систему с другим провайдером после этого, все 3 были бы связаны вместе.
Идентификатор провайдера выглядит как «Firebase». У меня такое ощущение, что я предполагаю реализовать еще одну часть головоломки до того, как будет вызван thisSignInWith, но я не знаю, как, а затем вызвать его сам, чтобы продолжить поток?
Спасибо.