iOS Firebase登录。选择Google帐户后显示活动指标

时间:2018-03-11 03:00:11

标签: ios swift firebase firebase-authentication

我有一个带有登录按钮的ViewController,用于使用Google帐户登录Firebase:

GIDSignIn.sharedInstance().signIn()

当我点击按钮时,会出现:

Google account choosing

选择帐户后,如果验证成功,我想加载第二个ViewController。为此,我在第一个ViewController中有一个监听器,当验证状态发生变化时会再次登录,这次成功,无需再次询问帐户并直接发送给第二个ViewController:

Auth.auth().addStateDidChangeListener({ auth, user in
    if let _ = user {
        GIDSignIn.sharedInstance().signIn()
    }
})

问题是当我从帐户选择器返回第一个ViewController时,我希望显示一个活动指示器。因为应用程序可能在身份验证过程中存在几秒钟,我不希望用户再次点击登录按钮,而第一次登录尚未完成。

我需要一种方法来识别正在进行登录,以显示锁定屏幕的活动指示符,以防止用户再次点击登录

替代方法1

当我点击使用Google登录按钮时,我将UserDefaults整数设置为1.然后,当在Google帐户选择器之后重新加载ViewController时,我会查找此整数,如果它是1 ,我不会停止活动指标。

因为我希望活动指示符显示为,因为用户点击按钮直到验证完成

单击按钮时,我执行:

GIDSignIn.sharedInstance().signIn()
UserDefaults.standard.set(1, forKey: "signingIn")
UserDefaults.standard.synchronize()

在viewWillAppear中我做:

if let _ = user {
    GIDSignIn.sharedInstance().signIn()
} else {
    if UserDefaults.standard.integer(forKey: "signingIn") != 1 {
        self.stopActivityIndicator()
    } else {
        UserDefaults.standard.set(0, forKey: "signingIn")
        UserDefaults.standard.synchronize()
    }
}

验证完成后,在GIDSignInDelegate中会有一个将被调用的函数。在此功能中,必须停止活动指示器:

// The sign-in flow has finished and was successful if |error| is |nil|.
- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error;

替代方法2

我将signIn Google功能放入完成处理程序,但它不起作用:

self.completionHandlerSigIn {
    self.stopActivityIndicator()
}

功能如下:

func completionHandlerSigIn(completion: () -> Void) {
    GIDSignIn.sharedInstance().signIn()
}

问题是在帐户选择之后,在登录过程中视图重新加载。我需要一种方法来识别我来自Google帐户选择屏幕。

1 个答案:

答案 0 :(得分:0)

只需在用户点击登录时显示加载指示符,然后在身份验证过程返回错误或处理结果后隐藏它。我没有使用谷歌登录,但我可以通过推特给你我的例子。

@IBAction func onTwitterClicked(_ sender: UIButton) {
    AuthManager.shared.loginWithTwitter(self) 
}

以下是AuthManager中的loginWithTwitter方法:

func loginWithTwitter(_ viewController:BaseController) {
        self.provider = .twitter
        viewController.showLoadingPanel()
        TWTRTwitter.sharedInstance().logIn(completion: {session, error in
            guard (error == nil) else {
                viewController.hideLoadingPanel()
                viewController.showInfoAlert("Oops", error!.localizedDescription, nil)
                return
            }
            let credential = TwitterAuthProvider.credential(withToken: session!.authToken, secret: session!.authTokenSecret)
            self.auth.signIn(with: credential, completion: {user, error in
                viewController.hideLoadingPanel()
                guard error == nil else {
                    viewController.showInfoAlert("Oops", error!.localizedDescription, nil)
                    return
                }
                self.tryConfirmUserInFirestore(user, viewController)
            })
        })
    }