2011-08-17 16 views
8

Sto utilizzando FBConnect sdk per pubblicare post sul profilo di un utente tramite la mia applicazione. Sto avendo un certo numero di problemi con questo:Problemi dell'SDBC FBConnect di Facebook su iOS

Quando il codice rilevante viene eseguito per la prima volta sul dispositivo, l'utente viene reindirizzato, come desiderato, all'app/sito web di Facebook, che gli chiede di autorizzare esso. se l'utente lo autorizza, ritorna all'applicazione, che apre un controller di visualizzazione "Connetti a Facebook" che chiede all'utente di accedere. questo è strano, poiché l'utente è già loggato, altrimenti come potrebbe autorizzare l'app ? ma immagino che questo possa essere ok, dato che non ha ancora effettuato il login attraverso l'app. dopo aver effettuato l'accesso, non fa nulla. solo la seconda volta che il codice viene eseguito, dopo che ha autorizzato l'app, l'utente ottiene la finestra di dialogo relativa alla pubblicazione.

Se l'utente non ha autorizzato l'app, quando torna alla mia app dopo la finestra di dialogo di autorizzazione, chiede all'utente di effettuare il login (come se fosse autorizzato), e non fa nulla dopo aver effettuato l'accesso. la seconda volta che viene eseguito il codice, viene visualizzata la finestra di dialogo di autorizzazione con gli optinos "Autorizza" & "Lascia App", invece di "Autorizza" & "Non autorizzare"/"Permetti" & "Non consentire".

Inoltre, se l'utente ha cancellato la sua autorizzazione tramite le impostazioni del suo account su Facebook, anziché semplicemente chiedergli di re-autorizzarlo, appare una finestra di dialogo di Facebook (invece della finestra di dialogo post/autorizzazione), che dice: "Un Si è verificato un errore. Riprova più tardi. " Provare più tardi non aiuta. scatterà sempre, anche se riavvii l'app. l'unico modo per farla sparire è reinstallare l'app, che farà in modo che venga nuovamente visualizzata la finestra di dialogo dell'autorizzazione.

Così qui è quello che voglio raggiungere:

  1. Dopo che l'utente autorizza l'applicazione, che non avrebbe dovuto effettuare nuovamente il login.
  2. Dopo che l'utente autorizza l'applicazione, la finestra di dialogo di registrazione si aprirà immediatamente, senza che egli debba rieseguire il codice (che viene attivato, btw, con un pulsante).
  3. Se l'utente non-autorizza l'applicazione, che verrà richiesto di nuovo con la finestra di dialogo di autorizzazione, invece di dialogo
  4. l'errore se ha rifiutato l'autorizzazione, chiamerò una funzione che visualizza un errore/etc.

Ecco il codice rilevante:

MyViewController.m

- (void)shareOnFacebook 
{ 
    Facebook *facebook = [[Facebook alloc] initWithAppId:myAppID]; 
    [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] setFacebook:facebook]; 
    [facebook release]; 
    facebook = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] facebook]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 
    if (![facebook isSessionValid]) { 
     [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]]; 
    } 

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    //Giving the dictionary some parameters for posting defaults 
    [facebook dialog:@"feed" andParams:dictionary andDelegate:self]; //Note: we have 2 different delegates! appDelegate for connections & url switching, and self for dialogs 
} 

MyAppDelegate.h

@interface MyAppDelegate : NSObject <UIApplicationDelegate, FBSessionDelegate, FBDialogDelegate> 
{ 
    Facebook *facebook; // kept for facebook sharing, accessed only from MyViewController although delegate methods are handeled in here 
} 
@property (nonatomic, retain) Facebook *facebook; 

@end 

MyAppDelegate.m

- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
} 

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

È possibile che manchi un paio di funzioni delegate su MyViewController? Perché vedo che per qualche motivo l'ho contrassegnato come implementazione del protocollo FBDialogDelegate, sebbene non implementi alcuna funzione da lì.

Sarei davvero felice se voi ragazzi mi aiutaste, perché questo è estremamente frustrante per me. Non ho trovato nulla su questo su internet, e mi sembra di affogare qui.

Tnx in anticipo!

+0

Probabilmente non è la risposta alla tua domanda, ma mi sembra che un problema che potresti avere sia l'istanza di Facebook che viene ricreata su ogni condivisione. Dalla documentazione sembra che l'istanza di Facebook venga generalmente aggiunta a AppDelegate e mai riassegnata quando l'app è in esecuzione. Forse leggi questo codice che ho scritto per un progetto su cui sto lavorando, potrebbe essere più facile risolvere i tuoi problemi (non è ancora perfetto, ma sembra funzionare bene per quanto riguarda la condivisione): http://stackoverflow.com/questions/7085162/facebook-connect-class-con-singleton-access-token-issue/7085809 # 7085809 –

risposta

8

Primo:

[facebook authorize:[NSArray arrayWithObjects:@"publish_stream",@"offline_access",nil] delegate:self]; 

La chiave offline_access qui non mancherà di tenere vivo il token di autenticazione sempre (o, più precisamente, fino a quando l'utente manualmente de-autorizza l'applicazione nei loro impostazioni delle applicazioni nel loro Facebook impostazioni dell 'account). Inoltre, imposta il tuo VC attivo come delegato (ne parleremo più avanti).

In secondo luogo:

-(void)popUserShareFeed { 
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    //Giving the dictionary some parameters for posting defaults 
    [facebook dialog:@"feed" andParams:dictionary andDelegate:self]; 
} 

chiamare questo metodo (o uno simile) nel metodo -fbDidLogin delegato. Anche chiamare nel vostro metodo originale se la sessione era ancora valida, vale a dire:

if (![facebook isSessionValid]) { 
     [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]]; 
} else { 
    [self popUserShareFeed]; 
} 

