2012-03-19 12 views
6

AGGIORNAMENTO: Mi sono reso conto che il problema riportato di seguito si verifica solo se l'utente ha già concesso l'accesso a Facebook alla mia app e quindi reinstalla la mia app. La prima volta che l'utente seleziona il pulsante Facebook nella mia app, passa all'app Facebook per ottenere l'autenticazione, ma poiché lo stato di autenticazione è ancora salvato nell'app Facebook, torna immediatamente alla mia app senza fornire alcuna spiegazione all'utente e il metodo postToFacebookWall fallisce.Facebook SDK Accesso iOS con app Facebook installata

UPDATE 2: Ho finito per implementare la soluzione trovata qui: How to authorize user through a DIALOG with the NEW Facebook Connect iOS API? ed evitato l'app di Facebook. Safari è migliore perché almeno l'utente riceve un messaggio che comunica che effettuerà l'accesso. Tuttavia, la finestra di dialogo Feed fallisce ancora la prima volta.


Sto avendo quello che deve essere un problema comune, ma non sono stato ancora in grado di trovare la soluzione. Tieni presente che la mia app è limitata a iOS 5 e versioni successive.

Ho un'app con un pulsante di Facebook per la pubblicazione su un muro di utenti. Quando il pulsante viene premuto, l'app controllerà se l'utente ha già dato il permesso all'app di postare sul muro. Se lo hanno, una vista si apre con una finestra di dialogo Feed con le informazioni sul wall post. In caso contrario, Safari verrà aperto e l'utente potrà accedere. Dopo l'accesso verranno riportati all'app e verrà visualizzata la finestra di dialogo Feed.

Questo funziona sul simulatore e sul mio dispositivo, se l'app di Facebook non è installata. Se l'app Facebook è installata, l'utente viene indirizzato all'app Facebook, ma poi torna immediatamente all'app originale, senza consentire all'utente di fare nulla. Viene visualizzata la finestra di dialogo Feed, ma è completamente vuota e si chiude automaticamente. Premendo di nuovo il pulsante Facebook si aprirà la finestra di dialogo Feed come dovrebbe, una volta che l'utente ha dato il permesso all'app di postare sulla loro bacheca.

Ho praticamente seguito le istruzioni trovate qui: http://developers.facebook.com/docs/mobile/ios/build/#implementsso

e qui: http://developers.facebook.com/docs/reference/dialogs/feed/

Nel AppDelegate ho il seguente codice:

- (void)loginToFacebook 
{ 
    // Set up facebook 
    self.facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if ([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     self.facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     self.facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 

    if (![self.facebook isSessionValid]) { 
     [self.facebook authorize:nil]; 
    } 
} 

// This is an FBSessionDelegate protocol method 
// that gets called after a successful login 
- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"POST_TO_FACEBOOK_WALL" object:nil]; 
} 

// This is a UIApplicationDelegate protocol method 
// It is called when safari is dismissed 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

L'unica differenza tra questo e il codice di esempio è che ho aggiunto una NSNotification che viene rilevata dal mio controller di visualizzazione, dove ho il seguente codice:

- (void)facebookButtonPressed:(UIControl*)sender 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     if (![facebook isSessionValid]) 
     { 
      // Login to facebook if not already logged in 
      [(AppDelegate*)[[UIApplication sharedApplication] delegate] loginToFacebook]; 
     } 
     else 
     { 
      [self postToFacebookWall]; 
     } 

    } 

    - (void)postToFacebookWall 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     /*Facebook Application ID*/ 
     // TODO: Get this either from the AppDelegate facebook property or the info plist 
     NSString *client_id = @"YOUR_APP_ID"; 

     NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    kAppId, @"app_id", 
    @"http://developers.facebook.com/docs/reference/dialogs/", @"link", 
    @"http://fbrell.com/f8.jpg", @"picture", 
    @"Facebook Dialogs", @"name", 
    @"Reference Documentation", @"caption", 
    @"Using Dialogs to interact with users.", @"description", 
    nil]; 

     [facebook dialog:@"feed" andParams:params andDelegate:self]; 
    } 

Qualcuno sa come risolvere il problema? (Inoltre, nel caso in cui non sia chiaro, YOUR_APP_ID viene sostituito con il mio ID app nel mio codice).

risposta

3

Questo sembra un out-case in quanto è questo scenario di 'solo quando l'app è stata installata, autenticata, quindi disinstallata, quindi reinstallata'.

Dovresti essere in grado di tornare alla "classica autenticazione web view" quando succede questa particolare cosa.

if (facebookAppDidNotReturnProperly) { 
    // therefore I must have been re-installed 
    // fallback to UIWebView 

    [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

Anche in questo caso, si potrebbe anche utilizzare auth safari suppongo.

+0

Che suona come potrebbe essere fattibile. Lo proverò. – Darren

Problemi correlati