2009-12-31 32 views
22

Estoy tratando de utilizar Facebook Connect desde un iPhone webapp, por lo que tendría un aspecto similar a cómo se ve en una aplicación nativa para el iPhone que está utilizando el iPhone SDK de Facebook Connect.Cómo usar Facebook Connect en una aplicación web iPhone

El iPhone SDK obtiene la página de inicio de sesión agradable visitando:

http://www.facebook.com/login.php?fbconnect=1&connect_display=touch&api_key=<key>&next=fbconnect://success 

(ver http://github.com/facebook/facebook-iphone-sdk/blob/master/src/FBLoginDialog.m)

Dado que no quiero Safari para abrir, la única manera que veo para mostrar esta página es usando un iframe

Luego está el problema de detectar el éxito y el fracaso.

El SDK puede hacer esto simplemente usando el método de delegado webView:shouldStartLoadWithRequest: y comprobando fbconnect://success y fbconnect://cancel.

Hasta donde yo sé, la página principal no puede controlar la URL del iframe.

Podría abrir una conexión de Comet a un servidor desde la página principal y hacer que Facebook redirija a mi servidor, lo que luego notificaría a la página principal si había éxito. Pero no me gusta la idea de intruducir un componente de servidor en mi aplicación web solo por esto.

¿Alguien tiene alguna idea inteligente?

Editar: Esto es sobre una aplicación web , no es una aplicación nativa.

+0

¿Ha encontrado una solución para este problema? Tiene el mismo problema con OpenID y le interesaría ver qué se le ocurrió. ¡Gracias! – Cimm

+0

Estaba a punto de publicar este mismo problema exacto. No pensé en ponerlo en un iframe, esa es una gran idea. – steve

Respuesta

0

Parece que es posible que pueda lograr esto a través de OAuth 2.0. La documentación de Facebook es bastante delgada: hay una buena discusión al respecto en http://www.raywenderlich.com/1488/how-to-use-facebooks-new-graph-api-from-your-iphone-app

Esa publicación de blog trata sobre el uso de OAuth y la nueva Graph API dentro de una aplicación de iPhone, pero encontré que la discusión de OAuth es mejor que en cualquier otro lado. Es posible que pueda usar las URL y el flujo que analiza dentro de su aplicación web para lograr lo mismo.

1

OK por lo que sólo una pequeña prueba, pero traté de esto:

var iframe = $("<iframe src='http://google.com'></iframe"); 
$("body").append(iframe); 
$("body").find("iframe:last").attr("src"); // => http://google.com 

Y parece que ha funcionado bien. Tuve el mismo problema, así que voy a probar esta misma solución esta noche en mi aplicación. No quiero hacer un intervalo que compruebe constantemente el SRC, así que veré si puedo activar un evento en el cambio de ese SRC.

También una alternativa para tratar con Comet es WebSockets. Un servicio agradable y fácil de manejar es PusherApp (que ya estoy usando en mi aplicación de todos modos), así que si no puedo descubrir cómo desencadenar un evento una vez que cambie el atributo iframe SRC, probablemente solo presione un " auth_succeeded "evento para el cliente y manejarlo de esa manera.

Gracias por la idea de iframe. Me preguntaba cómo apoyaría FB Connect en una aplicación web de iPhone sin generar una ventana de Safari y eliminarlos de mi aplicación.

+0

El src del iframe no cambiará. –

-1

El uso de Sharekit es una buena opción hasta que simplemente quiera salir del problema. Como proporciona clases preparadas para ti. Simplemente llamando a los métodos sería suficiente, incluso para otros sitios de redes sociales, así como Twitter. Además, puede agregar sus métodos personalizados según su necesidad.

-1

También se puede usar cada redes sociales API de forma individual, o puede utilizar ShareKit

0

He hecho una aplicación web móvil, en iOS y Android, con toda la conectividad de Facebook. Por supuesto, todo estaba alojado en el servidor y no se implementó en el dispositivo iOS como una aplicación web.

La idea básica era: utilizar el FB Javascript SDK para cargar el diálogo de inicio/cierre de sesión, manejar el resultado en el servidor como "está conectado" (mostrar algo) vs. "no está conectado" mostrar mensaje de error o contenido no registrado.

En iFrames de referencia - que también me he hecho para aplicaciones de FB, pero no sobre lienzo en Web mobiel- enlazar a la URL de inicio de sesión como "_top" y entrantes, que vuelven a dirigir de nuevo en el marco flotante (darle un nombre) con varios datos signed_request. Entonces, sí, hay secuencias de comandos del servidor para manejar el estado de inicio/cierre de sesión (si eso es lo que se refería anteriormente).

1
To use facebook from your app just download FBConnect and drag and drop all files of FBConnect to your project.Make sure copy the files in project option is checked.After adding files make your .h file in which you have to share something like this 

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 
#import "Facebook.h" 
#import "FBConnect.h" 


@interface GameOverPage :CCLayer<FBSessionDelegate,FBDialogDelegate,FBLoginDialogDelegate,FBRequestDelegate> 
{ 

//for sharing 
    BOOL isFBLogged; 
    Facebook *facebook; 
} 


after this add following delegate methods to .m file.To use facebook just call [self facebookLogin]; 



- (void) facebookLogin 
{ 
// App ID 
// **************** 
//  
// App secret 
// ***************************** 

    if (facebook == nil) { 
     facebook = [[Facebook alloc] initWithAppId:@"**********************"]; 
     NSLog(@"reached in if facebook nill"); 
    } 


NSArray* permissions = [[NSArray arrayWithObjects: 
           @"publish_stream", @"offline_access", nil] retain]; 

    [facebook authorize:permissions delegate:self]; 

    // If you want to add Logout capability: 
    if (isFBLogged) { 
     NSLog(@"in isFBLogggged"); 
     [facebook logout:self]; 
    } 
    // } else { // then the code above inside the else 
} 
-(void) postdata 
{ 
    UIImage *facebookimage=[self takeScreenShot]; 
    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            facebookimage,@"message",         
            nil]; 

    [facebook requestWithGraphPath:@"me/photos" // use page ID instead of 'me' 
         andParams:params 
        andHttpMethod:@"POST" 
         andDelegate:self]; 
    NSLog(@"Uploading screenshot. Please wait..."); 
} 

