Ios FBSession.activeSession.isOpen即使用户登录也返回NO
我在一款iOS游戏中实现了整个iOS Facebook登录过程。 在该应用程序中,您可以使用电子邮件帐户或通过Facebook登录。我偶尔会提出一个观点,邀请用户在使用电子邮件登录时将其帐户与Facebook同步 下面是我用来确定是否应该向用户显示此视图的代码: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
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;
}
}