... e il vostro nuovo fbDidLogin:

- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
    [self popUserShareFeed]; 
} 

(Nota: dovrete definire questo in MyViewController.m e usalo come FBSessionDelegate. Sarà funzionalmente equivalente Il tuo AppDelegate non ha bisogno di essere anche il tuo FBSessionDelegate.

Terzo:

Implementare il metodo -fbDidNotLogin:(BOOL)cancelledFBSessionDelegate, in questo modo:

-(void)fbDidNotLogin:(BOOL)cancelled { 
    if (cancelled) { 
     ... some alert about the user cancelling... 
    } else { 
     ... some alert about how it failed for some reason... 
    } 
} 

In quarto luogo, per quanto i vostri errori Bizarro andare: A) gli SDK di Facebook, in generale, non sono grandi, e B) mi piacerebbe solo impostare il token di autenticazione e la data di scadenza sul facebook oggetto se

A) non ne hai già uno istanziato (vale a dire, è nil)

e

B) la data di scadenza impostata è futura (ad es. timeIntervalSinceNow [il metodo di istanza NSDate] richiamato restituisce> 0).

3

Sembra che tu abbia riscontrato lo stesso problema descritto in questo Facebook Platform Developer forum post. Sto incontrando lo stesso problema, ma sul web. Solo una risposta è stata data da Facebook in quel thread, ed è un'informazione sbagliata.

Facebook ha i peggiori documenti di sviluppo e supporto per gli sviluppatori di sempre, non terrei il fiato in attesa di una soluzione.

0

Ho integrato FBConnect in così tante applicazioni, ma non ho mai dovuto affrontare questo tipo di problema critico. Quindi, nel tuo codice mancherebbe qualcosa:

Installa controllo FBAccessTokenKey & FBExpirationDateKey, prova semplicemente con oggetto sessione della classe FBSession di FBConnect.

solo provare utilizzando il codice miniera con poche conidtions:

session = [[FBSession sessionForApplication:@"key" secret:@"AppSecretKey" delegate:self] retain]; 
     [session resume]; 
     _posting = YES; 

     // If we're not logged in, log in first... 
     if (![session isConnected]) { 
      loginDialog = nil; 
      loginDialog = [[FBLoginDialog alloc] init]; 
      [loginDialog show]; 
     } 
      // If we have a session and a name, post to the wall! 
      else if (_facebookName != nil) { 
         [self postToWall]; // Over here posting dialog will appear , if user has already logged in or session is running. 
        } 

     } 
     else { 
      [FBBtn setTitle:@"Login" forState:UIControlStateNormal]; // if you want to change the title of button 
      [session logout]; 
     } 

Inoltre prendersi cura di liberare l'oggetto di sessione in modo dealloc solo, invece di rilasciarlo in qualsiasi altro metodo.

- (void)dealloc { 
     [super dealloc]; 
     [session release]; 
     session = nil; 
    } 

Spero che possa risolvere il tuo problema.

+0

puoi fornire più codice/informazioni? Non ho potuto trovare questa classe. Tutto quello che ho ottenuto è Facebook, FBDialog, FBLoginDialog e FBRequest. – Niv

+2

@Niv Sta usando il vecchio Facebook SDK - FBConnect. Stai utilizzando il nuovo - SDK per iOS di Facebook. –

0

non è una soluzione diretta per i vostri problemi di codice, ma ...

Avere di considerare l'utilizzo di una libreria open-source per questo? ShareKit è un ottimo esempio: http://getsharekit.com. L'integrazione è semplice e fa tutto il necessario.

+1

Sto ricevendo questo errore da ShareKit stesso (questa pagina è stata una delle prime hit che ho avuto su Google, cercando di eseguire il debug di ShareKit). ShareKit è terribile - la somma totale dei documenti per Facebook dice "non c'è nessuna configurazione per Facebook", che è palesemente falso. Consiglierei di evitarlo - Sto per tornare all'SDK di FB iOS perché ShareKit è così terribilmente cattivo. – Adam

0

ho avuto lo stesso problema esatto, e utilizzati risposta di Ben Mosher sopra, ma ho anche deciso di creare una classe Singleton semplice per l'oggetto di Facebook, in modo che nel mio AppDelegate posso gestire la seguente funzione correttamente:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 

    return [[[FBManager defaultManager] facebook] handleOpenURL:url]; 

    //return [facebook handleOpenURL:url]; 
} 

La mia classe singleton è sia FBSessionDelegate sia FBDialogDelegate, quindi gestisce i metodi corrispondenti.

Questo mi consente di chiedere all'utente di effettuare il login solo quando sta effettivamente tentando di pubblicare qualcosa, invece di quando l'app viene avviata.

1

Avevo lo stesso problema, ma non lo stesso: messaggio "Si è verificato un errore. Riprova più tardi." è stato mostrato sempre.

Il problema era con ID app non configurato correttamente - è stato fornito dal cliente (quindi non sono sicuro di cosa fosse esattamente sbagliato); tutto funziona correttamente da quando l'ho sostituito con il mio ID app di test (dall'app precedente).

Problemi correlati