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

3

在我的应用程序中,我需要向用户展示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];
                                              }];

大部分时间,它都能正常运行。但是有时,当用户长时间未登录应用时,它会显示登录对话框而不是应用请求对话框。只要用户注销并重新登录,它就可以正常工作。我想,在某个时候,Facebook SDK 开始认为用户没有登录(尽管用户确实已经登录),或者类似于这样的情况。您是否见过这种行为?请给我一些建议好吗?谢谢。


安德烈,你在发送请求之前检查会话是否已打开了吗?此外,你必须在某个地方处理会话状态的更改,因为它可能会过期。 - kelin
3个回答

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

官方文档在这里


0
最终我找到了解决方法。这种行为的原因是一些用于正确运行 Facebook 的 cookie 丢失了。我不知道它们为什么有时会从`NSHTTPCookieStorage`中消失,但只要知道它们确实会消失,这对我很有帮助。我的解决方法是提供另一个存储 cookie 的位置。现在,每次更新 cookie 时,我都会更新存储。然后,我检查`[NSHTTPCookieStorage sharedHTTPCookieStorage]`是否包含所需的 cookie(它们的名称是`c_user`和`xs`)。如果没有,我就从我的存储中获取这些 cookie 并将它们添加到`[NSHTTPCookieStorage sharedHTTPCookieStorage]`中。这个方法起作用了!

0

你有没有查看正在创建的会话,我的意思是检查 [FBSession activeSession]。当用户登录时,他们可能已经拥有一个会话,并且在使用应用的整个过程中会一直保持打开状态。一旦他们关闭它并重新访问您的应用程序,他们的会话可能已经被关闭,因此迫使他们再次登录?

你尝试了什么?我已经与 FBSDK 进行了很多尝试,所以让我知道你尝试了什么/你的情况更详细,我可以看到与我的实现有何不同。

谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接