- (void)fbDidLogin { 
    NSLog(@"in fbDidLogin"); 
    isFBLogged = YES; 
    [self postdata]; 

} 
-(void)fbDidNotLogin:(BOOL)cancelled { 
    if (cancelled) { 

     NSLog(@"LOGIN CANCELLED"); 
    } else { 
     NSLog(@"login error"); 

    } 

    //self.visible = YES; 
} 
- (void)fbDidLogout { 
    NSLog(@"in fbDidLogOut"); 
    isFBLogged = NO; 
    //-facebookLoginButton.visible = YES; 
    //-facebookLogoutButton.visible = NO; 
} 

#pragma mark - 
#pragma mark FBRequestDelegate 
/** 
* Called when the Facebook API request has returned a response. This callback 
* gives you access to the raw response. It's called before 
* (void)request:(FBRequest *)request didLoad:(id)result, 
* which is passed the parsed response object. 
*/ 
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response { 

} 

/** 
* Called when a request returns and its response has been parsed into 
* an object. The resulting object may be a dictionary, an array, a string, 
* or a number, depending on the format of the API response. If you need access 
* to the raw response, use: 
* 
* (void)request:(FBRequest *)request 
*  didReceiveResponse:(NSURLResponse *)response 
*/ 
- (void)request:(FBRequest *)request didLoad:(id)result { 


    NSLog(@"posted"); 
}; 

/** 
* Called when an error prevents the Facebook API request from completing 
* successfully. 
*/ 
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {  

    NSLog(@"an error occured"); 

}; 

#pragma mark - 
#pragma mark FBDialogDelegate 

/** 
* Called when a UIServer Dialog successfully return. 
*/ 
- (void)dialogDidComplete:(FBDialog *)dialog { 
    NSLog(@"publish successfully"); 
} 

you can override all delegate methods according to your requirement or leave the same way they are.This will work fine.You should have appid of facebook which you will get after registration on Facebook. 
Cuestiones relacionadas