2012-10-03 42 views
6

He estado convirtiendo mi aplicación del antiguo SDK de Facebook en el nuevo Facebook SDK 3.1 para usar la funcionalidad nativa iOS6 y otras funcionalidades de Facebook, y estoy teniendo un problema eso sucede consistentemente en el simulador y rara vez en el dispositivo.El diálogo de inicio de sesión en Facebook no funciona en el simulador iOS6

Cuando inicio sesión en Facebook, en lugar de buscar y autenticar la aplicación a través de Safari o la aplicación de Facebook, aparece una ventana modal en la parte superior de mi aplicación para iniciar sesión (creo que esto comenzó con iOS6, incluso antes de cambiar a Facebook SDK 3.0/3.1). Esta ventana me permite ingresar el nombre de usuario y la contraseña, pero cuando hago clic en "Aceptar" en la esquina superior derecha para autenticar, no ocurre nada. No se produce ninguna devolución de llamada a la aplicación: openURL: sourceApplication: anotación: en AppDelegate.

Facebook Login

En mi código FacebookController compartida (que uso para múltiples proyectos), estoy de inicializar el FBSession al intentar autorizar según código de ejemplo de Facebook:

FBSession *session = [[FBSession alloc] initWithAppID:nil permissions:readPermissions defaultAudience:FBSessionDefaultAudienceNone urlSchemeSuffix:self.fbUrlSchemeSuffix tokenCacheStrategy:nil]; 

if(session.state == FBSessionStateCreated || session.state == FBSessionStateCreatedTokenLoaded) 
{ 
    [FBSession setActiveSession:session]; 

    // we open after the fact, in order to avoid overlapping close 
    // and open handler calls for blocks 
    [session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
... 

El código para la terminación controlador nunca se ejecuta a menos que haga clic en el botón x cancelar en el cuadro de diálogo (en cuyo caso me sale un error como se esperaba).

Estoy configurando FacebookAppID en mis propiedades de destino de iOS (info.plist) y tengo los Esquemas de URL configurados con fb ### [url_scheme_suffix] también.

La única diferencia que tengo entre mi código y el código de muestra de Facebook es que estoy usando sufijos de esquema de url ya que tengo una versión gratuita y de pago de nuestra aplicación.

Si la aplicación utiliza Safari para iniciar sesión, funciona con el código como se indica. Si cambia rápidamente a la aplicación de Facebook, también funciona. Además, funcionan las configuraciones de la cuenta Facebook ios6 compartida. La aplicación solo falla si usa el modal de la aplicación in.

¿Alguien más ha encontrado esto?

+0

¿Ha especificado el ID del paquete tanto en su aplicación como en la configuración de la aplicación de Facebook? –

+0

La identificación del paquete se establece en la configuración de la aplicación de Facebook (en realidad, hay dos juegos, ya que tenemos dos versiones de la aplicación), y el identificador del paquete se establece en la aplicación. –

+0

Solo asegúrese; en realidad, no está proporcionando 'nil' como ID de aplicación en' -initWithAppID: permisos ... '? –

Respuesta

1

Lo mismo me está sucediendo a mí. Solo ocurre en el simulador (iphone5 4 pulgadas, ios6), así que no sé si este problema estará presente en los dispositivos reales.

Después de un par de sesiones de depuración, encontré que el método webView: shouldStartLoadWithRequest: navigationType: de FBDialog no procesaba una url que llevaba el access_token. Cuando Facebook pasa el access_token, significa que estás autenticado. Entonces, pensé, había algo que faltaba allí.

Aquí es la forma de la URL que no está siendo procesada:

fb122222222222222: // autorizar/# señal_acceso = ... & expires_in = 5102464 & código = ..

Tenga en cuenta que el esquema url es la misma clave fb + API que ha configurado en el archivo Info.plist en su aplicación.

Esto es lo que hice para solucionar este problema.Tenga en cuenta que añade una nueva persona -si rama, en la que yo llamo el éxito de diálogo en caso de que tengamos el token de acceso:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
navigationType:(UIWebViewNavigationType)navigationType { 
    NSURL* url = request.URL; 

    if ([url.scheme isEqualToString:@"fbconnect"]) { 
     if ([[url.resourceSpecifier substringToIndex:8] isEqualToString:@"//cancel"]) { 
      NSString * errorCode = [self getStringFromUrl:[url absoluteString] needle:@"error_code="]; 
      NSString * errorStr = [self getStringFromUrl:[url absoluteString] needle:@"error_msg="]; 
      if (errorCode) { 
       NSDictionary * errorData = [NSDictionary dictionaryWithObject:errorStr forKey:@"error_msg"]; 
       NSError * error = [NSError errorWithDomain:@"facebookErrDomain" 
                 code:[errorCode intValue] 
                userInfo:errorData]; 
       [self dismissWithError:error animated:YES]; 
      } else { 
       [self dialogDidCancel:url]; 
      } 
     } else { 
      if (_frictionlessSettings.enabled) { 
       [self dialogSuccessHandleFrictionlessResponses:url]; 
      } 
      [self dialogDidSucceed:url]; 
     } 
     return NO; 
    } 
//THIS IS WHAT I'VE ADDED>>>> 
     else if ([[[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleURLTypes"] firstObject] objectForKey:@"CFBundleURLSchemes"] firstObject] isEqual:url.scheme]) 
     { 
      [self dialogDidSucceed:url]; 
      return NO; 
     } 
//<<<<< 
    else if ([_loadingURL isEqual:url]) { 
     return YES; 
    } else if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     if ([_delegate respondsToSelector:@selector(dialog:shouldOpenURLInExternalBrowser:)]) { 
      if (![_delegate dialog:self shouldOpenURLInExternalBrowser:url]) { 
       return NO; 
      } 
     } 

     [[UIApplication sharedApplication] openURL:request.URL]; 
     return NO; 
    } else { 
     return YES; 
    } 
} 

I es digno de mencionar que estoy siguiendo todas las pautas fb SDK (3.1) y No hice ningún otro cambio en el código src.

Con estos cambios, el proceso de inicio de sesión funciona como se esperaba.

Espero que esto ayude!

+0

¿Has abierto una solicitud de extracción o un informe de error en Facebook con respecto a esto? – yonix

+0

y gracias ... funcionó perfectamente para mí :) – yonix

+0

No, no abrí un informe de error. Siéntase libre de hacerlo si desea – Lio

Cuestiones relacionadas