Question or problem in the Swift programming language:
I’m using Google Sign-in and Facebook Login to provide Google and Facebook login in my app.
The problem is, when I’m using them both – Facebook Login Screen (based on Safari View Controller) doesn’t dismiss after user logged in.
After hours of painful debugging I found out that the problem only appears if I initialise Google Sign-in before showing Facebook login prompt.
Basically, it’s one line.
GGLContext.sharedInstance().configureWithError(&configureError)
If I comment that line – Facebook login works fine.
EDIT: This is what I have in my AppDelegate.swift:
func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String, annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
And the sad thing is that this method isn’t invoked at all.
But if I disable Google Login – it works fine.
Additional details:
I’m using Facebook SDK v4.12.0 and Google Sign-In SDK v4.0.0
Xcode Version 7.3.1 (7D1014), tested on iOS 9.3
Any ideas are welcome.
How to solve the problem:
Solution 1:
I am also using both google and facebook login and it is working fine.You have to use below method
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject) -> Bool
as
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject) -> Bool { if url.absoluteString().containsString("FACEBOOK_ID") { return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) } else { return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: sourceApplication, annotation: annotation) } }
Solution 2:
Ok folks, eventually I’ve figured it out.
The trick which worked for me is to initialise Google Sign-In SDK before the Facebook SDK.
now my AppDelegate looks like this:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Initialize google sign-in var configureError: NSError? GGLContext.sharedInstance().configureWithError(&configureError) assert(configureError == nil, "Error configuring Google services: \(configureError)") // init FB SDK FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) return true }
Solution 3:
I just implemented this code using the latest versions of Facebook and Google pods and Swift 3.1 and it worked great!
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { if url.absoluteString.contains("facebook") { return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:]) } else { return GIDSignIn.sharedInstance().handle(url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:]) } }
Solution 4:
If you are using google documentation for the integration of their auth system, don’t use this method :
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { var returnVal = false if #available(iOS 9.0, *) { returnVal = GIDSignIn.sharedInstance().handle(url,sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,annotation: options[UIApplicationOpenURLOptionsKey.annotation]) } else { returnVal = false } return returnVal }
This is supposed to work for avoid conflicts with iOS 9, but as soon as i removed this, the fb log in worked and the google log in worked on an iOS 9 device too.
Hope this help anybody.
Solution 5:
In Swift 3 (iOs 10) just do like this: (it worked fine for me)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { // FACEBOOK let handled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options) // GOOGLE GIDSignIn.sharedInstance().handle(url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) return handled }
Solution 6:
This worked on Swift 3: I had Facebook and Google Login in the same page.
@available(iOS 9.0, *) func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { print( " open URL : \(url.absoluteURL.absoluteString)") if url.absoluteURL.absoluteString.contains("fb728991920603705") //Facebook ID from Plist { print("contain FB ID") return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options) } else { let result = GIDSignIn.sharedInstance().handle(url, //added exclamation mark sourceApplication: String(describing: options[UIApplicationOpenURLOptionsKey.sourceApplication]!), annotation: options[UIApplicationOpenURLOptionsKey.annotation]) return result } }