谷歌和Facebook Firebase Auth使用swift 3 [英] Google and Facebook Firebase Auth using swift 3

查看:163
本文介绍了谷歌和Facebook Firebase Auth使用swift 3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My google sign is not prompting users to allow permissions in their profile while facebook is prompting. Why?

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

I am implementing my google login in view controller not in app delegate like in the guide. I'm not sure what i did is correct. I've been trying to implement this for hours.

这是我的代码:

apple delegate.swift

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.
        }
    }

到目前为止,我的代码可以将用户保存到firebase在Facebook和google.It只是当签署时谷歌它没有征求我的许可,而在Facebook登录时它确实。请给我一个正确的方法如何登录多个auth或一个好的项目示例将是很好的因为我没有看到没有一个项目只是实现这些。给我一点想法。

So far my code works in saving users to firebase both in facebook and google.It's just that when signing when google it doesnt ask my permission while when signing in facebook it does. Pls give me a correct way how to log in multiple auth or a good project example would be nice coz i saw none with a project just implementing these. Give me idea pls.

推荐答案

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

I think in application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool, you need to get the result of GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation) and return it along with FB's too. So it should be something like this:

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

因为根据文档此处


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

Returns YES if GIDSignIn handled this URL.

这篇关于谷歌和Facebook Firebase Auth使用swift 3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