2009-12-31 5 views
22

Sto cercando di utilizzare Facebook Connect da un iPhone webapp, quindi sarebbe simile a come appare in un'applicazione iPhone nativa che sta utilizzando il Facebook Connect iPhone SDK.Come utilizzare Facebook Connect in un iPhone webapp

L'iPhone SDK ottiene la pagina di login bel visitando:

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

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

Dato che non voglio Safari per aprire, l'unico modo che vedo per mostrare questa pagina è usando un iframe.

Quindi c'è il problema di rilevare il successo e il fallimento.

L'SDK può eseguire questa operazione semplicemente utilizzando il metodo delegato webView:shouldStartLoadWithRequest: e controllando per fbconnect://success e fbconnect://cancel.

Per quanto ne so, la pagina padre non può monitorare l'URL dell'iframe.

Potrei aprire una connessione Comet a un server dalla pagina padre e reindirizzare Facebook al mio server, che quindi notificherà la pagina padre in caso di successo. Ma non mi piace l'idea di intromettermi un componente server nella mia webapp proprio per questo.

Qualcuno ha qualche idea intelligente?

Modifica: Si tratta di un'applicazione web , non di un'app nativa.

+0

Hai trovato una soluzione per questo problema? Avere lo stesso problema con OpenID e sarebbe interessato a vedere cosa ti è venuto in mente. Grazie! – Cimm

+0

In realtà stavo per pubblicare questo stesso identico problema. Non ho pensato di metterlo in un iframe: è una grande idea. – steve

risposta

0

Sembra che tu possa essere in grado di farlo tramite OAuth 2.0. La documentazione di Facebook è piuttosto sottile - c'è una bella discussione su http://www.raywenderlich.com/1488/how-to-use-facebooks-new-graph-api-from-your-iphone-app

Quel post del blog parla dell'utilizzo di OAuth e della nuova API Graph all'interno di un'app per iPhone, ma ho trovato che la discussione di OAuth è migliore che altrove. Potresti essere in grado di utilizzare gli URL e il flusso che discute all'interno della tua webapp per ottenere lo stesso risultato.

1

OK quindi basta un piccolo test, ma ho provato questo fuori:

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

E sembrava funzionare bene. Ho avuto questo stesso problema quindi ho intenzione di provare questa stessa soluzione stasera nella mia app. Non voglio fare un intervallo che controlli costantemente l'SRC, quindi vedrò se posso attivare un evento al cambio di quello SRC.

Un'altra alternativa al trattamento con Comet è WebSockets. Un servizio piacevole, facile da gestire è il PusherApp (che sto già utilizzando nella mia app), quindi se non riesco a capire come attivare un evento una volta cambiato l'attributo SRC dell'iframe, probabilmente spingerò un " auth_succeeded "evento al client e gestirlo in questo modo.

Grazie per l'idea dell'iframe. Mi chiedevo come potrei supportare FB Connect in una webapp per iPhone senza generare una finestra di Safari e portarli fuori dalla mia app.

+0

La src dell'iframe non cambierà. –

-1

L'utilizzo di Sharekit è una buona opzione finché non si vuole uscire dal problema. Dato che fornisce lezioni già pronte per te. La semplice chiamata di metodi sarebbe sufficiente anche per altri siti di social network come Twitter. Inoltre, puoi aggiungere i tuoi metodi personalizzati ad esso secondo le tue necessità.

-1

È possibile utilizzare ogni social network API singolarmente, oppure è possibile utilizzare ShareKit

0

Ho fatto un web app mobile su iOS e Android, con tutta la connettività di Facebook. Certo, era tutto ospitato sul server e non distribuito sul dispositivo iOS come app web.

L'idea di base era: utilizzare l'SDK Javascript FB per caricare la finestra di dialogo per il login/logout, gestire il risultato sul server come "è loggato" o contenuto non registrato.

In iFrame di riferimento - che ho anche fatto per le app FB, ma su tela non in Mobiel Web - si collega all'url di accesso come "_top", e in entrata, si reindirizza nuovamente all'iFrame (assegnarlo un nome) con vari dati firmati_risultati. Quindi sì, c'è lo scripting del server lì per gestire lo stato di accesso/disconnessione (se è quello a cui ti riferivi sopra).

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.