swift - iOS firebase : FIRAuthUIDelegate. authUI 未被调用

标签 swift firebase firebase-authentication google-authentication firebaseui

我正在尝试从 AppDelegate.swift 启动谷歌登录,然后在登录成功后启动我的应用程序的主屏幕。

enter image description here

我可以

  1. 如上所示显示 google 登录按钮

  2. 用户被发送到 google 以登录

  3. 用户被送回原来的位置(第 1 步)

在第 3 步之后。我想将用户转到我的应用程序的主页。

我的代码如下。 我遇到的问题是 authUI 没有被调用。

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, FIRAuthUIDelegate {
    var window: UIWindow?
    var authUI: FIRAuthUI?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        FIRApp.configure()

        authUI = FIRAuthUI.defaultAuthUI()
        authUI?.delegate = self
        let providers: [FIRAuthProviderUI] = [FIRGoogleAuthUI()]
        authUI?.providers = providers

       // show google login button
       let authViewController = authUI?.authViewController()
       self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
       self.window?.rootViewController = authViewController
       self.window?.makeKeyAndVisible()
       return true
    }

    func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool {
       return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
    }

    func authUI(authUI: FIRAuthUI, didSignInWithUser user: FIRUser?, error: NSError?) {
        // launch main view controller
    }
}

编辑:这似乎是 another question 的副本.另一个问题的标题很笼统,只深入了几行细节。无论如何,我相信克里斯的回答比那里的回答更彻底。我认为这里的问题和答案都更清楚、更有针对性和更彻底,所以如果将这里的人标记为重复,则直接指示这里的人去那里是错误的。

最佳答案

我认为你的问题出在here , 在 - (void)signInWithProviderUI:(id<FIRAuthProviderUI>)providerUI方法。

委托(delegate)方法在dismissViewControllerAnimated:completion:中被调用完成 block 。

[self.navigationController dismissViewControllerAnimated:YES completion:^{
        [self.authUI invokeResultCallbackWithUser:user error:error];
      }];

As you can see从 Apple 文档中,此方法应在模态呈现的 viewController 上调用。您将其显示为 Root View Controller 。尝试使用 UIViewController 中的模式显示它,事情应该会解决。要调试此尝试并在 line 193 处设置断点确保它不会被击中。如果在模态显示 authController 时这不起作用,我会感到非常惊讶。

为您的问题提出可能的解决方案(我假设您希望确保用户在使用您的应用程序之前已登录)。以下是我目前在应用程序中使用的内容的简化。

编辑:针对新的 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
        }

        ...
    }

关于swift - iOS firebase : FIRAuthUIDelegate. authUI 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40249281/

相关文章:

ios - 如何在 Swift 完成外部异步请求之前先完成内部异步请求?

ios - UITableView 中的颜色替代 UITableViewCell?

firebase - 在Dart中从Cloud_Firestore获取 bool 状态

java.lang.NullPointerException : Attempt to invoke virtual method 'java.lang.String com.example.ghifa.mrad.Model.User.getImageurl()'

javascript - 在 Node 中使用 firebase 时出现错误 "Cannot read property ' uid' of null”?

swift - Firebase 数据库不会停止更新

swift - Xcode 8 Swift 3 改变音调的声音

android - MLKit Firebase android - 如何将 FirebaseVisionFace 转换为图像对象(如位图)?

typescript - 为用户导入 Firebase v8 Typescript 定义

javascript - 使用身份验证安全规则时 Firebase 读取权限被拒绝