Facebook iOS SDK 3.2.1 – : selector no reconocido enviado a instancia

Acabo de actualizar mi aplicación de Facebook iOS SDK 3.1 a 3.2.1 y estoy tratando de aprovechar el nuevo event handling errores proporcionado por la nueva categoría FBError en NSError. El código está en la parte inferior. Se comstack bien, pero cuando ocurre un error de FB, obtengo lo siguiente en time de ejecución:

- [NSError fberrorShouldNotifyUser]: unrecognized selector sent to instance 

Esto parece ser un error de linker, donde la categoría no se vincula desde la biblioteca estática FacebookSDK. Intenté agregar los indicadores -ObjC y -all_load debajo de los otros indicadores del linker en el objective. Leí esto: http://developer.apple.com/library/mac/#qa/qa1490/ pero aún no tuve suerte.

Básicamente, el mismo código funciona bien en los proyectos de muestra proporcionados por Facebook. Gracias por cualquier sugerencia.

 // Open the Facebook session. - (void)openSession { NSArray *permissions = [[NSArray alloc] initWithObjects:@"email", nil]; // Open or re-open the active session [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { [self sessionStateChanged:session state:state error:error]; }]; } - (void)handleAuthError:(NSError *)error{ NSString *alertMessage, *alertTitle; if (error.fberrorShouldNotifyUser) { // If the SDK has a message for the user, surface it. This conveniently // handles cases like password change or iOS6 app slider state. alertTitle = @"Something Went Wrong"; alertMessage = error.fberrorUserMessage; } else if (error.fberrorCategory == FBErrorCategoryAuthenticationReopenSession) { // It is important to handle session closures as mentioned. You can inspect // the error for more context but this sample generically notifies the user. alertTitle = @"Session Error"; alertMessage = @"Your current session is no longer valid. Please log in again."; } else if (error.fberrorCategory == FBErrorCategoryUserCancelled) { // The user has cancelled a login. You can inspect the error // for more context. For this sample, we will simply ignore it. NSLog(@"user cancelled login"); } else { // For simplicity, this sample treats other errors blindly, but you should // refer to https://developers.facebook.com/docs/technical-guides/iossdk/errors/ for more information. alertTitle = @"Unknown Error"; alertMessage = @"Error. Please try again later."; NSLog(@"Unexpected error:%@", error); } if (alertMessage) { [[[UIAlertView alloc] initWithTitle:alertTitle message:alertMessage delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } } // Handle Facebook session state changed - (void)sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error { if (error) { [self handleAuthError:error]; } else { switch (state) { case FBSessionStateOpen: [self onSessionOpen:session]; break; case FBSessionStateOpenTokenExtended: [self onSessionOpen:session]; break; case FBSessionStateClosedLoginFailed: [self onSessionClose:error]; break; case FBSessionStateClosed: // No-op // See: https://developers.facebook.com/docs/reference/ios/3.1/class/FBSession // Session is closed but token is still cached for later use. break; default: NSLog(@"sessionStateChanged: unknown state: %d", state); break; } } } 

ACTUALIZACIÓN: Un amigo me aconsejó que compruebe si el selector realmente existe en el binary vinculado. Seguí las instrucciones aquí para encontrar la location del binary de debugging en el buscador: ¿Dónde está mi aplicación binaria en XCode? Luego, presioné con el button derecho en MyApp.app y seleccioné "Mostrar contenido del package". Encontró el file binary (era el file más grande de la list), lo arrastró a Vim y buscó "fberrorShouldNotifyUser". No pude encontrar este selector o ninguno de los selectores FBError. También traté de borrar los datos derivados de XCode, aún sin suerte.

ACTUALIZACIÓN # 2: Uf, a veces te pierdes totalmente la respuesta obvia. Resulta que no tenía el indicador -ObjC correctamente configurado para mis comstackciones de debugging. Ver captura de pantalla:

Falta la bandera ObjC

Gracias a d.kendall por hacerme revisar esto nuevamente.

Debe agregar -ObjC a "otras banderas de linker" en la configuration de compilation de su proyecto.

¿Instaló el sdk 3.2.1 en un directory diferente (en lugar de sobrescribir el sdk 3.1)? Si es así, es posible que xcode está vinculando la versión anterior. ¿Puede confirmar la ruta del marco en xcode por:

  1. En el browser de proyectos en el que agregó el Marco de Facebook, haga clic con el button derecho en -> Mostrar en el Finder y verifique que abra la location de sdk 3.2.1; y,
  2. En la configuration de compilation de su objective, search "framework" y verificar las Rutas de búsqueda de Framework solo incluye la ruta sdk 3.2.1. Descubrí que puede recordar ubicaciones antiguas de framework y usar la ruta equivocada.