谷歌和Facebook Firebase Auth使用swift 3

在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登录时却没有。 请给我一个正确的方法如何登录多个auth或一个好的项目示例将是很好的因为我没有看到没有一个项目只是实现这些。 请给我一点想法。

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

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

因为根据这里的文档:

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

我想你的问题不是在你的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!