Login with google is very common functionality in iOS applications. We can Implement google login in swift 3.0 either by using pods or google SDK.
We need to install the following pod-
pod 'Google/SignIn'
Then register your app on the google developer account. After registration, you need to follow some steps as provided in the registration process. We need to add the GoogleService.plist file in the project and make some change in the URL schemes of the project.
After that, we need to make changes in the AppDelegate file of your project as following -
import Google
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
GIDSignIn.sharedInstance().clientID = "YOUR_CLIENT_ID"
var configureError: NSError?
GGLContext.sharedInstance().configureWithError(&configureError)
assert(configureError == nil, "Error configuring Google services: \(configureError)")
return true
}
Now add the following function in AppDelegate.swift file -
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
return GIDSignIn.sharedInstance() .handle(url,sourceApplication: options [UIApplicationOpenURLOptionKey .sourceApplication] as ? String, annotation: options [UIApplicationOpenURLOptionKey.annotation])
}
Now Create the Class which will manage the Google Sign In Process and write the following code in the class -
import UIKit
import GoogleSignIn
class GoogleManager: NSObject, GIDSignInDelegate {
var signInBlock:CompletionBlock?
func googleSignIn(completion: @escaping CompletionBlock) {
self.signInBlock = completion
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().signOut()
GIDSignIn.sharedInstance().signIn()
}
//Google SignIn Delegates
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
if error == nil {
let userId = user.userID // For client-side use only!
let idToken = user.authentication.idToken // Safe to send to the server
let fullName = user.profile.name
//let givenName = user.profile.givenName
//let familyName = user.profile.familyName
let email = user.profile.email
let googleDetails = ["googleUserID":userId, "token":idToken, "name":fullName, "emailAddress":email]
if signInBlock != nil {
self.signInBlock!(true, googleDetails as AnyObject?, nil)
}
} else {
print("\(error.localizedDescription)")
if signInBlock != nil {
signInBlock!(false, nil, error)
}
}
}
func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
if signInBlock != nil {
signInBlock!(false, nil, error)
}
}
}
Here We use the completion block as following -
typealias CompletionBlock = (Bool , AnyObject? , Error?) -> Void
Now Call the uiDelegate from your view controller where we actually want to implement login functionality.
GIDSignIn.sharedInstance().uiDelegate = self
You can get the data in your viewcontroller by using SignIn block which we used in GoogleMnager Class.
0 Comment(s)