检查iOS Facebook SDK 3.0是否已登录

6

我正在使用iOS Facebook SDK 3.0。如何检查用户是否已经登录?

我尝试了下面的代码,但它并不总是能够正确地返回YES,即使我已经登录。有什么建议吗?

if (FBSession.activeSession.isOpen == YES)
{
  // post to wall else login
}

--编辑--

这是我如何打开Facebook会话:

NSArray *permissions = [[NSArray alloc] initWithObjects:
                        @"user_likes", 
                        @"read_stream",
                        @"publish_actions",
                        nil];
return [FBSession openActiveSessionWithPermissions:permissions
                                      allowLoginUI:allowLoginUI
                                 completionHandler:^(FBSession *session,
                                                     FBSessionState state,
                                                     NSError *error) {
                                     [self sessionStateChanged:session
                                                         state:state
                                                         error:error];
                                 }];

第一次需要登录才能正常使用。如果我在已经登录的情况下尝试使用,则FBSession.activeSession.isOpen返回NO。
6个回答

13

您可以尝试打开一个不允许登录界面的新会话,以检查您是否拥有有效的令牌。

if (FBSession.activeSession.isOpen)
{
    // post to wall
} else {
    // try to open session with existing valid token
    NSArray *permissions = [[NSArray alloc] initWithObjects:
                            @"user_likes", 
                            @"read_stream",
                            @"publish_actions",
                            nil];
    FBSession *session = [[FBSession alloc] initWithPermissions:permissions];
    [FBSession setActiveSession:session];
    if([FBSession openActiveSessionWithAllowLoginUI:NO]) {
        // post to wall
    } else {
        // you need to log the user
    }
}

每次都要求我进行身份验证。如何强制SDK保留授权令牌?权限与应用程序匹配,但FBSessionStateCreatedTokenLoaded是状态。 - Oh Danny Boy
这个答案不起作用,并且存在系统帐户与通过Facebook应用程序或UIWebView获得的令牌之间的问题。 - jjxtra
@PsychoDad 这个问题是关于 Facebook sdk 3.0 的。 - Moxy

10
如果您正在使用大于4.x版本的FBSDK,则不存在FBSession概念。您只需使用[FBSDKAccessToken currentAccessToken]查找活动会话,然后检查它是否具有nil值,如果没有活动会话,则为否。
相反,您应该在viewDidLoad或类似位置检查[FBSDKAccessToken currentAccessToken]。如果当前有可用的token,则执行登录后的工作。您还可以使用currentAccessToken来检索缓存的令牌。
更多信息请参见https://developers.facebook.com/docs/ios/upgrading-4.x FBSession.activeSession已被[FBSDKAccessToken currentAccessToken]FBSDKLoginManager替换。不存在session state的概念。相反,使用管理器进行登录,这将设置currentAccessToken引用。

9
我按照Facebook的示例进行了操作。
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded)
{

}

1
我对此并不确定。session.state 现在似乎是一个位掩码。你还可以拥有 FBSessionStateOpenTokenExtended 状态。有一条关于会话状态打开位的注释:打开会话状态表示用户已登录或缓存令牌可用。我认为 == 比较在所有情况下都不起作用。 - John

2

如果状态是FBSessionStateOpenFBSessionStateOpenTokenExtended,则会话处于活动状态。您可以使用以下函数检查用户是否已登录:

- (BOOL)isSessionOpen
{
    return FBSession.activeSession.state == FBSessionStateOpen || FBSession.activeSession.state == FBSessionStateOpenTokenExtended;
}

1
你是如何打开你的FBSession的?
如果你正在创建一个实例,请确保设置FBSession.activeSession。这是我的问题一段时间了。

0
    if ([FBSDKAccessToken currentAccessToken]) 
{
   NSLog(@"Already login");
    //[FBSession openActiveSessionWithAllowLoginUI: YES];
}

一般来说,如果答案能够解释为什么/如何工作,而不仅仅是提供一些代码,那么它们会更受欢迎。 - David Berry

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