Facebook And Google Login - conflict (Xcode)

2019-07-27 21:08发布

I've read some of the similar questions here, unfortunately, didn't really help me much.

I have an Xcode project using Swift, currently, I've integrated Twitter & Facebook login. I would like to have Google login as well. I've followed the steps so far, but I've reach to 2 issues:

  1. didFinishLaunchingWithOptions (in AppDelegate.swift). I already have Facebook as a return type, but in Google's documentation it says it requires return true. How to do that? Here's the code:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
    
    // Google Login
    var configureError: NSError?
    GGLContext.sharedInstance().configureWithError(&configureError)
    assert(configureError == nil, "Error configuring Google services: \(configureError)")
    
    //return true -> Expected by Google
    
    return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) }
    

2) openURL func - This one also expects Google related return but it currently returns Facebook (based on their documentation):

    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {

    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)


    // Required By Google?!
    return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: sourceApplication, annotation: annotation)

}

So, I need so help on handling those. Thank you in advance!

3条回答
做个烂人
2楼-- · 2019-07-27 21:55

for me this one worked

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        FIRApp.configure()

        FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

        GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID            
        return true
    }

and

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication,annotation: annotation)
            || GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation)
    }

hope help someone. was working on it for morethan 3 hours.

查看更多
孤傲高冷的网名
3楼-- · 2019-07-27 22:04

The solution is

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
            return
                //facebook
                FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url,
                        sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String?,
                            annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
                ||

                //google
                GIDSignIn.sharedInstance().handleURL(url,
                                                        sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String?,
                                                        annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
}
查看更多
Root(大扎)
4楼-- · 2019-07-27 22:13

In didFinishLaunchingWithOptions take a one boolean variable and than return that variable like

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {


   // Google Login
   var configureError: NSError?
   GGLContext.sharedInstance().configureWithError(&configureError)
   assert(configureError == nil, "Error configuring Google services: \(configureError)")

   let b = FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

   return b 
}

For the other issue, you can handle it like this

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) 
            || GIDSignIn.sharedInstance().handleURL(url, sourceApplication: sourceApplication, annotation: annotation)
}
查看更多
登录 后发表回答