谷歌和Facebook Firebase Auth使用swift 3

时间:2017-03-06 15:02:54

标签: ios facebook firebase swift3 firebase-authentication

我的谷歌标志不会提示用户在Facebook提示时允许其个人资料中的权限。为什么呢?

我正在视图控制器中实现我的谷歌登录,而不是在指南中的app delegate中。我不确定我做的是对的。我一直在努力实现这几个小时。

这是我的代码:

apple delegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        FIRApp.configure()
        FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

        return true
    }

    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        let handled =  FBSDKApplicationDelegate.sharedInstance().application(application,
                                                                     open: url,
                                                                     sourceApplication: sourceApplication,
                                                                     annotation: annotation)
        GIDSignIn.sharedInstance().handle(url,
                                          sourceApplication: sourceApplication,
                                          annotation: annotation)

        return handled
    }


    // my viewcontroller.swift

    class LoginViewController: UIViewController, FBSDKLoginButtonDelegate, NVActivityIndicatorViewable, GIDSignInUIDelegate, GIDSignInDelegate {

        @IBOutlet weak var fbLogin: FBSDKLoginButton!
        var databaseRef: FIRDatabaseReference!
        var size = CGSize(width: 30, height: 30)

        override func viewDidLoad() {
            super.viewDidLoad()

            GIDSignIn.sharedInstance().uiDelegate = self
            GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID
            GIDSignIn.sharedInstance().delegate = self


            NVActivityIndicatorView.DEFAULT_TYPE = .ballTrianglePath
            NVActivityIndicatorView.DEFAULT_BLOCKER_DISPLAY_TIME_THRESHOLD = 2

            FIRAuth.auth()?.addStateDidChangeListener() { (auth, user) in
                if user != nil{
                    self.performSegue(withIdentifier: "HomeTabSegue", sender: self)
                    NVActivityIndicatorPresenter.sharedInstance.stopAnimating()
                }
                else
                {
                    self.fbLogin.readPermissions = ["public_profile", "email"]
                    self.fbLogin.delegate = self
                    self.fbLogin.isHidden = false
                }
            }
        }

        func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
            if let error = error {
                print(error.localizedDescription)
                return
            }

            guard let authentication = user.authentication else { return }
            let credential = FIRGoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                              accessToken: authentication.accessToken)
            FIRAuth.auth()?.signIn(with: credential) { (user, error) in
                self.databaseRef = FIRDatabase.database().reference()
                self.databaseRef.child("Users").child(user!.uid).observeSingleEvent(of: .value, with: { (snapshot) in
                    let snapshot = snapshot.value as? NSDictionary
                    if(snapshot == nil)
                    {
                        self.databaseRef.child("Users").child(user!.uid).setValue(["name" : user?.displayName, "email": user?.email])
                    }
                })

            }
        }
        func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
            if let error = error {
                print(error.localizedDescription)
                return
            }

            try! FIRAuth.auth()!.signOut()

        }


        func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
            print("user has log in fb")

            let activityData = ActivityData()

            NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData)

            self.fbLogin.isHidden = true

            if (error != nil)
            {
                NVActivityIndicatorPresenter.sharedInstance.stopAnimating()
                print(error.localizedDescription)
                self.fbLogin.isHidden = false
            }
            else if(result.isCancelled)
            {
                print("cancelled is pressed")
                NVActivityIndicatorPresenter.sharedInstance.stopAnimating()
                self.fbLogin.isHidden = false
            }
            else
            {
                let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
                FIRAuth.auth()?.signIn(with: credential) { (user, error) in
                    print("user has log into firebase")
                self.databaseRef = FIRDatabase.database().reference()
                self.databaseRef.child("Users").child(user!.uid).observeSingleEvent(of: .value, with: { (snapshot) in
                    let snapshot = snapshot.value as? NSDictionary
                    if(snapshot == nil)
                        {
                            self.databaseRef.child("Users").child(user!.uid).setValue(["name" : user?.displayName, "email": user?.email])
                        }
                    })
                }
            }
        }

        func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {
            print("user has log out")
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }

到目前为止,我的代码可以将用户保存到facebook和google中的firebase。这只是在谷歌签名的时候它并没有问我的许可,而在Facebook登录时却没有。请给我一个正确的方法如何登录多个身份验证或一个好的项目示例将是不错的因为我看到没有一个项目只是实现这些。请给我一些想法。

2 个答案:

答案 0 :(得分:3)

我认为在应用程序中(_ application:UIApplication,open url:URL,sourceApplication:String ?, annotation:Any) - > Bool,你需要获得GIDSignIn.sharedInstance()。handle(url,sourceApplication:sourceApplication,annotation:annotation)的结果,并将它与FB一起返回。所以它应该是这样的:

return handled || GIDSignIn.sharedInstance().handle(url,
                                      sourceApplication: sourceApplication,
                                      annotation: annotation)

因为根据文档here

  

如果GIDSignIn处理了此URL,则返回YES。

答案 1 :(得分:0)

我猜你的问题不是在你的loginViewController中调用GIDSignIn登录函数:

@IBAction func signInButtonDidTouch(_ sender: Any) {

    GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().delegate = self

    if GIDSignIn.sharedInstance().hasAuthInKeychain() {
        GIDSignIn.sharedInstance().signInSilently()
    } else {
        GIDSignIn.sharedInstance().signIn()
    }
}

上面的代码我有自定义GG登录按钮@IBOutlet weak var signInButton: GIDSignInButton!