iOS: usando tanto Facebook como Google, el inicio de session de Google Plus

Buenos días,

Estoy intentando implementar el inicio de session de Facebook (que funciona bien) y también el inicio de session de google plus en la misma vista. Estoy siguiendo las guías del sitio oficial (Google), pero hay un problema entre el button de Facebook y el button de Google plus:

Facebook me dice que coloque el siguiente código:

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

Y también Google me dice que ponga lo siguiente:

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

Y no puedo tener las mismas funciones con el mismo nombre y no puedo integrar uno dentro del otro. Es por eso que necesito tu ayuda porque no sé cómo lidiar con este problema entre estas pautas.

Gracias por adelantado.

Aquí deberá verificar [esquema de url] antes de regresar. El código de ejemplo está debajo.

 -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSLog("%@", [url scheme]); if([[url scheme] isEqualToString:FACEBOOK_SCHEME]) { return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication]; } else if([[url scheme] isEqualToString:GOOGLE_PLUS_SCHEME]) { return [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation]; } } 

Espero que solucione tu problema …

Aquí está la versión en Swift .

En primer lugar, debe comprender cómo ver la diferencia entre la URL de retorno de Google y Facebook. El algorithm para la detección es:

  1. Patrón de URL de Facebook: fb1106884526040279://authorize/... con fb1106884526040279 es su ID de aplicación. Por lo tanto, solo tiene que comprobar si esta url comienza con su ID de aplicación, es host igual a authorize (la cadena después de // y primero / )

  2. Patrón de URL de Google: com.googleusercontent.apps.803921065829-m34o26vcj57oirk1oa8pqve5o22qdihn Así que solo necesita comprobar si esta url comienza con com.googleusercontent.apps .

Basado en la explicación anterior, he generalizado en GoogleAuth y FacebookAuth utils class con algunos pequeños methods como cerrar session, verificar inicio de session …

Aquí están las Google Authentication Utils

 import Google class GoogleAuth { static func getInstance() -> GIDSignIn { return GIDSignIn.shanetworkingInstance() } static func isLogin() -> Bool { return getInstance().hasAuthInKeychain() } static func signOut() { getInstance().signOut() } static func isValidatedWithUrl(url: NSURL) -> Bool { return url.scheme.hasPrefix(NSBundle.mainBundle().bundleIdentifier!) || url.scheme.hasPrefix("com.googleusercontent.apps.") } } 

En segundo lugar, las Facebook Authentication Utils

 import FBSDKLoginKit class FacebookAuth { static func isLogin() -> Bool { return FBSDKAccessToken.currentAccessToken() != nil } static func signOut() { FBSDKLoginManager().logOut() } static func isValidatedWithUrl(url: NSURL) -> Bool { return url.scheme.hasPrefix("fb\(FBSDKSettings.appID())") && url.host == "authorize" } } 

Aquí está la parte principal. En AppDelegate , llama isValidateWithUrl método isValidateWithUrl para comprobar si esta url proviene de Google o Facebook.

 func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool { print("step 2 of OAuth2. Url: \(url)") // url from google if GoogleAuth.isValidatedWithUrl(url) { return GIDSignIn.shanetworkingInstance().handleURL( url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey]) } // url from facebook else if FacebookAuth.isValidatedWithUrl(url) { return FBSDKApplicationDelegate.shanetworkingInstance().application(application, openURL: url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String, annotation: options [UIApplicationOpenURLOptionsAnnotationKey]) } // application hasn't supported this url yet else { return false } } 

Espero que esto ayude 🙂