Google SignIn SFSafariViewController / WebView redirecciona a Google.com después de aceptar los permisos

2

Estoy tratando de implementar la nueva biblioteca de inicio de sesión de Google que instalé usando Cocoapods. El objetivo de implementación es 8.4 y estoy probando en un dispositivo 9.0.2.

1- Tengo el archivo plist adecuado con clientID y reverseID

2- Tengo configurados los tipos de URL

3- Tengo el AppDelegate como delegado de GIDSignIn [GIDSignIn sharedInstance].delegate = self;y los métodos de delegado adecuados implementados para capturar la devolución de llamada- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error

4- tengo el - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation]; }

5- Estoy usando la clase automática GIDSignInButton y se coloca en una subclase de UIViewController, por lo que no necesito implementar los métodos GIDSignIn uiDelegate. Pero todavía he [[GIDSignIn sharedInstance] setUiDelegate:self];configurado en la vista

6- Tengo SFSafariViewController.framework en las Bibliotecas Vinculadas.

7- Nunca configuré manualmente el ID de cliente en GIDSignIn porque eso no forma parte de las instrucciones en la documentación oficial de Google. Aunque mucha gente sigue haciéndolo, no sé por qué.

El problema: una vez que presiono el botón Iniciar sesión, se presenta un SFSafariViewController, selecciono la cuenta que quiero usar (observe que nunca salió de mi aplicación en ninguna otra aplicación de Google para la autenticación, aunque tengo varias instaladas). Se presentan los permisos, veo el nombre y el logotipo de mi aplicación que configuré en Google Developer Console, acepto los permisos. El SFSafariViewController vuelve a "www.google.com" y eso es todo. La única forma de descartar esta pantalla es presionar el botón "Aceptar" en la esquina superior derecha, y luego - (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)errorse llama, con un error que indica que se ha cancelado el proceso de inicio de sesión.

1
  • Tengo el mismo problema, ¿suerte con eso? 25/11/15 a las 14:40
2

Solo resuélvelo. Mientras usa CocoaPods, parece que tiene que configurar

Rápido:

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

Obj-c

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation];
}

en su appDelegate. Ahora será redirigido a su aplicación después de aceptar los permisos.

Más información: https://developers.google.com/identity/sign-in/ios/sign-in

3
  • Como mencioné anteriormente ... en mi punto número 4. Tengo ese método implementado en Appdelegate :(
    omarojo
    25/11/15 a las 18:59
  • ¡Jesús! Lo he echado de menos, lo siento! 25/11/15 a las 19:03
  • 3
    Y no creo que eso tenga nada que ver con Cocoapods
    omarojo
    25/11/15 a las 19:04
1

Descubrí el problema. La documentación oficial de Google menciona la necesidad de implementar el siguiente método en su AppDelegate

- (BOOL)application:(UIApplication *)application
               openURL:(NSURL *)url
     sourceApplication:(NSString *)sourceApplication
            annotation:(id)annotation {
     return [[GIDSignIn sharedInstance] handleURL:url
                             sourceApplication:sourceApplication
                                    annotation:annotation];
}

Pero nunca menciona la necesidad de implementar también un método similar llamado

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options

Tuve que implementar ambos métodos para que mi aplicación funcione correctamente. También tengo autenticación de Facebook, por lo que mis métodos terminaron pareciéndose a los siguientes.

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options {
    return [[FBSDKApplicationDelegate sharedInstance] application:app
                                                          openURL:url
                                                sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                                       annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]
            || [[GIDSignIn sharedInstance] handleURL:url
                                   sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                          annotation:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{

        return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation
                 ] ||
                [[GIDSignIn sharedInstance] handleURL:url
                                          sourceApplication:sourceApplication
                                                 annotation:annotation];
   }
1
  • 1
    Intenté esto sin suerte. ¿Esto sigue funcionando para ti? Sigue abriendo un SFSafariViewController para mí
    pir800
    6 de febrero de 2016 a las 22:21