我的谷歌标志不会提示用户在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登录时却没有。请给我一个正确的方法如何登录多个身份验证或一个好的项目示例将是不错的因为我看到没有一个项目只是实现这些。请给我一些想法。
答案 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!