Login no iOS SDK do Facebook com o aplicativo do Facebook instalado

UPDATE: percebi que o problema abaixo só ocorre se o usuário já tiver dado acesso ao Facebook ao meu aplicativo e depois o restabelecer. Na primeira vez em que o usuário seleciona o botão do Facebook no meu aplicativo, ele acessa o aplicativo do Facebook para obter autenticação, mas como o status de autenticação ainda é salvo no aplicativo do Facebook, ele retorna imediatamente para o meu aplicativo sem explicação para o usuário e o O método postToFacebookWall falha.

UPDATE 2: acabei implementando a solução encontrada aqui:Como autorizar o usuário por meio de um DIALOG com a NOVA API para iOS do Facebook Connect? e evitou o aplicativo do Facebook. O Safari é melhor porque pelo menos o usuário recebe uma mensagem informando que fará login. No entanto, o Feed Dialogue ainda falha na primeira vez como antes.

Estou tendo o que deve ser um problema comum, mas ainda não consegui encontrar a solução. Observe que meu aplicativo está restrito ao iOS 5 e superior.

Tenho um aplicativo com um botão do Facebook para postar no mural de usuários. Quando o botão é pressionado, o aplicativo verifica se o usuário já deu permissão ao aplicativo para publicar no mural. Se tiverem, uma exibição será exibida com um diálogo de alimentação com as informações de postagem no mural. Caso contrário, o Safari será aberto e o usuário poderá fazer login. Após o login, eles serão levados de volta ao aplicativo e a exibição da caixa de diálogo Feed será exibid

Isso funciona no simulador e no meu dispositivo, se o aplicativo do Facebook não estiver instalado. Se o aplicativo do Facebook estiver instalado, o usuário será levado para o aplicativo do Facebook, mas retornará imediatamente ao aplicativo original, sem permitir que o usuário faça nada. A caixa de diálogo Feed é exibida, mas fica completamente em branco e é descartada automaticamente. Pressionar o botão do Facebook novamente exibirá a visualização da caixa de diálogo Feed, como deveria, assim que o usuário tiver dado permissão ao aplicativo para postar em seu mura

Eu praticamente segui as instruções encontradas aqui:http: //developers.facebook.com/docs/mobile/ios/build/#implementss

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

No AppDelegate, tenho o seguinte código:

- (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]; 
}

A única diferença entre esse e o código de exemplo é que eu adicionei uma NSNotification que é captada pelo meu controlador de exibição, onde tenho o seguinte código:

    - (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];
    }

Alguém sabe como corrigir meu problema? (Além disso, caso não esteja claro, YOUR_APP_ID é substituído pelo código do meu aplicativo no meu código).

questionAnswers(4)

yourAnswerToTheQuestion