gpt4 book ai didi

ios - FBSession.activeSession.isOpen 返回 NO 即使用户已登录

转载 作者:可可西里 更新时间:2023-11-01 03:25:39 24 4
gpt4 key购买 nike

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

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

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

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

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

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

所以现在我不知道如何重现或解决这个问题,有什么想法吗?应用程序启动后 token 是否可能过期?比如用户是否让应用在后台安静运行了很长时间?

最佳答案

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

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

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

在应用委托(delegate)中

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

这是一个快速修复并且有效,您也可以通过关闭 session 来重现它,但无需使用 [[FBSession activeSession] close] 清除 token 缓存您甚至可以更改 token 缓存策略如此处所述 http://developers.facebook.com/docs/howtos/token-caching-ios-sdk/

关于ios - FBSession.activeSession.isOpen 返回 NO 即使用户已登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15921269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com