Используя Swift, как получить поток аутентификации FirebaseUI, чтобы правильно связать переход от анонимного пользователя к входу в Google / Facebook - PullRequest
0 голосов
/ 10 мая 2019

Мое приложение 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, но я не знаю, как, а затем вызвать его сам, чтобы продолжить поток?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...