Ios FBSession.activeSession.isOpen即使用户登录也返回NO

Ios FBSession.activeSession.isOpen即使用户登录也返回NO,ios,objective-c,facebook,facebook-ios-sdk,Ios,Objective C,Facebook,Facebook Ios Sdk,我在一款iOS游戏中实现了整个iOS Facebook登录过程。 在该应用程序中,您可以使用电子邮件帐户或通过Facebook登录。我偶尔会提出一个观点,邀请用户在使用电子邮件登录时将其帐户与Facebook同步 下面是我用来确定是否应该向用户显示此视图的代码: if (FBSession.activeSession.isOpen) { // Present the view } else { // Go somewhere else } 起初,它似乎工作得很好,但事实证明,F

我在一款iOS游戏中实现了整个iOS Facebook登录过程。 在该应用程序中,您可以使用电子邮件帐户或通过Facebook登录。我偶尔会提出一个观点,邀请用户在使用电子邮件登录时将其帐户与Facebook同步

下面是我用来确定是否应该向用户显示此视图的代码:

if (FBSession.activeSession.isOpen) {
    // Present the view
} else {
    // Go somewhere else
}
起初,它似乎工作得很好,但事实证明,FBSession.activeSession.isOpen在某些时候返回NO,即使用户使用FB登录

我的第一个猜测是accessToken过期了。我不确定这是否是一个好的线索,因为我在我的应用程序中正在执行以下操作:didfishlaunchingwithoptions:method(就像Facebook推荐的那样):


所以现在我不知道如何复制或修复这个问题,有什么想法吗?应用程序启动后令牌是否可能过期?比如,如果用户将应用程序在后台静置很长时间?

这只是一种facebook行为,每次启动应用程序时,你都需要“重新打开”会话,你的猜测是对的,这是因为令牌状态,一个简单的解决方案是检查[FBSession activeSession].isOpen状态,如果它不返回调用openActiveSessionWithAllowLoginUI hie,我也面临同样的问题,但在我的情况下,当我再次启动应用程序时,我得到的会话为零。我也尝试创建新的会话并打开它,但它不起作用。确实完美地解决了我的问题!在iOS FacebookSDK中,
checkSessionState:state
中的
FBState
更改为
FBSessionState
。找不到SDK版本号,当前实际版本号为3.13。
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
    // Yes, so just open the session (this won't display any UX).
    [self openSessionWithCompletionBlock:^{}];
}
if (![FBSession activeSession].isOpen) {
   [self connectWithFacebook];
}

- (void) connectWithFacebook { 
       // The user has initiated a login, so call the openSession method
       // and show the login UI if necessary << Only if user has never 
       // logged in or ir requesting new permissions.
       PPAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
       [appDelegate openSessionWithAllowLoginUI:YES];
}
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
    NSArray *permissions = @[@"any_READ_permision_you_may_need"];

    return [FBSession openActiveSessionWithReadPermissions:permissions
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
                                              if (error) {
                                                  NSLog (@"Handle error %@", error.localizedDescription);
                                              } else {
                                                  [self checkSessionState:state];
                                              }
                                         }];
}

- (void) checkSessionState:(FBState)state {
    switch (state) {
        case FBSessionStateOpen:
            break;
        case FBSessionStateCreated:
            break;
        case FBSessionStateCreatedOpening:
            break;
        case FBSessionStateCreatedTokenLoaded:
            break;
        case FBSessionStateOpenTokenExtended:
            // I think this is the state that is calling
            break;
        case FBSessionStateClosed:
            break;
        case FBSessionStateClosedLoginFailed:
            break;
        default:
            break;
    }
}