Facebook显示登录对话框而不是应用请求对话框

时间:2014-06-11 08:16:10

标签: ios objective-c facebook

在我的应用程序中,我需要向用户提供Facebook AppRequest对话框。我是这样做的:

 NSMutableDictionary* params =
[NSMutableDictionary dictionaryWithObject:friendId forKey:@"to"];

[FBWebDialogs presentRequestsDialogModallyWithSession:FBSession.activeSession
                                              message:NSLocalizedString(@"AppRequestMessage", "")
                                                title:NSLocalizedString(@"AppRequestTitle", "")
                                           parameters:params
                                              handler:^(FBWebDialogResult result, NSURL *url, NSError *error){

                                                  if (result == FBWebDialogResultDialogNotCompleted)
                                                  {
                                                      if (error)
                                                      [FRBaseViewController showAlertWithTitle:NSLocalizedString(@"AppRequestFail", "") message:error.localizedDescription];
                                                  }
                                                  else
                                                  {
                                                      if ([url.description rangeOfString:@"error"].location == NSNotFound)
                                                      {
                                                          if ([FRDataModel sharedInstance].shouldChallenge)
                                                              [[FRDataModel sharedInstance] finishedRatingFriend];
                                                      }
                                                  }

                                                  FRAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
                                                  FRNavigationController *navController = (FRNavigationController *)delegate.navigationController;
                                                  [(FRNavigationController *)navController pseudoPopToFrindViewController];
                                              }];

并且大部分时间它都可以正常工作。但有时候,当用户登录到应用程序时已经过了很长时间,它显示的不是AppRequest对话框,而是登录对话框。一旦用户注销并再次登录,它就会再次正常工作。我认为在某些时候Facebook SDK开始认为用户没有登录(尽管用户肯定已登录)或类似的东西。你见过这样的行为吗?你能告诉我什么吗?谢谢

3 个答案:

答案 0 :(得分:0)

你看过正在创建的会话,我的意思是检查[FBSession activeSession]。可能是当您的用户登录时,他们有会话并且只要他们使用该应用程序就会保持打开状态。一旦他们关闭并重新访问您的应用程序,他们的会话可能已经关闭,从而迫使他们再次登录?

你有什么尝试?我和FBSDK玩了很多,所以让我更详细地告诉你你尝试了什么/你的情况,我可以看到我的实施有什么不同。

THX

答案 1 :(得分:0)

这就是我打开Facebook会话的方式,通过这样做,它尝试Facebook登录,更喜欢系统帐户,并在必要时回退到快速应用程序切换。 WebView绝对是最后的选择。

// Initialize a session object
FBSession *session = [[FBSession alloc] init];

// Set the active session
[FBSession setActiveSession:session];

// Open the session
[session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
        completionHandler:^(FBSession *session,
                            FBSessionState status,
                            NSError *error) {

    // You're good to go
    //
    if (!error && FBSession.activeSession.isOpen) {

        // Retrieve Token
        //
        FBAccessTokenData *data = [FBSession.activeSession accessTokenData];
        NSString *accessToken = data.accessToken;

        if ([FRDataModel sharedInstance].shouldChallenge)
            [[FRDataModel sharedInstance] finishedRatingFriend];
    }
    else {
        [FRBaseViewController showAlertWithTitle:NSLocalizedString(@"AppRequestFail", "") message:error.localizedDescription];
    }

    FRAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    FRNavigationController *navController = (FRNavigationController *)delegate.navigationController;
    [(FRNavigationController *)navController pseudoPopToFrindViewController];
}];

官方文档here

答案 2 :(得分:0)

最终我找到了解决方案。这种行为的原因是缺少正确的Facebook工作所需的一些cookie。我不知道为什么他们有时会从NSHTTPCookieStorage消失,但只知道他们确实帮助了我很多。我做的是我为cookie提供了另一个存储空间。现在我每次更新cookie时都会更新存储。然后,我检查[NSHTTPCookieStorage sharedHTTPCookieStorage]是否包含所需的Cookie(其名称为c_userxs)。如果我没有从存储中取出这些Cookie并将其添加到[NSHTTPCookieStorage sharedHTTPCookieStorage]。它有效!