【问题标题】:facebook - problems with FBSessionState constantsfacebook - FBSessionState 常量的问题
【发布时间】:2014-09-01 17:00:13
【问题描述】:

我正在开发一个使用 Facebook 登录和分享的 iOS 应用。这需要检查各个地方的活动会话状态。

Facebook 提供的代码检查当前状态并决定是否打开一个新会话。然而,记录会话状态表明它可能是打开的,即使与 FBSessionState 常量的比较可能表明它已关闭。

例如,使用以下代码(facebook 的),即使我的会话状态记录为 1,它也不等于 FBSessionStateOpenFBSessionStateOpenTokenExtended,并打开了一个新会话。

NSLog(@"facebook session state: %lu", FBSession.activeSession.state);
// log shows 1

if (FBSession.activeSession.state == FBSessionStateOpen
    || FBSession.activeSession.state == FBSessionStateOpenTokenExtended) {

    NSLog(@"facebook session already open");
    // do stuff...

} else {
    // new session opened anyway
    NSLog(@"open new facebook session");
    /* code to open a session omitted here
    ...
    */
}

尽管常量定义显示1 = FBSessionStateOpen

FBSession.h:

typedef NS_ENUM(NSUInteger, FBSessionState) {
/*! One of two initial states indicating that no valid cached token was found */
FBSessionStateCreated                   = 0,
/*! One of two initial session states indicating that a cached token was loaded;
 when a session is in this state, a call to open* will result in an open session,
 without UX or app-switching*/
FBSessionStateCreatedTokenLoaded        = 1,
/*! One of three pre-open session states indicating that an attempt to open the session
 is underway*/
FBSessionStateCreatedOpening            = 2,

/*! Open session state indicating user has logged in or a cached token is available */
FBSessionStateOpen                      = 1 | FB_SESSIONSTATEOPENBIT,
/*! Open session state indicating token has been extended, or the user has granted additional permissions */
FBSessionStateOpenTokenExtended         = 2 | FB_SESSIONSTATEOPENBIT,

/*! Closed session state indicating that a login attempt failed */
FBSessionStateClosedLoginFailed         = 1 | FB_SESSIONSTATETERMINALBIT, // NSError obj w/more info
/*! Closed session state indicating that the session was closed, but the users token
 remains cached on the device for later use */
FBSessionStateClosed                    = 2 | FB_SESSIONSTATETERMINALBIT, // "
};

这是一个错误还是出于某种原因,facebook 的代码应该真正打开一个新会话?我应该与状态的int 值而不是常量进行比较吗?为什么记录的值会与常数不一致?

...此外,记录状态状态重新打开后,它记录为 513 或 514,这与任何常量不符。

【问题讨论】:

    标签: ios facebook


    【解决方案1】:

    根据常量的typedef枚举,1的状态为FBSessionStateCreatedTokenLoaded。评论说“两种初始会话状态之一,表明已加载缓存令牌;当会话处于此状态时,对 open* 的调用将导致打开会话,而无需 UX 或应用程序切换”。

    所以我接受了这个建议,解决方案运行良好,会话在没有 UX 或应用切换的情况下打开:

        if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
            NSLog(@"fb session state created token loaded.");
            [FBSession.activeSession openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                if (FBSession.activeSession.state == FBSessionStateOpen) {
                    // do stuff
                }
            }];
        }
        else if (FBSession.activeSession.state == FBSessionStateOpen
            || FBSession.activeSession.state == FBSessionStateOpenTokenExtended) {
            NSLog(@"fb session already open");
            // do stuff
    
        } else {
            NSLog(@"open new facebook session");
            // open new session...
        }
    

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多