Custom Google Sign-In button - iOS
Solution 1
You can add your own button instead of using Google Sign-In button Do follwing things
Objective C Version
1)Add your own button into storyBoard
2)drag action into viewController
- (IBAction)googlePlusButtonTouchUpInside:(id)sender {
[GIDSignIn sharedInstance].delegate = self;
[GIDSignIn sharedInstance].uiDelegate = self;
[[GIDSignIn sharedInstance] signIn];
}
3)handle delegate methods
#pragma mark - Google SignIn Delegate
- (void)signInWillDispatch:(GIDSignIn *)signIn error:(NSError *)error {
}
// Present a view that prompts the user to sign in with Google
- (void)signIn:(GIDSignIn *)signIn presentViewController:(UIViewController *)viewController
{
[self presentViewController:viewController animated:YES completion:nil];
}
// Dismiss the "Sign in with Google" view
- (void)signIn:(GIDSignIn *)signIn dismissViewController:(UIViewController *)viewController {
[self dismissViewControllerAnimated:YES completion:nil];
}
//completed sign In
- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
withError:(NSError *)error {
//user signed in
//get user data in "user" (GIDGoogleUser object)
}
Swift 4 Version
In Swift make sure you have added briding header as the library is written in objective C
1)Add your own button into storyBoard
2)drag action into viewController
@IBAction func googlePlusButtonTouchUpInside(sender: AnyObject) {
GIDSignIn.sharedInstance().delegate=self
GIDSignIn.sharedInstance().uiDelegate=self
GIDSignIn.sharedInstance().signIn()
}
3)handle delegate methods
//MARK:Google SignIn Delegate
func signInWillDispatch(_ signIn: GIDSignIn!, error: Error!) {
}
// Present a view that prompts the user to sign in with Google
func signIn(_ signIn: GIDSignIn!,
presentViewController viewController: UIViewController!) {
self.present(viewController, animated: true, completion: nil)
}
// Dismiss the "Sign in with Google" view
func signIn(_ signIn: GIDSignIn!,
dismissViewController viewController: UIViewController!) {
self.dismiss(animated: true, completion: nil)
}
//completed sign In
public func signIn(_ signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!,
withError error: Error!) {
if (error == nil) {
// Perform any operations on signed in user here.
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
// ...
} else {
print("\(error.localized)")
}
}
Edit: Here is the reference/evidence for usage of custom button, Google Doc reference
In these examples, the view controller is a subclass of UIViewController. If, in your project, the class that implements GIDSignInUIDelegate is not a subclass of UIViewController, implement the signInWillDispatch:error:, signIn:presentViewController:, and signIn:dismissViewController: methods of the GIDSignInUIDelegate protocol. Also don't forget to set UI delegate GIDSignIn.sharedInstance()?.uiDelegate = self
Solution 2
Swift 3 Version
In Swift make sure you have added briding header as the library is written in objective C.
- Add your own button into storyBoard
-
drag action into viewController
@IBAction func googlePlusButtonTouchUpInside(sender: AnyObject) { GIDSignIn.sharedInstance().signIn() }
-
handle delegate methods
//MARK:Google SignIn Delegate func signInWillDispatch(signIn: GIDSignIn!, error: NSError!) { // myActivityIndicator.stopAnimating() } // Present a view that prompts the user to sign in with Google func sign(_ signIn: GIDSignIn!, present viewController: UIViewController!) { self.present(viewController, animated: true, completion: nil) } // Dismiss the "Sign in with Google" view func sign(_ signIn: GIDSignIn!, dismiss viewController: UIViewController!) { self.dismiss(animated: true, completion: nil) } //completed sign In public func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { if (error == nil) { // Perform any operations on signed in user here. 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 // ... } else { print("\(error.localizedDescription)") } }
Solution 3
For Swift 4: (This is working code Enjoy)
@IBAction func logimByGoogle(_ sender: Any) {
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().uiDelegate = self
GIDSignIn.sharedInstance().signIn()
}
//MARK:- Google Delegate
func sign(inWillDispatch signIn: GIDSignIn!, error: Error!) {
}
func sign(_ signIn: GIDSignIn!,
present viewController: UIViewController!) {
self.present(viewController, animated: true, completion: nil)
}
public func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
withError error: Error!) {
if (error == nil) {
// Perform any operations on signed in user here.
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
// ...
} else {
print("\(error)")
}
}
Solution 4
In GoogleSignIn SDK 5.0 and above GIDSignInUIDelegate has been revoked
Add this below line, for custom google login button
@IBAction func googleLoginPressed(sender: UIButton) {
GIDSignIn.sharedInstance()?.presentingViewController = self
GIDSignIn.sharedInstance()?.delegate = self
GIDSignIn.sharedInstance()?.signIn()
}
Solution 5
All are fine with the answer of @Rohit KP (https://stackoverflow.com/a/34368678/2905967)
But Little adding when assigning the delegates.
Please call your action like this:
- (IBAction)btnGooglePlusPressed:(id)sender
{
[GIDSignIn sharedInstance].delegate=self;
[GIDSignIn sharedInstance].uiDelegate=self;
[[GIDSignIn sharedInstance] signIn];
}
and add these delegates GIDSignInDelegate,GIDSignInUIDelegate
Comments
-
Piyush Dubey about 4 years
I want to customize Google Sign-In button like below:-
I have tried below links, but none of them helped really much:- How to customize google sign in button?
https://developers.google.com/identity/sign-in/ios/Could somebody please guide what I should do? I can't use Google+ Sign-In button because "Google+ Sign-In is deprecated".
Edited:- I tried the code provided on below link:-
https://developers.google.com/identity/sign-in/ios/sign-in#add_the_sign-in_button -
Piyush Dubey over 8 yearsOk. Let me try this. Thanks.
-
Trong Vu almost 8 yearsGTLServicePlus service is stopping support (developers.google.com/+/mobile/ios/people). We have to use the Google Sign In
-
Karthik Mandava almost 8 years@Rohit KP. I am getting crash at [[GIDSignIn sharedInstance] signIn] in button method.
-
Trong Vu almost 8 yearsDoes apple will rejecte the app due to own button instead of using Google Sign-In button ?
-
Rohit Pradhan almost 8 years@TrongVu: No, There is no reason for rejecting App. I already have app live on App store with the custom button. I have edited the answer & added reference from google document. Please refer it. Thanks for pointing.
-
Logic almost 8 yearsi am trying to use custom image , it is not working with custom image. above code is not working.if i use the above code , button clicked does nothing.
-
Arash Zeinoddini almost 8 yearsCalling signOut before calling signIn will bring up the prompt window again
-
coolcool1994 about 7 yearsFirst three methods are not needed if your class is subclass of UIViewController. From Google -> "// Implement these methods only if the GIDSignInUIDelegate is not a subclass of // UIViewController."
-
Rohit Sisodia over 6 yearsFirst Set the delegate, and UIDelegate then call GIDSignIn.sharedInstance().signIn() Enjoy
-
Rohit Pradhan over 6 years@RohitSisodia thanks, I have updated the answer. It was mistyped while translating to swift from objective C.
-
Vahid Amiri over 6 yearsWhy not mention the actual delegate that must be added to the VC declaration?
-
Abhimanyu Rathore almost 6 yearsnice work @RohitKP for swift 4.0 we have updated your answer in swift 4.1
-
iHarshil over 4 yearsThanks Man! Finally, it helped me. Very minor change but can be missed easily.
-
Brian about 4 yearsWhile this code may solve the question, including an explanation of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please edit your answer to add explanations and give an indication of what limitations and assumptions apply.
-
Sam almost 4 years
uiDelegate
is no more working. Please refer to the following link for updates: link