我认为你的问题在于here, 在里面- (void)signInWithProviderUI:(id<FIRAuthProviderUI>)providerUI
method.
委托方法在dismissViewControllerAnimated:completion:
完成块。
[self.navigationController dismissViewControllerAnimated:YES completion:^{
[self.authUI invokeResultCallbackWithUser:user error:error];
}];
如你看到的根据 Apple 文档,此方法预计在模态呈现的 viewController 上调用。您将其显示为根视图控制器。尝试用来自的模式显示它UIViewController
,事情应该会成功。要调试此尝试并在以下位置设置断点line 193确保它不会被击中。如果当您以模态方式显示 authController 时这不起作用,我会感到非常惊讶。
为您的问题提出可能的解决方案(我假设您希望确保用户在使用您的应用程序之前登录)。以下是我当前在应用程序中使用的内容的简化。
EDIT:针对新的 1.0.0 FirebaseUI 语法进行了更新。
class MainTabController: UITabBarController, FIRAuthUIDelegate {
let authUI: FUIAuth? = FUIAuth.defaultAuthUI()
override func viewDidLoad() {
super.viewDidLoad()
var authProviders = [FUIFacebookAuth(), FUIGoogleAuth()]
authUI.delegate = self
authUI.providers = authProviders
//I use this method for signing out when I'm developing
//try! FIRAuth.auth()?.signOut()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !isUserSignedIn() {
showLoginView()
}
}
private func isUserSignedIn() -> Bool {
guard FIRAuth.auth()?.currentUser != nil else { return false }
return true
}
private func showLoginView() {
if let authVC = FUIAuth.defaultAuthUI()?.authViewController() {
present(authVC, animated: true, completion: nil)
}
}
func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
guard let user = user else {
print(error)
return
}
...
}