Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trouble handling Google sign in Swift 3

I am new to iOS and am having trouble with app delegate URL handling in Swift 3, and I could really use some pointers.

The below code works perfectly fine in Swift 2.3:

func application(application: UIApplication,
  openURL url: NSURL, options: [String: AnyObject]) -> Bool {
    return GIDSignIn.sharedInstance().handleURL(url,
        sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String,
        annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
}


func application(application: UIApplication,
  openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    var options: [String: AnyObject] = [UIApplicationOpenURLOptionsSourceApplicationKey: sourceApplication,
                                        UIApplicationOpenURLOptionsAnnotationKey: annotation]
    return GIDSignIn.sharedInstance().handleURL(url,
        sourceApplication: sourceApplication,
        annotation: annotation)
}

When I paste the swift 2.3 code straight from the Firebase website, Xcode prompts me that a lot of the methods have changed. In particular, the options object.

In Swift 2.3, I can access the source application using options[UIApplicationOpenURLOptionsSourceApplicationKey] and the annotation using options[UIApplicationOpenURLOptionsAnnotationKey]

Xcode prompts me to change it to UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String and UIApplicationOpenURLOptionsKey.annotation._rawValue as String

Yet when I make the suggested changes, Google returns a URL, but nothing happens. Instead of redirecting to the app, it proceeds to enter the local google site, for me: www.google.co.nz

The full Swift 3 version I have looks like this:

func application(application: UIApplication,
                 openURL url: NSURL,
                 options: [String: AnyObject]) -> Bool {
    print(UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String)
    print(UIApplicationOpenURLOptionsKey.annotation._rawValue as String)

    return GIDSignIn.sharedInstance().handle(url as URL!,
                                             sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String] as! String!,
                                             annotation: options[UIApplicationOpenURLOptionsKey.annotation._rawValue as String])
}

func application(application: UIApplication,
             openURL url: NSURL,
             sourceApplication: String?,
             annotation: AnyObject?) -> Bool {
    var options: [String: AnyObject] = [UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String: sourceApplication as AnyObject,
                                        UIApplicationOpenURLOptionsKey.annotation._rawValue as String: annotation!]

    print(UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String)
    print(UIApplicationOpenURLOptionsKey.annotation._rawValue as String)

    return GIDSignIn.sharedInstance().handle(url as URL!,
                                             sourceApplication: sourceApplication,
                                             annotation: annotation)
}
like image 221
Clement Avatar asked Oct 19 '16 16:10

Clement


3 Answers

Xcode 8 Swift 3

If you are using multiple URL Schemes along with Google Sign In, use it like this:

func application(_ app: UIApplication,
                 open url: URL,
                 options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

    if(url.scheme!.isEqual("fbXXXXXXXXXXX")) {
        return SDKApplicationDelegate.shared.application(app, open: url, options: options)

    } else {
        return GIDSignIn.sharedInstance().handle(url as URL!,
                                    sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!,
                                    annotation: options[UIApplicationOpenURLOptionsKey.annotation])
    }
}
like image 113
n.by.n Avatar answered Oct 05 '22 08:10

n.by.n


Swift 4, Xcode 9

If you are using multiple URLSchemes for facebook and Google SignIn:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
   let fbSignIn     = FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
   let googleSignIn = GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation)

   return fbSignIn || googleSignIn
}
like image 34
Aashish Avatar answered Oct 05 '22 06:10

Aashish


For swift 5 Xcode 10.3 (Latest google signin)

@available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
        let googleDidHandle = GIDSignIn.sharedInstance().handle(url)

        return googleDidHandle
    }

    func application(_ application: UIApplication,open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        let googleDidHandle = GIDSignIn.sharedInstance().handle(url)

        return googleDidHandle
    }

To open signIn screen on Button click

@IBAction func btnGoogleSigninClick(_ sender: AnyObject) {
        GIDSignIn.sharedInstance()?.presentingViewController = self
        GIDSignIn.sharedInstance()?.restorePreviousSignIn()

        GIDSignIn.sharedInstance().signIn()
    }
like image 28
Hardik Thakkar Avatar answered Oct 05 '22 07:10

Hardik Thakkar