谷歌和Facebook Firebase Auth使用swift 3 [英] Google and Facebook Firebase Auth using 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屋!