presenteRequestsDialogModallyWithSession no funciona, pero da buen resultado

Cuando uso el webdialog para una solicitud de amigo, todo va bien, excepto que no se realiza ninguna solicitud ni nada. El código:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: facebookFriend.id, @"to", nil]; [FBWebDialogs presentRequestsDialogModallyWithSession:FBSession.activeSession message:NSLocalizedString(@"FB_FRIEND_INVITE_MESSAGE", @"Facebook friend invite message") title:NSLocalizedString(@"FB_FRIEND_INVITE_TITLE", @"Facebook friend invite title") parameters:params handler:^(FBWebDialogResult result, NSURL *resultURL, NSError *error) { }]; 

Este es el resultado que obtengo:

 fbconnect://success?request=xxxxxxxxxxxx&to%5B0%5D=xxxxxxxx 

¿Cómo puedo depurar lo que está mal?

Gracias por adelantado.

Ruud

Para SDK 3.2 o superior , tenemos la posibilidad de utilizar la clase FBWebDialogs que nos ayudará a mostrar una ventana emergente junto con la lista de amigos y elegir una o más de la lista para enviar la invitación.

Vamos a hacerlo paso a paso:

1) Descargue y configure SDK 3.2 o superior.

2) Primero configure su aplicación en Facebook siguiendo esta url.

3) Luego usa el código adjunto.

Código de muestra: (genera la solicitud de invitación de amigo)

 -(void)inviteFriends { if ([[FBSession activeSession] isOpen]) { NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:nil]; [FBWebDialogs presentRequestsDialogModallyWithSession:nil message:[self getInviteFriendMessage] title:nil parameters:params handler:^(FBWebDialogResult result, NSURL *resultURL, NSError *error) { if (error) { [self requestFailedWithError:error]; } else { if (result == FBWebDialogResultDialogNotCompleted) { [self requestFailedWithError:nil]; } else if([[resultURL description] hasPrefix:@"fbconnect://success?request="]) { // Facebook returns FBWebDialogResultDialogCompleted even user // presses "Cancel" button, so we differentiate it on the basis of // url value, since it returns "Request" when we ACTUALLY // completes Dialog [self requestSucceeded]; } else { // User Cancelled the dialog [self requestFailedWithError:nil]; } } } ]; } else { /* * open a new session with publish permission */ [FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObject:@"publish_stream"] defaultAudience:FBSessionDefaultAudienceFriends allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { if (!error && status == FBSessionStateOpen) { NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:nil]; [FBWebDialogs presentRequestsDialogModallyWithSession:nil message:[self getInviteFriendMessage] title:nil parameters:params handler:^(FBWebDialogResult result, NSURL *resultURL, NSError *error) { if (error) { [self requestFailedWithError:error]; } else { if (result == FBWebDialogResultDialogNotCompleted) { [self requestFailedWithError:nil]; } else if([[resultURL description] hasPrefix:@"fbconnect://success?request="]) { // Facebook returns FBWebDialogResultDialogCompleted even user // presses "Cancel" button, so we differentiate it on the basis of // url value, since it returns "Request" when we ACTUALLY // completes Dialog [self requestSucceeded]; } else { // User Cancelled the dialog [self requestFailedWithError:nil]; } } }]; } else { [self requestFailedWithError:error]; } }]; } } 

y aquí están las funciones auxiliares que llaman a los delegates a la función OnFBSuccess y OnFBFailed .

 - (void)requestSucceeded { NSLog(@"requestSucceeded"); id owner = [fbDelegate class]; SEL selector = NSSelectorFromString(@"OnFBSuccess"); NSMethodSignature *sig = [owner instanceMethodSignatureForSelector:selector]; _callback = [NSInvocation invocationWithMethodSignature:sig]; [_callback setTarget:owner]; [_callback setSelector:selector]; [_callback retain]; [_callback invokeWithTarget:fbDelegate]; } - (void)requestFailedWithError:(NSError *)error { NSLog(@"requestFailed"); id owner = [fbDelegate class]; SEL selector = NSSelectorFromString(@"OnFBFailed:"); NSMethodSignature *sig = [owner instanceMethodSignatureForSelector:selector]; _callback = [NSInvocation invocationWithMethodSignature:sig]; [_callback setTarget:owner]; [_callback setSelector:selector]; [_callback setArgument:&error atIndex:2]; [_callback retain]; [_callback invokeWithTarget:fbDelegate]; } 

Entonces, la clase que llama al método InviteFriend DEBE tener estas funciones:

 -(void)OnFBSuccess { CCLOG(@"successful"); // do stuff here [login release]; } -(void)OnFBFailed:(NSError *)error { if(error == nil) CCLOG(@"user cancelled"); else CCLOG(@"failed"); // do stuff here [login release]; } 

Lecturas recomendadas:

Enviar invitación a través de Facebook

Permisos API

Un ejemplo

NOTA:

1) No te olvides de configurar la identificación de la aplicación de Facebook en plist .

2) No olvide ajustar AppDelegate para manejar URL .

Fragmento parcial tomado del enlace de arriba en el punto 2:

 /* * If we have a valid session at the time of openURL call, we handle * Facebook transitions by passing the url argument to handleOpenURL */ - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // attempt to extract a token from the url return [FBSession.activeSession handleOpenURL:url]; } 

¡Espero eso ayude!

EDITAR

Aquí:

statement para fbDelegate es:

 @property (nonatomic, assign) id  fbDelegate; @protocol FBLoginDelegate  @required -(void) OnFBSuccess; -(void) OnFBFailed : (NSError *)error; @end 

y así es como puedes consumir este código:

 FBLoginHandler *login = [[FBLoginHandler alloc] initWithDelegate:self]; // here 'self' is the fbDelegate you have asked about [login inviteFriends]; 

Creo que su aplicación no está habilitada para Android y para la web. Y está tratando de recibir notificaciones en la web o en un dispositivo Android.

Puntos: para recibir notificaciones en Android o en la web, debes habilitar tu aplicación para Android y la web también.

Para habilitar Android y Web en su aplicación: Vaya a su aplicación> Configuración> Haga clic en + Agregar plataforma agregue la información necesaria y guarde.

Permite disfrutar de la notificación. 🙂