我有一个带有登录按钮的ViewController,用于使用Google帐户登录Firebase:
GIDSignIn.sharedInstance().signIn()
当我点击按钮时,会出现:
选择帐户后,如果验证成功,我想加载第二个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帐户选择屏幕。
答案 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)
})
})
}