即使用户已登录,FBSession.activeSession.isOpen也会返回NO

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

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

if (FBSession.activeSession.isOpen) { // Present the view } else { // Go somewhere else } 

起初它似乎工作得很好,但事实certificate,即使用户使用FB登录,FBSession.activeSession.isOpen在某些时候返回NO。

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

 if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) { // Yes, so just open the session (this won't display any UX). [self openSessionWithCompletionBlock:^{}]; } 

所以现在我不知道如何重现或解决这个问题,任何想法? 应用程序启动后令牌是否可能过期? 就像用户将应用程序保持在后台安静一段时间一样?

这只是一个facebook行为,你需要在每次启动应用程序时“重新打开”会话,你的猜测是正确的,这是因为令牌状态,一个简单的解决方案是你检查[FBSession activeSession] .isOpen状态和如果它返回NO,则调用openActiveSessionWithAllowLoginUI <<是同一个facebook方法,但检查它返回的所有状态。

如果会话先前已打开,那么它会使用存储的令牌重新打开会话,您不必担心登录UI,因为它在以前打开会话时不会再次显示。

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

这是一个快速修复并且它可以工作,您也可以通过关闭会话来重现它,但不使用[[FBSession activeSession] close]清除令牌缓存您甚至可以更改令牌缓存策略,如此处所述http://developers.facebook的.com /文档/的howtos /令牌缓存-IOS-SDK /

Interesting Posts